* diff-tree
* init
* remove
+ * reset
* rev-list
* tag
* update-server-info
# 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)
import tempfile
from dulwich import porcelain
+from dulwich.diff_tree import tree_changes
from dulwich.objects import (
Blob,
Tree,
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)