Ver Fonte

Fix handling of empty repositories. Fixes #570

Jelmer Vernooij há 7 anos atrás
pai
commit
2e633f526a
5 ficheiros alterados com 21 adições e 12 exclusões
  1. 5 0
      NEWS
  2. 1 1
      dulwich/client.py
  3. 11 7
      dulwich/porcelain.py
  4. 3 3
      dulwich/tests/test_client.py
  5. 1 1
      dulwich/tests/test_porcelain.py

+ 5 - 0
NEWS

@@ -1,5 +1,10 @@
 0.18.6	UNRELEASED
 
+ BUG FIXES
+
+  * Fix handling of empty repositories in ``porcelain.clone``.
+   (#570, Jelmer Vernooij)
+
 0.18.5	2017-10-29
 
  BUG FIXES

+ 1 - 1
dulwich/client.py

@@ -203,7 +203,7 @@ def read_pkt_refs(proto):
         refs[ref] = sha
 
     if len(refs) == 0:
-        return None, set([])
+        return {}, set([])
     if refs == {CAPABILITIES_REF: ZERO_SHA}:
         refs = {}
     return refs, set(server_capabilities)

+ 11 - 7
dulwich/porcelain.py

@@ -317,10 +317,6 @@ 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)})
-        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)
@@ -329,9 +325,17 @@ def clone(source, target=None, bare=False, checkout=None,
             (b'remote', origin), b'fetch',
             b'+refs/heads/*:refs/remotes/' + origin + b'/*')
         target_config.write_to_path()
-        if checkout and b"HEAD" in r.refs:
-            errstream.write(b'Checking out HEAD\n')
-            r.reset_index()
+        if checkout and not bare:
+            # TODO(jelmer): Support symref capability,
+            # https://github.com/jelmer/dulwich/issues/485
+            try:
+                head = r[remote_refs[b"HEAD"]]
+            except KeyError:
+                pass
+            else:
+                r[b'HEAD'] = head.id
+                errstream.write(b'Checking out ' + head.id + b'\n')
+                r.reset_index(head.tree)
     except BaseException:
         r.close()
         raise

+ 3 - 3
dulwich/tests/test_client.py

@@ -131,10 +131,10 @@ class GitClientTests(TestCase):
         self.rin.seek(0)
 
         def check_heads(heads):
-            self.assertIs(heads, None)
+            self.assertEqual(heads, {})
             return []
         ret = self.client.fetch_pack(b'/', check_heads, None, None)
-        self.assertIs(None, ret.refs)
+        self.assertEqual({}, ret.refs)
         self.assertEqual({}, ret.symrefs)
 
     def test_fetch_pack_ignores_magic_ref(self):
@@ -150,7 +150,7 @@ class GitClientTests(TestCase):
             self.assertEquals({}, heads)
             return []
         ret = self.client.fetch_pack(b'bla', check_heads, None, None, None)
-        self.assertIs(None, ret.refs)
+        self.assertEqual({}, ret.refs)
         self.assertEqual({}, ret.symrefs)
         self.assertEqual(self.rout.getvalue(), b'0000')
 

+ 1 - 1
dulwich/tests/test_porcelain.py

@@ -125,7 +125,7 @@ class CloneTests(PorcelainTestCase):
                             checkout=False, errstream=errstream)
         self.assertEqual(r.path, target_path)
         target_repo = Repo(target_path)
-        self.assertEqual(target_repo.head(), c3.id)
+        self.assertRaises(KeyError, target_repo.head)
         self.assertEqual(c3.id, target_repo.refs[b'refs/tags/foo'])
         self.assertTrue(b'f1' not in os.listdir(target_path))
         self.assertTrue(b'f2' not in os.listdir(target_path))