Browse Source

parse symrefs.

Jelmer Vernooij 7 years ago
parent
commit
eb04901272
2 changed files with 24 additions and 6 deletions
  1. 16 5
      dulwich/client.py
  2. 8 1
      dulwich/protocol.py

+ 16 - 5
dulwich/client.py

@@ -76,6 +76,7 @@ from dulwich.protocol import (
     CAPABILITY_OFS_DELTA,
     CAPABILITY_QUIET,
     CAPABILITY_REPORT_STATUS,
+    CAPABILITY_SYMREF,
     CAPABILITY_SIDE_BAND_64K,
     CAPABILITY_THIN_PACK,
     CAPABILITIES_REF,
@@ -93,6 +94,7 @@ from dulwich.protocol import (
     TCP_GIT_PORT,
     ZERO_SHA,
     extract_capabilities,
+    parse_capability,
     )
 from dulwich.pack import (
     write_pack_objects,
@@ -463,9 +465,16 @@ class GitClient(object):
             extract_capability_names(server_capabilities) -
             KNOWN_UPLOAD_CAPABILITIES)
         # TODO(jelmer): warn about unknown capabilities
+        symrefs = {}
+        for capability in server_capabilities:
+            k, v = parse_capability(capability)
+            if k == CAPABILITY_SYMREF:
+                (src, dst) = v.split(b':', 1)
+                symrefs[src] = dst
+
         negotiated_capabilities = (
             self._fetch_capabilities & server_capabilities)
-        return negotiated_capabilities
+        return (negotiated_capabilities, symrefs)
 
     def _handle_upload_pack_head(self, proto, capabilities, graph_walker,
                                  wants, can_read):
@@ -656,8 +665,9 @@ class TraditionalGitClient(GitClient):
         proto, can_read = self._connect(b'upload-pack', path)
         with proto:
             refs, server_capabilities = read_pkt_refs(proto)
-            negotiated_capabilities = self._negotiate_upload_pack_capabilities(
-                    server_capabilities)
+            negotiated_capabilities, symrefs = \
+                    self._negotiate_upload_pack_capabilities(
+                            server_capabilities)
 
             if refs is None:
                 proto.write_pkt_line(None)
@@ -1283,8 +1293,9 @@ class HttpGitClient(GitClient):
         url = self._get_url(path)
         refs, server_capabilities = self._discover_references(
             b"git-upload-pack", url)
-        negotiated_capabilities = self._negotiate_upload_pack_capabilities(
-            server_capabilities)
+        negotiated_capabilities, symrefs = \
+                self._negotiate_upload_pack_capabilities(
+                        server_capabilities)
         wants = determine_wants(refs)
         if wants is not None:
             wants = [cid for cid in wants if cid != ZERO_SHA]

+ 8 - 1
dulwich/protocol.py

@@ -105,7 +105,14 @@ def capability_symref(from_ref, to_ref):
 
 
 def extract_capability_names(capabilities):
-    return set(c.split(b'=')[0] for c in capabilities)
+    return set(parse_capability(c)[0] for c in capabilities)
+
+
+def parse_capability(capability):
+    parts = capability.split('=', 1)
+    if len(parts) == 1:
+        return (parts[0], None)
+    return tuple(parts)
 
 
 COMMAND_DEEPEN = b'deepen'