瀏覽代碼

Factor out extraction of symrefs

Jelmer Vernooij 5 月之前
父節點
當前提交
c6abf72bc6
共有 2 個文件被更改,包括 38 次插入15 次删除
  1. 26 15
      dulwich/client.py
  2. 12 0
      tests/test_client.py

+ 26 - 15
dulwich/client.py

@@ -684,6 +684,26 @@ def _handle_upload_pack_tail(
             pack_data(data)
 
 
+def _extract_symrefs_and_agent(capabilities):
+    """Extract symrefs and agent from capabilities.
+
+    Args:
+     capabilities: List of capabilities
+    Returns:
+     (symrefs, agent) tuple
+    """
+    symrefs = {}
+    agent = None
+    for capability in capabilities:
+        k, v = parse_capability(capability)
+        if k == CAPABILITY_SYMREF:
+            (src, dst) = v.split(b":", 1)
+            symrefs[src] = dst
+        if k == CAPABILITY_AGENT:
+            agent = v
+    return (symrefs, agent)
+
+
 # TODO(durin42): this doesn't correctly degrade if the server doesn't
 # support some capabilities. This should work properly with servers
 # that don't support multi_ack.
@@ -1012,11 +1032,7 @@ class GitClient:
 
     def _negotiate_receive_pack_capabilities(self, server_capabilities):
         negotiated_capabilities = self._send_capabilities & server_capabilities
-        agent = None
-        for capability in server_capabilities:
-            k, v = parse_capability(capability)
-            if k == CAPABILITY_AGENT:
-                agent = v
+        (agent, _symrefs) = _extract_symrefs_and_agent(server_capabilities)
         (extract_capability_names(server_capabilities) - KNOWN_RECEIVE_CAPABILITIES)
         # TODO(jelmer): warn about unknown capabilities
         return negotiated_capabilities, agent
@@ -1069,23 +1085,16 @@ class GitClient:
     def _negotiate_upload_pack_capabilities(self, server_capabilities):
         (extract_capability_names(server_capabilities) - KNOWN_UPLOAD_CAPABILITIES)
         # TODO(jelmer): warn about unknown capabilities
-        symrefs = {}
-        agent = None
         fetch_capa = None
         for capability in server_capabilities:
             k, v = parse_capability(capability)
-            if k == CAPABILITY_SYMREF:
-                (src, dst) = v.split(b":", 1)
-                symrefs[src] = dst
-            if k == CAPABILITY_AGENT:
-                agent = v
             if self.protocol_version == 2 and k == CAPABILITY_FETCH:
                 fetch_capa = CAPABILITY_FETCH
                 fetch_features = []
-                v = v.strip()
-                if b"shallow" in v.split(b" "):
+                v = v.strip().split(b" ")
+                if b"shallow" in v:
                     fetch_features.append(CAPABILITY_SHALLOW)
-                if b"filter" in v.split(b" "):
+                if b"filter" in v:
                     fetch_features.append(CAPABILITY_FILTER)
                 for i in range(len(fetch_features)):
                     if i == 0:
@@ -1094,6 +1103,8 @@ class GitClient:
                         fetch_capa += b" "
                     fetch_capa += fetch_features[i]
 
+        (symrefs, agent) = _extract_symrefs_and_agent(server_capabilities)
+
         negotiated_capabilities = self._fetch_capabilities & server_capabilities
         if fetch_capa:
             negotiated_capabilities.add(fetch_capa)

+ 12 - 0
tests/test_client.py

@@ -54,6 +54,7 @@ from dulwich.client import (
     get_transport_and_path,
     get_transport_and_path_from_url,
     parse_rsync_url,
+    _extract_symrefs_and_agent,
 )
 from dulwich.config import ConfigDict
 from dulwich.objects import Commit, Tree
@@ -1867,3 +1868,14 @@ And this line is just random noise, too.
                 ]
             ),
         )
+
+
+class TestExtractAgentAndSymrefs(TestCase):
+
+    def test_extract_agent_and_symrefs(self):
+        (agent, symrefs) = _extract_symrefs_and_agent(
+            [b"agent=git/2.31.1", b"symref=HEAD:refs/heads/master"
+             ])
+        self.assertEqual(agent, b"git/2.31.1")
+        self.assertEqual(symrefs, {b"HEAD": b"refs/heads/master"})
+