Explorar el Código

Fix handling of HEAD in porcelain.clone.

Jelmer Vernooij hace 8 años
padre
commit
7724215ad8
Se han modificado 3 ficheros con 23 adiciones y 3 borrados
  1. 3 0
      NEWS
  2. 5 2
      dulwich/porcelain.py
  3. 15 1
      dulwich/tests/test_porcelain.py

+ 3 - 0
NEWS

@@ -19,6 +19,9 @@
  * Handle multi-line quoted values in config files.
    (Jelmer Vernooij, #495)
 
+ * Allow porcelain.clone of repository without HEAD.
+   (Jelmer Vernooij, #501)
+
 0.16.3	2016-01-14
 
  TEST FIXES

+ 5 - 2
dulwich/porcelain.py

@@ -285,7 +285,10 @@ def clone(source, target=None, bare=False, checkout=None,
             {n[len(b'refs/tags/'):]: v for (n, v) in remote_refs.items()
                 if n.startswith(b'refs/tags/') and
                 not n.endswith(ANNOTATED_TAG_SUFFIX)})
-        r[b"HEAD"] = remote_refs[b"HEAD"]
+        if b"HEAD" in remote_refs and not bare:
+            # TODO(jelmer): Support symref capability,
+            # https://github.com/jelmer/dulwich/issues/485
+            r[b"HEAD"] = remote_refs[b"HEAD"]
         target_config = r.get_config()
         if not isinstance(source, bytes):
             source = source.encode(DEFAULT_ENCODING)
@@ -293,7 +296,7 @@ def clone(source, target=None, bare=False, checkout=None,
         target_config.set((b'remote', b'origin'), b'fetch',
             b'+refs/heads/*:refs/remotes/origin/*')
         target_config.write_to_path()
-        if checkout:
+        if checkout and b"HEAD" in r.refs:
             errstream.write(b'Checking out HEAD\n')
             r.reset_index()
     except:

+ 15 - 1
dulwich/tests/test_porcelain.py

@@ -172,7 +172,7 @@ class CloneTests(PorcelainTestCase):
         r = porcelain.clone(self.repo.path, target_path,
                             bare=True, errstream=errstream)
         self.assertEqual(r.path, target_path)
-        self.assertEqual(Repo(target_path).head(), c3.id)
+        self.assertRaises(KeyError, Repo(target_path).head)
         self.assertFalse(b'f1' in os.listdir(target_path))
         self.assertFalse(b'f2' in os.listdir(target_path))
 
@@ -183,12 +183,26 @@ class CloneTests(PorcelainTestCase):
 
         (c1, ) = build_commit_graph(self.repo.object_store, commit_spec, trees)
         self.repo.refs[b"refs/heads/master"] = c1.id
+        self.repo.refs[b"HEAD"] = c1.id
         target_path = tempfile.mkdtemp()
         errstream = BytesIO()
         self.addCleanup(shutil.rmtree, target_path)
         self.assertRaises(ValueError, porcelain.clone, self.repo.path,
             target_path, checkout=True, bare=True, errstream=errstream)
 
+    def test_no_head_no_checkout(self):
+        f1_1 = make_object(Blob, data=b'f1')
+        commit_spec = [[1]]
+        trees = {1: [(b'f1', f1_1), (b'f2', f1_1)]}
+
+        (c1, ) = build_commit_graph(self.repo.object_store, commit_spec, trees)
+        self.repo.refs[b"refs/heads/master"] = c1.id
+        target_path = tempfile.mkdtemp()
+        errstream = BytesIO()
+        self.addCleanup(shutil.rmtree, target_path)
+        porcelain.clone(self.repo.path, target_path, checkout=True,
+            errstream=errstream)
+
 
 class InitTests(TestCase):