{"record":{"id":"9ee0c596979d485f","repo":"GitoxideLabs/gitoxide","slug":"peeled-ref","errorCode":null,"errorMessage":"peeled ref","messagePattern":"peeled ref","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"gix-ref/src/store/file/raw_ext.rs","lineNumber":225,"sourceCode":"                let mut seen = BTreeSet::new();\n                let cursor = &mut *self;\n                while let Some(next) = cursor.follow_packed(store, packed) {\n                    let next = next?;\n                    if seen.contains(&next.name) {\n                        return Err(peel::to_object::Error::Cycle {\n                            start_absolute: store.reference_path(cursor.name.as_ref()),\n                        });\n                    }\n                    *cursor = next;\n                    seen.insert(cursor.name.clone());\n                    const MAX_REF_DEPTH: usize = 5;\n                    if seen.len() == MAX_REF_DEPTH {\n                        return Err(peel::to_object::Error::DepthLimitExceeded {\n                            max_depth: MAX_REF_DEPTH,\n                        });\n                    }\n                }\n                let oid = self.target.try_id().expect(\"peeled ref\").to_owned();\n                Ok(oid)\n            }\n        }\n    }\n\n    fn follow(&self, store: &file::Store) -> Option<Result<Reference, file::find::existing::Error>> {\n        let packed = match store\n            .assure_packed_refs_uptodate()\n            .map_err(|err| file::find::existing::Error::Find(file::find::Error::PackedOpen(err)))\n        {\n            Ok(packed) => packed,\n            Err(err) => return Some(Err(err)),\n        };\n        self.follow_packed(store, packed.as_ref().map(|b| &***b))\n    }\n\n    fn follow_packed(\n        &self,","sourceCodeStart":207,"sourceCodeEnd":243,"githubUrl":"https://github.com/GitoxideLabs/gitoxide/blob/e73179060badf27222d790981fac3f84c1830a7e/gix-ref/src/store/file/raw_ext.rs#L207-L243","documentation":"Panic raised by `.expect(\"peeled ref\")` in `follow_to_object_packed`. The function follows symbolic references until it reaches a direct (peeled) target, then calls `target.try_id()`. The invariant says that after following, the target must be a plain object id; if it is still symbolic, `try_id()` returns None and the code panics. This indicates the ref chain did not terminate in a peeled target within `MAX_REF_DEPTH` or a parsing/logic bug.","triggerScenarios":"Calling `peel_to_id_packed`, `follow_to_object_in_place_packed`, `to_id_long_jump`, or `to_id_cycle` on a packed reference whose symbolic chain does not resolve to a peeled object id (e.g. extremely long or cyclic symbolic chains that evade the depth-limit check).","commonSituations":"Reading refs from a packed-refs file containing deeply nested or malformed symbolic ref chains; repositories hand-edited or written by tooling that created dangling symbolic refs in packed-refs.","solutions":["Inspect the packed-refs file for broken or self-referential symbolic entries and repair them (e.g. with `git pack-refs` or manual editing).","Reduce symbolic ref chain depth so it resolves within MAX_REF_DEPTH.","Report the panic to gitoxide if the ref chain is well-formed; this is an internal invariant breach."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// detect unresolved symbolic chains in packed-refs before peeling\nlet r = repo.find_reference(name)?;\nif r.is_symbolic() && depth_follow(&r)? >= MAX_DEPTH { return Err(\"symbolic chain too deep\".into()); }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Avoid hand-editing packed-refs; regenerate with `git pack-refs`.","Check for self-referential or very deep symbolic ref chains before peeling.","Keep symbolic ref chains shallow when creating refs programmatically."],"tags":["panic","packed-refs","symbolic-ref","internal-invariant"],"backgroundTag":"internal-invariant-violation","analyzedSha":"e73179060badf27222d790981fac3f84c1830a7e","analyzedAt":"2026-09-08T11:26:50.865Z","contentChangedAt":"2026-09-08T11:26:50.865Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}