Browse Source

Merge support for ref argument to do_commit, with some tweaks.

Jelmer Vernooij 13 years ago
parent
commit
60ed7858ca
3 changed files with 37 additions and 5 deletions
  1. 4 0
      NEWS
  2. 7 5
      dulwich/repo.py
  3. 26 0
      dulwich/tests/test_repository.py

+ 4 - 0
NEWS

@@ -1,5 +1,9 @@
 0.8.1	UNRELEASED
 
+ FEATURES
+
+  * Repo.do_commit has a new argument 'ref'.
+
 0.8.0	2011-08-07
 
  FEATURES

+ 7 - 5
dulwich/repo.py

@@ -1004,7 +1004,8 @@ class BaseRepo(object):
     def do_commit(self, message, committer=None,
                   author=None, commit_timestamp=None,
                   commit_timezone=None, author_timestamp=None,
-                  author_timezone=None, tree=None, encoding=None):
+                  author_timezone=None, tree=None, encoding=None,
+                  ref='HEAD'):
         """Create a new commit.
 
         :param message: Commit message
@@ -1018,6 +1019,7 @@ class BaseRepo(object):
         :param tree: SHA1 of the tree root to use (if not specified the
             current index will be committed).
         :param encoding: Encoding
+        :param ref: Ref to commit to
         :return: New commit SHA1
         """
         import time
@@ -1053,18 +1055,18 @@ class BaseRepo(object):
             c.encoding = encoding
         c.message = message
         try:
-            old_head = self.refs["HEAD"]
+            old_head = self.refs[ref]
             c.parents = [old_head]
             self.object_store.add_object(c)
-            ok = self.refs.set_if_equals("HEAD", old_head, c.id)
+            ok = self.refs.set_if_equals(ref, old_head, c.id)
         except KeyError:
             c.parents = []
             self.object_store.add_object(c)
-            ok = self.refs.add_if_new("HEAD", c.id)
+            ok = self.refs.add_if_new(ref, c.id)
         if not ok:
             # Fail if the atomic compare-and-swap failed, leaving the commit and
             # all its objects as garbage.
-            raise CommitError("HEAD changed during commit")
+            raise CommitError("%s changed during commit" % (ref,))
 
         return c.id
 

+ 26 - 0
dulwich/tests/test_repository.py

@@ -445,6 +445,32 @@ class BuildRepoTests(TestCase):
         self.assertEqual(r[self._root_commit].tree, new_commit.tree)
         self.assertEqual('failed commit', new_commit.message)
 
+    def test_commit_branch(self):
+        r = self._repo
+
+        commit_sha = r.do_commit('commit to branch',
+             committer='Test Committer <test@nodomain.com>',
+             author='Test Author <test@nodomain.com>',
+             commit_timestamp=12395, commit_timezone=0,
+             author_timestamp=12395, author_timezone=0,
+             ref="refs/heads/new_branch")
+        self.assertEqual(self._root_commit, r["HEAD"].id)
+        self.assertEqual(commit_sha, r["refs/heads/new_branch"].id)
+        self.assertEqual([], r[commit_sha].parents)
+        self.assertTrue("refs/heads/new_branch" in r)
+
+        new_branch_head = commit_sha
+
+        commit_sha = r.do_commit('commit to branch 2',
+             committer='Test Committer <test@nodomain.com>',
+             author='Test Author <test@nodomain.com>',
+             commit_timestamp=12395, commit_timezone=0,
+             author_timestamp=12395, author_timezone=0,
+             ref="refs/heads/new_branch")
+        self.assertEqual(self._root_commit, r["HEAD"].id)
+        self.assertEqual(commit_sha, r["refs/heads/new_branch"].id)
+        self.assertEqual([new_branch_head], r[commit_sha].parents)
+
     def test_stage_deleted(self):
         r = self._repo
         os.remove(os.path.join(r.path, 'a'))