{"record":{"id":"815876ac00701d73","repo":"jdx/mise","slug":"github-api-url-should-support-path-segments","errorCode":null,"errorMessage":"GitHub API URL should support path segments","messagePattern":"GitHub API URL should support path segments","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/backend/aqua.rs","lineNumber":2304,"sourceCode":"            )\n        })?;\n\n        Ok((\n            asset.browser_download_url.to_string(),\n            Some(asset.url.to_string()),\n            asset.digest.clone(),\n        ))\n    }\n\n    fn github_archive_url(&self, pkg: &AquaPackage, v: &str) -> String {\n        let gh_id = format!(\"{}/{}\", pkg.repo_owner, pkg.repo_name);\n        format!(\"https://github.com/{gh_id}/archive/refs/tags/{v}.tar.gz\")\n    }\n\n    fn github_archive_api_url(&self, pkg: &AquaPackage, v: &str) -> String {\n        let mut url = Url::parse(github::API_URL).expect(\"GitHub API URL should be valid\");\n        url.path_segments_mut()\n            .expect(\"GitHub API URL should support path segments\")\n            .extend([\n                \"repos\",\n                pkg.repo_owner.as_str(),\n                pkg.repo_name.as_str(),\n                \"tarball\",\n                v,\n            ]);\n        url.to_string()\n    }\n\n    fn github_content_url(&self, pkg: &AquaPackage, v: &str) -> String {\n        let gh_id = format!(\"{}/{}\", pkg.repo_owner, pkg.repo_name);\n        let path = pkg.path.as_deref().unwrap();\n        format!(\"https://raw.githubusercontent.com/{gh_id}/{v}/{path}\")\n    }\n\n    fn github_content_api_url(&self, pkg: &AquaPackage, v: &str) -> String {\n        let mut url = Url::parse(github::API_URL).expect(\"GitHub API URL should be valid\");","sourceCodeStart":2286,"sourceCodeEnd":2322,"githubUrl":"https://github.com/jdx/mise/blob/afd2eddd3a50c16190efc1c7e94404b48f72af57/src/backend/aqua.rs#L2286-L2322","documentation":"This panic fires when `path_segments_mut()` returns Err, which happens only for 'cannot-be-a-base' URLs (URLs without hierarchical paths, e.g. `mailto:`). The GitHub API URL is a normal hierarchical https URL, so this is an internal invariant assertion that path manipulation is legal.","triggerScenarios":"Calling `github_archive_api_url` on an aqua package while the base `github::API_URL` is a cannot-be-a-base URL — only possible if the constant was replaced with a non-hierarchical scheme.","commonSituations":"Effectively unreachable; appears only during development when someone changes the API base URL constant to an opaque scheme or misapplies a patch.","solutions":["Ensure `github::API_URL` remains a hierarchical https URL","Use the latest released mise; file a bug with a backtrace if it fires on a stock build"],"exampleFix":null,"handlingStrategy":"type-guard","validationCode":"let u = url::Url::parse(github::API_URL).unwrap();\nassert!(u.path_segments_mut().is_ok(), \"API URL must be hierarchical (cannot-be-a-base URLs unsupported)\");","typeGuard":"fn supports_path_segments(u: &url::Url) -> bool { u.path_segments_mut().is_ok() }","tryCatchPattern":"if let Ok(mut segs) = url.path_segments_mut() { segs.extend([\"repos\", owner, name, \"tarball\", v]); } else { eprintln!(\"non-hierarchical API URL\"); }","preventionTips":["Keep the API base URL hierarchical (https scheme with host)","Unit-test that path_segments_mut() succeeds for the API constant"],"tags":["rust","panic","url","aqua","internal-invariant"],"backgroundTag":"internal-invariant-violation","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"}