Browse Source

Pull in tags during dulwich.porcelain.clone. Fixes #408

Jelmer Vernooij 8 years ago
parent
commit
958e827ab4
3 changed files with 16 additions and 2 deletions
  1. 3 0
      NEWS
  2. 9 1
      dulwich/porcelain.py
  3. 4 1
      dulwich/tests/test_porcelain.py

+ 3 - 0
NEWS

@@ -7,6 +7,9 @@
 
   * Fix dulwich.porcelain.pull() on Python3. (Jelmer Vernooij, #451)
 
+  * Properly pull in tags during dulwich.porcelain.clone.
+    (Jelmer Vernooij, #408)
+
  CHANGES
 
   * Changed license from "GNU General Public License, version 2.0 or later"

+ 9 - 1
dulwich/porcelain.py

@@ -227,7 +227,7 @@ def init(path=".", bare=False):
         return Repo.init(path)
 
 
-def clone(source, target=None, bare=False, checkout=None, errstream=default_bytes_err_stream, outstream=None):
+def clone(source, target=None, bare=False, checkout=None, errstream=default_bytes_err_stream, outstream=None, origin="origin"):
     """Clone a local or remote git repository.
 
     :param source: Path or URL for source repository
@@ -263,6 +263,14 @@ def clone(source, target=None, bare=False, checkout=None, errstream=default_byte
         remote_refs = client.fetch(host_path, r,
             determine_wants=r.object_store.determine_wants_all,
             progress=errstream.write)
+        r.refs.import_refs(
+            b'refs/remotes/' + origin,
+            {n[len('refs/heads/'):]: v for (n, v) in remote_refs.iteritems()
+                if n.startswith('refs/heads/')})
+        r.refs.import_refs(
+            b'refs/tags',
+            {n[len('refs/tags/'):]: v for (n, v) in remote_refs.iteritems()
+                if n.startswith('refs/tags/')})
         r[b"HEAD"] = remote_refs[b"HEAD"]
         if checkout:
             errstream.write(b'Checking out HEAD\n')

+ 4 - 1
dulwich/tests/test_porcelain.py

@@ -112,13 +112,16 @@ class CloneTests(PorcelainTestCase):
         c1, c2, c3 = build_commit_graph(self.repo.object_store,
                                         commit_spec, trees)
         self.repo.refs[b"refs/heads/master"] = c3.id
+        self.repo.refs[b"refs/tags/foo"] = c3.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.assertEqual(r.path, target_path)
-        self.assertEqual(Repo(target_path).head(), c3.id)
+        target_repo = Repo(target_path)
+        self.assertEqual(target_repo.head(), c3.id)
+        self.assertEquals(c3.id, target_repo.refs['refs/tags/foo'])
         self.assertTrue(b'f1' not in os.listdir(target_path))
         self.assertTrue(b'f2' not in os.listdir(target_path))