ElyTree: an unborn HEAD is told from a broken one (G-03, in review)

born() takes a HEAD as new only when it names a branch under
refs/heads/ that no ref holds yet; a broken ref, a tag target or any
other state is an error in Git's words. The branch name keeps every
byte. Round 3 is fixed; round 4 waits until 0.1.3 ships.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ZacharyZhang-NYandClaude Opus 5.5 committed 2026-10-10 16:00:55 -04:00
1 parent 6d1373fe16
commit 30801ad24b
5 files changed
+49 -3

No files matched your search

+21
View File
@@ -447,6 +447,27 @@ fn a_new_repository_lists_no_moves_and_no_lfs_files() {
crate::structure::lfs(&git(), &root).expect("no LFS error"),
Vec::new()
);
// A new branch whose name ends in a no-break space.
let named = committed(&dir.path().join("named"));
sh(&named, &["branch", "topic"]);
sh(&named, &["checkout", "-q", "--orphan", "topic\u{a0}"]);
assert_eq!(crate::recover::reflog(&git(), &named).expect("no reflog error"), Vec::new());
}
#[test]
fn a_broken_head_is_an_error_not_an_empty_repository() {
let dir = tempfile::tempdir().expect("a temp dir");
let root = committed(dir.path());
let branch = sh(&root, &["symbolic-ref", "--short", "HEAD"]).trim().to_owned();
std::fs::write(root.join(".git/refs/heads").join(branch), "not-an-object-id
").expect("breaks");
assert!(crate::recover::reflog(&git(), &root).is_err(), "the reflog says why");
assert!(crate::structure::lfs(&git(), &root).is_err(), "LFS says why");
// HEAD at a missing tag is no new branch either.
let other = dir.path().join("other");
crate::repo::init(&git(), &other).expect("init");
sh(&other, &["symbolic-ref", "HEAD", "refs/tags/missing"]);
assert!(crate::recover::reflog(&git(), &other).is_err(), "a tag HEAD says why");
}
#[test]