Add porcelain 'reset'.
authorRyan Faulkner <rfaulk@yahoo-inc.com>
Sat, 25 Jan 2014 01:54:41 +0000 (01:54 +0000)
committerJelmer Vernooij <jelmer@samba.org>
Sat, 25 Jan 2014 01:54:41 +0000 (01:54 +0000)
dulwich/porcelain.py
dulwich/tests/test_porcelain.py

index cbf5a9180281b4a5c8587cfb353b8bf8d7edbc3d..be464e806da08008e08cf75bd4a6164cad7a9551 100644 (file)
@@ -43,6 +43,7 @@ Currently implemented:
  * diff-tree
  * init
  * remove
+ * reset
  * rev-list
  * tag
  * update-server-info
@@ -365,3 +366,20 @@ def tag(repo, tag, author, message):
     # Add tag to the object store
     r.object_store.add_object(tag_obj)
     r.refs['refs/tags/' + tag] = tag_obj.id
+
+
+def reset(repo, mode, committish="HEAD"):
+    """Reset current HEAD to the specified state.
+
+    :param repo: Path to repository
+    :param mode: Mode ("hard", "soft", "mixed")
+    """
+
+    if mode != "hard":
+        raise ValueError("hard is the only mode currently supported")
+
+    r = open_repo(repo)
+
+    indexfile = r.index_path()
+    tree = r[committish].tree
+    index.build_index_from_tree(r.path, indexfile, r.object_store, tree)
index bfce527f6bd8150ab37f0ce464802404009eac62..08e278f42560e235b9a50a13b71266b489aa116a 100644 (file)
@@ -25,6 +25,7 @@ import tarfile
 import tempfile
 
 from dulwich import porcelain
+from dulwich.diff_tree import tree_changes
 from dulwich.objects import (
     Blob,
     Tree,
@@ -343,3 +344,30 @@ class TagTests(PorcelainTestCase):
 
         tags = self.repo.refs.as_dict("refs/tags")
         self.assertEquals(tags.keys()[0], tag)
+
+
+class ResetTests(PorcelainTestCase):
+
+    def test_hard_head(self):
+        f = open(os.path.join(self.repo.path, 'foo'), 'w')
+        try:
+            f.write("BAR")
+        finally:
+            f.close()
+        porcelain.add(self.repo.path, paths=["foo"])
+        porcelain.commit(self.repo.path, message="Some message")
+
+        f = open(os.path.join(self.repo.path, 'foo'), 'w')
+        try:
+            f.write("OOH")
+        finally:
+            f.close()
+
+        porcelain.reset(self.repo, "hard", "HEAD")
+
+        index = self.repo.open_index()
+        changes = list(tree_changes(self.repo,
+                       index.commit(self.repo.object_store),
+                       self.repo['HEAD'].tree))
+
+        self.assertEquals([], changes)