Ver Fonte

Add split_peeled_refs

Jelmer Vernooij há 5 meses atrás
pai
commit
61d937ada1
4 ficheiros alterados com 26 adições e 2 exclusões
  1. 3 1
      dulwich/client.py
  2. 2 1
      dulwich/contrib/swift.py
  3. 12 0
      dulwich/refs.py
  4. 9 0
      tests/test_refs.py

+ 3 - 1
dulwich/client.py

@@ -129,6 +129,7 @@ from .refs import (
     _set_head,
     _set_origin_head,
     read_info_refs,
+    split_peeled_refs,
 )
 from .repo import Repo
 
@@ -2471,7 +2472,8 @@ class AbstractHttpGitClient(GitClient):
                     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, {}, {}
+                (refs, peeled) = split_peeled_refs(read_info_refs(resp))
+                return refs, set(), base_url, {}, peeled
         finally:
             resp.close()
 

+ 2 - 1
dulwich/contrib/swift.py

@@ -59,7 +59,7 @@ from ..pack import (
     write_pack_object,
 )
 from ..protocol import TCP_GIT_PORT
-from ..refs import InfoRefsContainer, read_info_refs, write_info_refs
+from ..refs import InfoRefsContainer, read_info_refs, write_info_refs, split_peeled_refs
 from ..repo import OBJECTDIR, BaseRepo
 from ..server import Backend, TCPGitServer
 
@@ -809,6 +809,7 @@ class SwiftInfoRefsContainer(InfoRefsContainer):
         if not f:
             return {}
         refs = read_info_refs(f)
+        (refs, peeled) = split_peeled_refs(refs)
         if old_ref is not None:
             if refs[name] != old_ref:
                 return False

+ 12 - 0
dulwich/refs.py

@@ -1175,6 +1175,18 @@ def strip_peeled_refs(refs):
     }
 
 
+def split_peeled_refs(refs):
+    """Split peeled refs from regular refs."""
+    peeled = {}
+    regular = {}
+    for (ref, sha) in refs.items():
+        if ref.endswith(PEELED_TAG_SUFFIX):
+            peeled[ref[:-len(PEELED_TAG_SUFFIX)]] = sha
+        else:
+            regular[ref] = sha
+    return regular, peeled
+
+
 def _set_origin_head(refs, origin, origin_head):
     # set refs/remotes/origin/HEAD
     origin_base = b"refs/remotes/" + origin + b"/"

+ 9 - 0
tests/test_refs.py

@@ -39,6 +39,7 @@ from dulwich.refs import (
     read_packed_refs,
     read_packed_refs_with_peeled,
     strip_peeled_refs,
+    split_peeled_refs,
     write_packed_refs,
 )
 from dulwich.repo import Repo
@@ -814,3 +815,11 @@ class StripPeeledRefsTests(TestCase):
     def test_strip_peeled_refs(self):
         # Simple check of two dicts
         self.assertEqual(strip_peeled_refs(self.all_refs), self.non_peeled_refs)
+
+    def test_split_peeled_refs(self):
+        (regular, peeled) = split_peeled_refs(self.all_refs)
+        self.assertEqual(regular, self.non_peeled_refs)
+        self.assertEqual(peeled, {
+            b'refs/tags/2.0.0': b"0749936d0956c661ac8f8d3483774509c165f89e",
+            b"refs/tags/1.0.0": b"a93db4b0360cc635a2b93675010bac8d101f73f0"})
+