Bladeren bron

Refactor discovery to include symrefs and peeled refs

Jelmer Vernooij 5 maanden geleden
bovenliggende
commit
34f9361c6f
2 gewijzigde bestanden met toevoegingen van 20 en 13 verwijderingen
  1. 19 12
      dulwich/client.py
  2. 1 1
      tests/test_client.py

+ 19 - 12
dulwich/client.py

@@ -2424,11 +2424,10 @@ class AbstractHttpGitClient(GitClient):
                 self.protocol_version = server_protocol_version
                 if self.protocol_version == 2:
                     server_capabilities, resp, read, proto = begin_protocol_v2(proto)
-                    (refs, _symrefs, _peeled) = read_pkt_refs_v2(proto.read_pkt_seq())
-                    return refs, server_capabilities, base_url
+                    (refs, symrefs, peeled) = read_pkt_refs_v2(proto.read_pkt_seq())
+                    return refs, server_capabilities, base_url, symrefs, peeled
 
                 else:
-                    server_capabilities = None  # read_pkt_refs will find them
                     try:
                         [pkt] = list(proto.read_pkt_seq())
                     except ValueError as exc:
@@ -2457,14 +2456,22 @@ class AbstractHttpGitClient(GitClient):
                         server_capabilities, resp, read, proto = begin_protocol_v2(
                             proto
                         )
-                    (
-                        refs,
-                        server_capabilities,
-                    ) = read_pkt_refs_v1(proto.read_pkt_seq())
-                    return refs, server_capabilities, base_url
+                        (
+                            refs,
+                            symrefs,
+                            peeled
+                        ) = read_pkt_refs_v2(proto.read_pkt_seq())
+                    else:
+                        (
+                            refs,
+                            server_capabilities,
+                        ) = read_pkt_refs_v1(proto.read_pkt_seq())
+                        peeled = {}
+                        (symrefs, agent) = _extract_symrefs_and_agent(server_capabilities)
+                    return refs, server_capabilities, base_url, symrefs, peeled
             else:
                 self.protocol_version = 0  # dumb servers only support protocol v0
-                return read_info_refs(resp), set(), base_url
+                return read_info_refs(resp), set(), base_url, {}, {}
         finally:
             resp.close()
 
@@ -2512,7 +2519,7 @@ class AbstractHttpGitClient(GitClient):
 
         """
         url = self._get_url(path)
-        old_refs, server_capabilities, url = self._discover_references(
+        old_refs, server_capabilities, url, symrefs, peeled = self._discover_references(
             b"git-receive-pack", url
         )
         (
@@ -2595,7 +2602,7 @@ class AbstractHttpGitClient(GitClient):
 
         """
         url = self._get_url(path)
-        refs, server_capabilities, url = self._discover_references(
+        refs, server_capabilities, url, symrefs, peeled = self._discover_references(
             b"git-upload-pack", url, protocol_version
         )
         (
@@ -2662,7 +2669,7 @@ class AbstractHttpGitClient(GitClient):
     def get_refs(self, path):
         """Retrieve the current refs from a git smart server."""
         url = self._get_url(path)
-        refs, _, _ = self._discover_references(b"git-upload-pack", url)
+        refs, _, _, _, _ = self._discover_references(b"git-upload-pack", url)
         return refs
 
     def get_url(self, path):

+ 1 - 1
tests/test_client.py

@@ -1138,7 +1138,7 @@ class HttpGitClientTests(TestCase):
             # instantiate HttpGitClient with mocked pool manager
             c = HttpGitClient(base_url, pool_manager=pool_manager, config=None)
             # call method that detects url redirection
-            _, _, processed_url = c._discover_references(b"git-upload-pack", base_url)
+            _, _, processed_url, _, _ = c._discover_references(b"git-upload-pack", base_url)
 
             # send the same request as the method above without redirection
             resp = c.pool_manager.request("GET", base_url + tail, redirect=False)