{"record":{"id":"d7f3637da02f1381","repo":"gitbutlerapp/gitbutler","slug":"failed-to-get-signature-for-but-requested-version","errorCode":null,"errorMessage":"Failed to get signature for but, requested version may be too old","messagePattern":"Failed to get signature for but, requested version may be too old","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/but-installer/src/install_linux.rs","lineNumber":53,"sourceCode":"        .ok_or_else(|| anyhow::anyhow!(\"Failed to construct but cli URL\"))?;\n    let download_url = format!(\"{base_download_url}/{filename}\");\n    let signature_url = format!(\"{download_url}.sig\");\n\n    validate_download_url(&signature_url)?;\n    validate_download_url(&download_url)?;\n    info(&format!(\"Download URL: {download_url}\"));\n\n    let temp_dir = tempfile::Builder::new()\n        .prefix(\"gitbutler-install.\")\n        .tempdir()?;\n    let tmp_filepath = temp_dir.path().join(filename);\n\n    info(&format!(\"Downloading GitButler {}...\", release.version));\n    download_file(&download_url, &tmp_filepath)?;\n    info(\"Download completed successfully\");\n\n    let signature_b64 = download_to_string(&signature_url).with_context(|| {\n        anyhow!(\"Failed to get signature for but, requested version may be too old\")\n    })?;\n    verify_signature(&tmp_filepath, &signature_b64, temp_dir.path())?;\n\n    // Install the app bundle\n    install_app(&tmp_filepath, &config.home_dir, channel)?;\n\n    Ok(())\n}\n\nfn install_app(but_path: &Path, home_dir: &Path, channel: Option<Channel>) -> Result<()> {\n    let install_bin_path = but_binary_path(home_dir);\n    let bin_dir = install_bin_path\n        .parent()\n        .ok_or_else(|| anyhow!(\"Failed to resolve bin dir path\"))?;\n    fs::create_dir_all(bin_dir)?;\n\n    let but_backup = if install_bin_path.is_file() {\n        let suffix: u64 = std::time::SystemTime::now()","sourceCodeStart":35,"sourceCodeEnd":71,"githubUrl":"https://github.com/gitbutlerapp/gitbutler/blob/caf1f223d3cfb94488c9198ad34487c6006c648f/crates/but-installer/src/install_linux.rs#L35-L71","documentation":"Thrown in install_linux.rs when download_to_string(&signature_url) fails while fetching the detached signature for the but CLI binary. On Linux the CLI and its signature are located by convention (base of the AppImage URL + artifact name), so a 404 or network error downloading the .sig file surfaces as this context-wrapped error, with 'requested version may be too old' hinting that older releases never published CLI signatures.","triggerScenarios":"Installing a release old enough that no signature file was published for the but binary at the convention-derived signature_url; the CDN returning 404/5xx for the signature; a network failure or proxy blocking the second download after the binary itself downloaded fine.","commonSituations":"Pinning to an old VersionRequest::Specific version; using a local mirror or CI network that lets the AppImage through but blocks the .sig; a transient releases CDN outage mid-install.","solutions":["Install a more recent release (or latest/nightly) — versions that predate CLI signature publishing cannot be verified.","Check that signature_url (base of the AppImage URL with the 'but' artifact) actually resolves, e.g. curl -f -I <signature_url>.","Retry the install to rule out a transient network/CDN error.","If behind a proxy, ensure it does not block the signature file while allowing the binary."],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// Before install, probe the convention-derived signature URL\nfn signature_exists(base: &str) -> bool {\n    let sig = format!(\"{base}/but.sig\");\n    reqwest::blocking::Client::new().head(&sig).map(|r| r.status().is_success()).unwrap_or(false)\n}","typeGuard":null,"tryCatchPattern":"match download_to_string(&signature_url) {\n    Ok(sig) => verify_signature(&tmp_filepath, &sig, temp_dir.path())?,\n    Err(e) => {\n        warn(\"signature unavailable (release too old?); retry with latest release\");\n        return Err(e.context(\"Failed to get signature for but\"));\n    },\n}","preventionTips":["Install recent or nightly releases — CLI signatures were not published for very old versions.","Verify the derived signature URL resolves (curl -f -I) before scripting unattended installs.","Treat a signature 404 as a hard stop in CI; never skip verification to work around it."],"tags":["installer","linux","signature","download","version-compatibility"],"backgroundTag":"artifact-download-failed","analyzedSha":"caf1f223d3cfb94488c9198ad34487c6006c648f","analyzedAt":"2026-08-20T07:55:40.983Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}