2
0
Jelmer Vernooij 13 жил өмнө
parent
commit
cbc2e83cdc

+ 2 - 0
NEWS

@@ -4,6 +4,8 @@
 
   * Repo.do_commit has a new argument 'ref'.
 
+  * New ``Repo.clone`` method. (Jelmer Vernooij, #725369)
+
 0.8.0	2011-08-07
 
  FEATURES

+ 25 - 1
dulwich/repo.py

@@ -26,7 +26,6 @@ import errno
 import os
 
 from dulwich.errors import (
-    MissingCommitError,
     NoIndexPresent,
     NotBlobError,
     NotCommitError,
@@ -1175,6 +1174,31 @@ class Repo(BaseRepo):
                     blob.id, 0)
         index.write()
 
+    def clone(self, target_path, mkdir=True, bare=False, origin="origin"):
+        """Clone this repository.
+
+        :param target_path: Target path
+        :param mkdir: Create the target directory
+        :param bare: Whether to create a bare repository
+        :return: Created repository
+        """
+        if not bare:
+            target = self.init(target_path, mkdir=mkdir)
+        else:
+            target = self.init_bare(target_path)
+        self.fetch(target)
+        target.refs.import_refs(
+            'refs/remotes/'+origin, self.refs.as_dict('refs/heads'))
+        target.refs.import_refs(
+            'refs/tags', self.refs.as_dict('refs/tags'))
+        try:
+            target.refs.add_if_new(
+                'refs/heads/master',
+                self.refs['refs/heads/master'])
+        except KeyError:
+            pass
+        return target
+
     def __repr__(self):
         return "<Repo at %r>" % self.path
 

+ 19 - 0
dulwich/tests/test_repository.py

@@ -254,6 +254,25 @@ class RepositoryTests(TestCase):
         self.assertEqual(shas, [r.head(),
                                 '2a72d929692c41d8554c07f6301757ba18a65d91'])
 
+    def test_clone(self):
+        r = self._repo = open_repo('a.git')
+        tmp_dir = tempfile.mkdtemp()
+        self.addCleanup(shutil.rmtree, tmp_dir)
+        t = r.clone(tmp_dir, mkdir=False)
+        self.assertEqual({
+            'HEAD': 'a90fa2d900a17e99b433217e988c4eb4a2e9a097',
+            'refs/remotes/origin/master':
+                'a90fa2d900a17e99b433217e988c4eb4a2e9a097',
+            'refs/heads/master': 'a90fa2d900a17e99b433217e988c4eb4a2e9a097',
+            'refs/tags/mytag': '28237f4dc30d0d462658d6b937b08a0f0b6ef55a',
+            'refs/tags/mytag-packed':
+                'b0931cadc54336e78a1d980420e3268903b57a50',
+            }, t.refs.as_dict())
+        history = t.revision_history(t.head())
+        shas = [c.sha().hexdigest() for c in history]
+        self.assertEqual(shas, [t.head(),
+                         '2a72d929692c41d8554c07f6301757ba18a65d91'])
+
     def test_merge_history(self):
         r = self._repo = open_repo('simple_merge.git')
         history = r.revision_history(r.head())