{"record":{"id":"ecf038797c23e05b","repo":"jdx/mise","slug":"additional-asset-is-not-an-archive","errorCode":null,"errorMessage":"additional asset '{}' is not an archive","messagePattern":"additional asset '(.+?)' is not an archive","errorType":"exception","errorClass":"eyre::Report","httpStatus":null,"severity":"error","filePath":"src/backend/github.rs","lineNumber":1620,"sourceCode":"                );\n            }\n        } else if Settings::get().lockfile_enabled() {\n            artifact.size = Some(file_path.metadata()?.len());\n        }\n        Ok(())\n    }\n\n    fn install_additional_archive(\n        &self,\n        install_path: &Path,\n        file_path: &Path,\n        pr: Option<&dyn crate::ui::progress_report::SingleReport>,\n    ) -> Result<()> {\n        let format = file::ExtractionFormat::from_file_name(\n            &file_path.file_name().unwrap_or_default().to_string_lossy(),\n        );\n        if !format.is_archive() {\n            eyre::bail!(\n                \"additional asset '{}' is not an archive\",\n                file_path.display()\n            );\n        }\n        let extract_opts = file::ExtractOptions {\n            pr,\n            ..Default::default()\n        };\n        file::extract_archive(file_path, install_path, format, &extract_opts)\n    }\n\n    /// Discovers bin paths in the installation directory\n    fn discover_bin_paths(&self, tv: &ToolVersion) -> Result<Vec<std::path::PathBuf>> {\n        let raw_opts = tv.request.options();\n        let opts = self.options(&raw_opts);\n        if let Some(bin_path_template) = opts.bin_path() {\n            let bin_path = template_string(&bin_path_template, tv);\n            return Ok(vec![tv.install_path().join(&bin_path)]);","sourceCodeStart":1602,"sourceCodeEnd":1638,"githubUrl":"https://github.com/jdx/mise/blob/6f52dcdf99e282ef7a7db68c81301fa4618d0f79/src/backend/github.rs#L1602-L1638","documentation":"install_additional_archive() extracts a downloaded 'additional artifact' into the install dir. ExtractionFormat::from_file_name() infers the format from the file's name; if it is not a recognized archive type (tar/zip/gz/xz/zst/...), mise cannot extract it and bails instead of guessing.","triggerScenarios":"An `additional_artifacts` glob/pattern for a github: tool matches a non-archive release asset — e.g. SHA256SUMS, a .sig signature file, a raw binary, or a .txt — and mise tries to extract it after download.","commonSituations":"Overly broad patterns like `additional_artifacts = [\".*\"]` or `\"*checksums*\"` meant to grab one archive but also matching release metadata files; releases that mix archives and plain files with similar names.","solutions":["Narrow the additional_artifacts pattern so it only matches actual archives (e.g. \"mytool-docs.tar.gz\" instead of \".*\")","Explicitly exclude non-archive sidecar files (checksums/signatures) from the pattern","Verify against the release page which files the pattern matches before committing it"],"exampleFix":"# before (mise.toml)\n[tools.mytool]\nversion = \"1.0\"\nadditional_artifacts = [\".*\"]\n# after\nadditional_artifacts = [\"mytool-.*-docs\\\\.tar\\\\.gz\"]","handlingStrategy":"validation","validationCode":"# dry-check what your pattern matches against the release before committing it\ncurl -s https://api.github.com/repos/<owner>/<repo>/releases/latest | jq -r '.assets[].name' | grep -E '<your-pattern>'","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Scope additional_artifacts patterns to full archive file names, not broad globs","Exclude checksums/signature sidecar files explicitly","Re-test patterns whenever a project changes its release asset naming"],"tags":["github-backend","additional-artifacts","archive-extraction","file-format"],"backgroundTag":"unsupported-archive-format","analyzedSha":"6f52dcdf99e282ef7a7db68c81301fa4618d0f79","analyzedAt":"2026-08-22T10:14:23.840Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}