From d440d64f2e95346d38a0a068769456e891a0c82d Mon Sep 17 00:00:00 2001 From: Stefan Sperling Date: Wed, 30 Oct 2024 15:40:36 +0000 Subject: [PATCH 1/2] fix detection of HEAD symref with protocol v2 over HTTP and add a test case related to issue #1389 --- dulwich/client.py | 4 +++- tests/compat/test_client.py | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/dulwich/client.py b/dulwich/client.py index a79d7dd74..df5ab1f2e 100644 --- a/dulwich/client.py +++ b/dulwich/client.py @@ -2609,9 +2609,11 @@ def fetch_pack( ) ( negotiated_capabilities, - symrefs, + capa_symrefs, agent, ) = self._negotiate_upload_pack_capabilities(server_capabilities) + if not symrefs and capa_symrefs: + symrefs = capa_symrefs if depth is not None: wants = determine_wants(refs, depth=depth) else: diff --git a/tests/compat/test_client.py b/tests/compat/test_client.py index 40cea9035..8b22a3d8f 100644 --- a/tests/compat/test_client.py +++ b/tests/compat/test_client.py @@ -226,6 +226,10 @@ def test_fetch_pack(self): c = self._client() with repo.Repo(os.path.join(self.gitroot, "dest")) as dest: result = c.fetch(self._build_path("/server_new.export"), dest) + self.assertEqual( + {b"HEAD": b"refs/heads/master"}, + result.symrefs, + ) for r in result.refs.items(): dest.refs.set_if_equals(r[0], None, r[1]) self.assertDestEqualsSrc() From 754b5b4a4c9c63e894ff15d9fc8383fc2a390532 Mon Sep 17 00:00:00 2001 From: Stefan Sperling Date: Wed, 30 Oct 2024 15:40:39 +0000 Subject: [PATCH 2/2] add compat test case which verifies behaviour with a non-default symref --- tests/compat/test_client.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/compat/test_client.py b/tests/compat/test_client.py index 8b22a3d8f..8c54a1ae7 100644 --- a/tests/compat/test_client.py +++ b/tests/compat/test_client.py @@ -234,6 +234,21 @@ def test_fetch_pack(self): dest.refs.set_if_equals(r[0], None, r[1]) self.assertDestEqualsSrc() + def test_fetch_pack_with_nondefault_symref(self): + c = self._client() + src = repo.Repo(os.path.join(self.gitroot, "server_new.export")) + src.refs.add_if_new(b"refs/heads/main", src.refs[b"refs/heads/master"]) + src.refs.set_symbolic_ref(b"HEAD", b"refs/heads/main") + with repo.Repo(os.path.join(self.gitroot, "dest")) as dest: + result = c.fetch(self._build_path("/server_new.export"), dest) + self.assertEqual( + {b"HEAD": b"refs/heads/main"}, + result.symrefs, + ) + for r in result.refs.items(): + dest.refs.set_if_equals(r[0], None, r[1]) + self.assertDestEqualsSrc() + def test_fetch_pack_depth(self): c = self._client() with repo.Repo(os.path.join(self.gitroot, "dest")) as dest: