Browse Source

Support fetching symrefs during clone. Fixes #485, #847.

Jelmer Vernooij 4 years ago
parent
commit
2571622549
3 changed files with 25 additions and 2 deletions
  1. 3 0
      NEWS
  2. 2 2
      dulwich/porcelain.py
  3. 20 0
      dulwich/tests/test_porcelain.py

+ 3 - 0
NEWS

@@ -3,6 +3,9 @@
  * In porcelain.push, default to local active branch.
    (Jelmer Vernooij, #846)
 
+ * Support fetching symrefs.
+   (Jelmer Vernooij, #485, #847)
+
 0.20.20	2021-03-03
 
  * Implement ``Stash.drop``. (Peter Rowlands)

+ 2 - 2
dulwich/porcelain.py

@@ -475,8 +475,8 @@ def clone(
             depth=depth,
             **kwargs
         )
-        # TODO(jelmer): Support symref capability,
-        # https://github.com/jelmer/dulwich/issues/485
+        for key, target in fetch_result.symrefs.items():
+            r.refs.set_symbolic_ref(key, target)
         try:
             head = r[fetch_result.refs[b"HEAD"]]
         except KeyError:

+ 20 - 0
dulwich/tests/test_porcelain.py

@@ -424,6 +424,26 @@ class CloneTests(PorcelainTestCase):
         self.assertRaises(Exception, porcelain.clone, "/nonexistant/repo", target_path)
         self.assertFalse(os.path.exists(target_path))
 
+    def test_fetch_symref(self):
+        f1_1 = make_object(Blob, data=b"f1")
+        trees = {1: [(b"f1", f1_1), (b"f2", f1_1)]}
+        [c1] = build_commit_graph(self.repo.object_store, [[1]], trees)
+        self.repo.refs.set_symbolic_ref(b'HEAD', b'refs/heads/else')
+        self.repo.refs[b"refs/heads/else"] = c1.id
+        target_path = tempfile.mkdtemp()
+        errstream = BytesIO()
+        self.addCleanup(shutil.rmtree, target_path)
+        r = porcelain.clone(
+            self.repo.path, target_path, checkout=False, errstream=errstream
+        )
+        self.addCleanup(r.close)
+        self.assertEqual(r.path, target_path)
+        target_repo = Repo(target_path)
+        self.assertEqual(0, len(target_repo.open_index()))
+        self.assertEqual(c1.id, target_repo.refs[b"refs/heads/else"])
+        self.assertEqual(c1.id, target_repo.refs[b"HEAD"])
+        self.assertEqual({b'HEAD': b'refs/heads/else'}, target_repo.refs.get_symrefs())
+
 
 class InitTests(TestCase):
     def test_non_bare(self):