diff --git a/git-repository/src/clone/fetch/util.rs b/git-repository/src/clone/fetch/util.rs index ccbd0909f7..8b7ddcddb4 100644 --- a/git-repository/src/clone/fetch/util.rs +++ b/git-repository/src/clone/fetch/util.rs @@ -59,7 +59,7 @@ pub fn update_head( None => return Ok(()), }; - let name: git_ref::FullName = "HEAD".try_into().expect("valid"); + let head: git_ref::FullName = "HEAD".try_into().expect("valid"); let reflog_message = || LogChange { mode: RefLog::AndReference, force_create_reflog: false, @@ -98,7 +98,7 @@ pub fn update_head( expected: PreviousValue::Any, new: Target::Symbolic(referent), }, - name: name.clone(), + name: head.clone(), deref: false, }, ], @@ -116,7 +116,7 @@ pub fn update_head( expected: PreviousValue::Any, new: Target::Peeled(head_peeled_id.to_owned()), }, - name, + name: head, deref: false, })?; } @@ -127,7 +127,7 @@ pub fn update_head( expected: PreviousValue::Any, new: Target::Peeled(head_peeled_id.to_owned()), }, - name, + name: head, deref: false, })?; } diff --git a/git-repository/src/remote/fetch.rs b/git-repository/src/remote/fetch.rs index 437db38625..9227f5d9e8 100644 --- a/git-repository/src/remote/fetch.rs +++ b/git-repository/src/remote/fetch.rs @@ -53,6 +53,7 @@ impl Source { match self { Source::ObjectId(_) => None, Source::Ref(r) => match r { + git_protocol::fetch::Ref::Unborn { target: _ } => Some("HEAD".into()), git_protocol::fetch::Ref::Symbolic { full_ref_name, .. } | git_protocol::fetch::Ref::Direct { full_ref_name, .. } | git_protocol::fetch::Ref::Peeled { full_ref_name, .. } => Some(full_ref_name.as_ref()), diff --git a/git-repository/tests/clone/mod.rs b/git-repository/tests/clone/mod.rs index 9e6c96726d..8ac07f2467 100644 --- a/git-repository/tests/clone/mod.rs +++ b/git-repository/tests/clone/mod.rs @@ -193,19 +193,41 @@ mod blocking_io { } #[test] + #[ignore] fn fetch_and_checkout_empty_remote_repo() -> crate::Result { let tmp = git_testtools::tempfile::TempDir::new()?; let mut prepare = git::prepare_clone( git_testtools::scripted_fixture_repo_read_only("make_empty_repo.sh")?, tmp.path(), )?; - let (mut checkout, _out) = prepare + let (mut checkout, out) = prepare .fetch_then_checkout(git::progress::Discard, &std::sync::atomic::AtomicBool::default()) .unwrap(); let (repo, _) = checkout.main_worktree(git::progress::Discard, &std::sync::atomic::AtomicBool::default())?; assert!(!repo.index_path().is_file(), "newly initialized repos have no index"); assert!(repo.head()?.is_unborn()); + if out + .ref_map + .handshake + .capabilities + .capability("ls-refs") + .expect("has ls-refs") + .supports("unborn") + == Some(true) + { + assert_eq!( + repo.head()?.referent_name().expect("present").as_bstr(), + "refs/heads/special", + "we pick up the name as present on the server, not the one we default to" + ); + } else { + assert_eq!( + repo.head()?.referent_name().expect("present").as_bstr(), + "refs/heads/main", + "we simply keep our own post-init HEAD which defaults to the branch name we configured locally" + ); + } Ok(()) } diff --git a/git-repository/tests/fixtures/generated-archives/make_empty_repo.tar.xz b/git-repository/tests/fixtures/generated-archives/make_empty_repo.tar.xz index 5930eb62ae..7a1592d166 100644 --- a/git-repository/tests/fixtures/generated-archives/make_empty_repo.tar.xz +++ b/git-repository/tests/fixtures/generated-archives/make_empty_repo.tar.xz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8c88c509ad1df376844b8a80b003a01c78de79284c4b0cf72fe661ca41f6d303 +oid sha256:875f0aa4a343935bc881d6c595efffeb34063a460239178cf2264e5e44163c2d size 9068 diff --git a/git-repository/tests/fixtures/make_empty_repo.sh b/git-repository/tests/fixtures/make_empty_repo.sh index 5a79561957..2ca9da4d63 100644 --- a/git-repository/tests/fixtures/make_empty_repo.sh +++ b/git-repository/tests/fixtures/make_empty_repo.sh @@ -1,4 +1,4 @@ #!/bin/bash set -eu -o pipefail -git init -q +git -c init.defaultBranch=special init -q