{"record":{"id":"ca41a674b563d0cd","repo":"jdx/mise","slug":"brew-cask-token-homebrew-metadata-exists-but-n","errorCode":null,"errorMessage":"brew-cask:{token}: Homebrew metadata exists, but no installed Caskroom version was found; repair it with `brew reinstall --cask {token}`","messagePattern":"brew-cask:(.+?): Homebrew metadata exists, but no installed Caskroom version was found; repair it with `brew reinstall --cask (.+?)`","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/system/packages/brew/cask/state.rs","lineNumber":80,"sourceCode":"                path.display()\n            )\n        })?;\n        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(|| {","sourceCodeStart":62,"sourceCodeEnd":98,"githubUrl":"https://github.com/jdx/mise/blob/afd2eddd3a50c16190efc1c7e94404b48f72af57/src/system/packages/brew/cask/state.rs#L62-L98","documentation":"homebrew_installed_version resolves the single installed Caskroom version for a token. When Homebrew's own metadata exists but the Caskroom directory contains no version directory, the cask state is inconsistent, so mise bails and asks the user to repair via Homebrew. mise never guesses a version when Homebrew claims ownership but nothing is installed.","triggerScenarios":"homebrew_installed_version is called (from install_one_with_ancestors or package_state), homebrew_installed_versions(token) returns an empty list while Homebrew metadata (e.g. the caskroom metadata dir / receipt) is still present.","commonSituations":"A previous `brew uninstall --cask` or `brew cleanup` partially removed the Caskroom version directory but left metadata; interrupted brew operations; manually deleting ~/Caskroom subdirectories.","solutions":["Run `brew reinstall --cask <token>` to restore the missing Caskroom version","If the cask is unwanted, run `brew uninstall --cask <token>` to clear the stale metadata, then let mise reinstall","Run `brew cleanup --cask` and retry the mise operation"],"exampleFix":"// terminal, not code\n// before: broken state (metadata exists, no Caskroom dir)\n// after:\nbrew reinstall --cask <token>","handlingStrategy":"try-catch","validationCode":"// before installing via mise, check consistency\nls \"$(brew --repository)/Caskroom/<token>\" 2>/dev/null\nbrew info --cask <token> >/dev/null 2>&1 && echo metadata-ok","typeGuard":null,"tryCatchPattern":"match result {\n    Ok(v) => v,\n    Err(e) if e.to_string().contains(\"no installed Caskroom version\") => {\n        run(\"brew reinstall --cask <token>\")?; retry()\n    }\n    Err(e) => return Err(e),\n}","preventionTips":["Never manually delete Caskroom version directories; use brew uninstall/cleanup","Run `brew cleanup --cask` after upgrades","Avoid killing brew mid-operation"],"tags":["homebrew","cask","inconsistent-state"],"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-14T05:17:10.506Z"}