{"record":{"id":"55222d80212b82d7","repo":"jdx/mise","slug":"brew-cask-token-homebrew-metadata-exists-with-m","errorCode":null,"errorMessage":"brew-cask:{token}: Homebrew metadata exists with multiple Caskroom versions ({}); repair it with Homebrew","messagePattern":"brew-cask:(.+?): Homebrew metadata exists with multiple Caskroom versions \\((.+?)\\); repair it with Homebrew","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/system/packages/brew/cask/state.rs","lineNumber":83,"sourceCode":"        if file_type.is_dir() && name != \".metadata\" && !name.starts_with(\".mise-\") {\n            versions.push(name);\n        }\n    }\n    Ok(versions)\n}\n\npub(super) fn homebrew_installed_version(token: &str) -> Result<Option<String>> {\n    if !homebrew_metadata_present(token)? {\n        return Ok(None);\n    }\n\n    let versions = homebrew_installed_versions(token)?;\n    match versions.as_slice() {\n        [version] => Ok(Some(version.clone())),\n        [] => bail!(\n            \"brew-cask:{token}: Homebrew metadata exists, but no installed Caskroom version was found; repair it with `brew reinstall --cask {token}`\"\n        ),\n        versions => bail!(\n            \"brew-cask:{token}: Homebrew metadata exists with multiple Caskroom versions ({}); repair it with Homebrew\",\n            {\n                let mut versions = versions.to_vec();\n                versions.sort();\n                versions.join(\", \")\n            }\n        ),\n    }\n}\n\npub(super) fn ensure_homebrew_did_not_take_ownership(token: &str, stage: &Path) -> Result<()> {\n    let metadata_present = match homebrew_metadata_present(token) {\n        Ok(present) => present,\n        Err(err) => {\n            file::remove_all(stage).wrap_err_with(|| {\n                format!(\n                    \"failed to remove mise stage after Homebrew ownership check failed: {err:#}\"\n                )","sourceCodeStart":65,"sourceCodeEnd":101,"githubUrl":"https://github.com/jdx/mise/blob/afd2eddd3a50c16190efc1c7e94404b48f72af57/src/system/packages/brew/cask/state.rs#L65-L101","documentation":"homebrew_installed_version requires exactly one installed Caskroom version per token. When Homebrew metadata exists but multiple version directories are present in the Caskroom, the version is ambiguous, so mise bails with the sorted version list and directs the user to Homebrew for repair.","triggerScenarios":"homebrew_installed_versions(token) returns more than one entry while Homebrew metadata exists — the match arm falls through to `versions => bail!(...)`.","commonSituations":"Homebrew upgrade failed midway leaving old and new cask version directories; `brew cleanup` never ran after upgrades; multiple partial installs of the same cask.","solutions":["Run `brew cleanup --cask <token>` to remove stale version directories, keeping one","Run `brew reinstall --cask <token>` so Homebrew normalizes to a single installed version","If appropriate, `brew uninstall --cask <token>` fully, then reinstall via mise"],"exampleFix":"// terminal\n// before: Caskroom/<token>/1.0 and Caskroom/<token>/1.1 both present\n// after:\nbrew cleanup --cask <token>  # or brew reinstall --cask <token>","handlingStrategy":"try-catch","validationCode":"token_dir=\"$($(brew --repository)/bin/brew --repository)/Caskroom/<token>\"\ncount=$(find \"$token_dir\" -mindepth 1 -maxdepth 1 -type d | wc -l)\n[ \"$count\" -le 1 ] || brew cleanup --cask <token>","typeGuard":null,"tryCatchPattern":"match result {\n    Ok(v) => v,\n    Err(e) if e.to_string().contains(\"multiple Caskroom versions\") => {\n        run(\"brew cleanup --cask <token>\")?; retry()\n    }\n    Err(e) => return Err(e),\n}","preventionTips":["Run `brew cleanup --cask` regularly, especially after upgrades","Let Homebrew finish upgrades before running mise operations","Reinstall rather than layering installs of the same cask"],"tags":["homebrew","cask","ambiguous-state","multiple-versions"],"backgroundTag":"invalid-state-transition","analyzedSha":"afd2eddd3a50c16190efc1c7e94404b48f72af57","analyzedAt":"2026-09-09T01:38:25.179Z","contentChangedAt":"2026-09-09T01:38:25.179Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}