{"record":{"id":"282a8e73ea855744","repo":"astrid-runtime/astrid","slug":"git-emitted-an-invalid-revision-id","errorCode":null,"errorMessage":"git emitted an invalid revision ID","messagePattern":"git emitted an invalid revision ID","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/astrid-storage-chunker-evidence/src/corpus.rs","lineNumber":101,"sourceCode":"        repository: &Path,\n        relative_path: &Path,\n    ) -> Result<Self> {\n        validate_relative_git_path(relative_path)?;\n        let revisions = Command::new(\"git\")\n            .args([\"-C\"])\n            .arg(repository)\n            .args([\"rev-list\", \"--reverse\", \"--max-count=32\", \"HEAD\", \"--\"])\n            .arg(relative_path)\n            .output()\n            .context(\"enumerate captured version chain\")?;\n        if !revisions.status.success() {\n            bail!(\"git could not enumerate the captured version chain\");\n        }\n        let revisions = String::from_utf8(revisions.stdout).context(\"git emitted non-UTF-8 IDs\")?;\n        let mut inputs = Vec::new();\n        for revision in revisions.lines() {\n            if revision.is_empty() || !revision.bytes().all(|byte| byte.is_ascii_hexdigit()) {\n                bail!(\"git emitted an invalid revision ID\");\n            }\n            if !git_path_exists_at_revision(repository, relative_path, revision)? {\n                continue;\n            }\n            let object = format!(\"{revision}:{}\", relative_path.to_string_lossy());\n            let version = Command::new(\"git\")\n                .args([\"-C\"])\n                .arg(repository)\n                .args([\"show\", &object])\n                .output()\n                .context(\"read captured version\")?;\n            if !version.status.success() {\n                bail!(\n                    \"git could not read captured version: {}\",\n                    String::from_utf8_lossy(&version.stderr).trim()\n                );\n            }\n            inputs.push(memory(version.stdout));","sourceCodeStart":83,"sourceCodeEnd":119,"githubUrl":"https://github.com/astrid-runtime/astrid/blob/affd8760f44190dbdfbec23403f4c4b642c33112/crates/astrid-storage-chunker-evidence/src/corpus.rs#L83-L119","documentation":"After enumerating revisions, `version_chain_from_git` sanity-checks each line: it must be non-empty and consist solely of ASCII hex digits (a valid object ID). Any malformed line from `git rev-list` triggers this error, protecting downstream `rev:path` object construction from garbage.","triggerScenarios":"A line of `git rev-list` stdout is empty or contains non-hex characters — e.g. warnings interleaved into stdout, hooks printing noise, or unexpected output format from a git wrapper/alias.","commonSituations":"Git wrappers/aliases or hooks injecting text into command output; locale/config (e.g. pager or color) settings altering output; a non-standard `git` shim on PATH.","solutions":["Inspect raw `git rev-list` stdout for extra non-ID lines (warnings, hook output).","Disable git aliases/hooks/wrappers that emit extra output (e.g. run with clean config: `git -c core.hooksPath=/dev/null`).","Ensure no pager/color config leaks into machine-readable output (set `GIT_PAGER=cat`, `--no-color`).","Confirm the `git` binary on PATH is the real git, not a custom shim."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"fn is_valid_oid(s: &str) -> bool {\n    !s.is_empty() && s.bytes().all(|b| b.is_ascii_hexdigit())\n}\n// assert every line of `git rev-list` output passes is_valid_oid before use","typeGuard":null,"tryCatchPattern":"match version_chain_from_git(&repo, &path, name) {\n    Err(e) if e.to_string().contains(\"invalid revision ID\") => {\n        // inspect raw rev-list output for injected lines (hooks, aliases, pagers)\n    }\n    other => other,\n}","preventionTips":["Run git with a clean environment: disable hooks, aliases, pager and color for machine output","Avoid wrapper scripts around git that print to stdout","Pin the git binary/version used in CI corpus generation"],"tags":["git","parsing","revision-id","output-format"],"backgroundTag":"unexpected-response-shape","analyzedSha":"affd8760f44190dbdfbec23403f4c4b642c33112","analyzedAt":"2026-09-09T21:28:12.402Z","contentChangedAt":"2026-09-09T21:28:12.402Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}