Add checkout argument to clone. Fixes #503
authorJelmer Vernooij <jelmer@jelmer.uk>
Thu, 12 Apr 2018 22:55:12 +0000 (23:55 +0100)
committerJelmer Vernooij <jelmer@jelmer.uk>
Thu, 12 Apr 2018 22:55:12 +0000 (23:55 +0100)
NEWS
dulwich/porcelain.py
dulwich/repo.py
dulwich/tests/test_repository.py

diff --git a/NEWS b/NEWS
index befe4e69f56bf5bb3f8b40b322c8daf35cc64a5a..91aa4ad4ec221ec18432ac3a384ae45949106740 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -8,6 +8,9 @@
   * When the `DULWICH_PDB` environment variable is set, make
     SIGQUIT open pdb in the 'dulwich' command.
 
+  * Add `checkout` argument to `Repo.clone`.
+    (Jelmer Vernooij, #503)
+
  BUG FIXES
 
   * Fix handling of encoding for tags. (Jelmer Vernooij, #608)
index 912fa7d82f0188733dc41525700304d5c011705b..43f4d411ff0ff6ab97b6302486cec1ea8bbd840c 100644 (file)
@@ -292,6 +292,7 @@ def clone(source, target=None, bare=False, checkout=None,
     :param origin: Name of remote from the repository used to clone
     :return: The new repository
     """
+    # TODO(jelmer): This code overlaps quite a bit with Repo.clone
     if outstream is not None:
         import warnings
         warnings.warn(
index 57d1eddbc0e25dd26cdb3ba0d8bf7ae03bd4e026..9e6fb6e3c547d7bd067a7d26b8a9f0320835958c 100644 (file)
@@ -974,7 +974,7 @@ class Repo(BaseRepo):
         index.write()
 
     def clone(self, target_path, mkdir=True, bare=False,
-              origin=b"origin"):
+              origin=b"origin", checkout=None):
         """Clone this repository.
 
         :param target_path: Target path
@@ -987,6 +987,8 @@ class Repo(BaseRepo):
         if not bare:
             target = self.init(target_path, mkdir=mkdir)
         else:
+            if checkout:
+                raise ValueError("checkout and bare are incompatible")
             target = self.init_bare(target_path, mkdir=mkdir)
         self.fetch(target)
         encoded_path = self.path
@@ -1018,7 +1020,9 @@ class Repo(BaseRepo):
                                          message=ref_message)
             target[b'HEAD'] = head_sha
 
-            if not bare:
+            if checkout is None:
+                checkout = (not bare)
+            if checkout:
                 # Checkout HEAD to target dir
                 target.reset_index()
 
index 7f04128b9323208bce7fe400c6aebc1d2b56e8e2..941e76d9171b4a90ba9234bb1068113f3b6f030d 100644 (file)
@@ -325,6 +325,20 @@ class RepositoryRootTests(TestCase):
         self.addCleanup(shutil.rmtree, tmp_dir)
         r.clone(tmp_dir, mkdir=False, bare=True)
 
+    def test_clone_bare(self):
+        r = self.open_repo('a.git')
+        tmp_dir = self.mkdtemp()
+        self.addCleanup(shutil.rmtree, tmp_dir)
+        t = r.clone(tmp_dir, mkdir=False)
+        t.close()
+
+    def test_clone_checkout_and_bare(self):
+        r = self.open_repo('a.git')
+        tmp_dir = self.mkdtemp()
+        self.addCleanup(shutil.rmtree, tmp_dir)
+        self.assertRaises(ValueError, r.clone, tmp_dir, mkdir=False,
+                          checkout=True, bare=True)
+
     def test_merge_history(self):
         r = self.open_repo('simple_merge.git')
         shas = [e.commit.id for e in r.get_walker()]