Răsfoiți Sursa

Add and use parse_tree.

Jelmer Vernooij 7 ani în urmă
părinte
comite
c12561a2e1
4 a modificat fișierele cu 42 adăugiri și 9 ștergeri
  1. 3 0
      NEWS
  2. 15 0
      dulwich/objectspec.py
  3. 8 9
      dulwich/porcelain.py
  4. 16 0
      dulwich/tests/test_objectspec.py

+ 3 - 0
NEWS

@@ -25,6 +25,9 @@
 
   * Fix handling of "merge" command with markers. (Antoine Pietri)
 
+  * Support treeish argument to porcelain.reset(), rather than
+    requiring a ref/commit id. (Jelmer Vernooij)
+
  IMPROVEMENTS
 
   * Add basic support for reading ignore files in ``dulwich.ignore``.

+ 15 - 0
dulwich/objectspec.py

@@ -39,6 +39,21 @@ def parse_object(repo, objectish):
     return repo[objectish]
 
 
+def parse_tree(repo, treeish):
+    """Parse a string referring to a tree.
+
+    :param repo: A `Repo` object
+    :param treeish: A string referring to a tree
+    :return: A git object
+    :raise KeyError: If the object can not be found
+    """
+    treeish = to_bytes(treeish)
+    o = repo[treeish]
+    if o.type_name == b"commit":
+        return repo[o.tree]
+    return o
+
+
 def parse_ref(container, refspec):
     """Parse a string referring to a reference.
 

+ 8 - 9
dulwich/porcelain.py

@@ -98,6 +98,7 @@ from dulwich.objects import (
 from dulwich.objectspec import (
     parse_object,
     parse_reftuples,
+    parse_tree,
     )
 from dulwich.pack import (
     write_pack_index,
@@ -698,19 +699,20 @@ def tag_delete(repo, name):
             del r.refs[b"refs/tags/" + name]
 
 
-def reset(repo, mode, committish="HEAD"):
+def reset(repo, mode, treeish="HEAD"):
     """Reset current HEAD to the specified state.
 
     :param repo: Path to repository
     :param mode: Mode ("hard", "soft", "mixed")
+    :param treeish: Treeish to reset to
     """
 
     if mode != "hard":
         raise ValueError("hard is the only mode currently supported")
 
     with open_repo_closing(repo) as r:
-        tree = r[committish].tree
-        r.reset_index(tree)
+        tree = parse_tree(r, treeish)
+        r.reset_index(tree.id)
 
 
 def push(repo, remote_location, refspecs,
@@ -1063,7 +1065,7 @@ def pack_objects(repo, object_ids, packf, idxf, delta_window_size=None):
         write_pack_index(idxf, entries, data_sum)
 
 
-def ls_tree(repo, tree_ish=None, outstream=sys.stdout, recursive=False,
+def ls_tree(repo, treeish=b"HEAD", outstream=sys.stdout, recursive=False,
             name_only=False):
     """List contents of a tree.
 
@@ -1083,12 +1085,9 @@ def ls_tree(repo, tree_ish=None, outstream=sys.stdout, recursive=False,
                 outstream.write(pretty_format_tree_entry(name, mode, sha))
             if stat.S_ISDIR(mode):
                 list_tree(store, sha, name)
-    if tree_ish is None:
-        tree_ish = "HEAD"
     with open_repo_closing(repo) as r:
-        c = r[tree_ish]
-        treeid = c.tree
-        list_tree(r.object_store, treeid, "")
+        tree = parse_tree(r, treeish)
+        list_tree(r.object_store, tree.id, "")
 
 
 def remote_add(repo, name, url):

+ 16 - 0
dulwich/tests/test_objectspec.py

@@ -33,6 +33,7 @@ from dulwich.objectspec import (
     parse_refs,
     parse_reftuple,
     parse_reftuples,
+    parse_tree,
     )
 from dulwich.repo import MemoryRepo
 from dulwich.tests import (
@@ -190,3 +191,18 @@ class ParseReftuplesTests(TestCase):
         r = {b"refs/heads/foo": "bla"}
         self.assertEqual([(b"refs/heads/foo", b"refs/heads/foo", False)],
                          parse_reftuples(r, r, b"refs/heads/foo"))
+
+
+class ParseTreeTests(TestCase):
+    """Test parse_tree."""
+
+    def test_nonexistent(self):
+        r = MemoryRepo()
+        self.assertRaises(KeyError, parse_tree, r, "thisdoesnotexist")
+
+    def test_from_commit(self):
+        r = MemoryRepo()
+        c1, c2, c3 = build_commit_graph(
+                r.object_store, [[1], [2, 1], [3, 1, 2]])
+        self.assertEqual(r[c1.tree], parse_tree(r, c1.id))
+        self.assertEqual(r[c1.tree], parse_tree(r, c1.tree))