gbp.git.repository: Add a "git merge-base" wrapper
authorDaniel Dehennin <daniel.dehennin@baby-gnu.org>
Sun, 13 May 2012 18:37:11 +0000 (20:37 +0200)
committerGuido Günther <agx@sigxcpu.org>
Mon, 14 May 2012 11:16:15 +0000 (13:16 +0200)
Closes: #672642
Signed-off-by: Guido Günther <agx@sigxcpu.org>
gbp/git/repository.py
tests/test_GitRepository.py

index 2cc5eda..16bad60 100644 (file)
@@ -299,6 +299,26 @@ class GitRepository(object):
         remote += merge.replace("refs/heads","", 1)
         return remote
 
+    def get_merge_base(self, commit1, commit2):
+        """
+        Get the common ancestor between two commits
+
+        @param commit1: commit SHA1 or name of a branch or tag
+        @type commit1: C{str}
+        @param commit2: commit SHA1 or name of a branch or tag
+        @type commit2: C{str}
+        @return: SHA1 of the common ancestor
+        @rtype: C{str}
+        """
+        args = GitArgs()
+        args.add(commit1)
+        args.add(commit2)
+        sha1, stderr, ret = self._git_inout('merge-base', args.args, capture_stderr=True)
+        if not ret:
+            return sha1.strip()
+        else:
+            raise GitRepositoryError("Failed to get common ancestor: %s" % stderr.strip())
+
     def merge(self, commit, verbose=False, edit=False):
         """
         Merge changes from the named commit into the current branch
index 4367f93..2157d80 100644 (file)
@@ -631,6 +631,24 @@ def test_update_submodules():
     >>> repo.update_submodules()
     """
 
+def test_get_merge_base():
+    """
+    Find the common ancestor of two objects
+
+    Methods tested:
+        - L{gbp.git.GitRepository.get_merge_bsae}
+
+    >>> import gbp.git
+    >>> repo = gbp.git.GitRepository(repo_dir)
+    >>> sha1 = repo.get_merge_base('master', 'foo')
+    >>> len(sha1)
+    40
+    >>> repo.get_merge_base('master', 'doesnotexist')
+    Traceback (most recent call last):
+    ...
+    GitRepositoryError: Failed to get common ancestor: fatal: Not a valid object name doesnotexist
+    """
+
 def test_teardown():
     """
     Perform the teardown