Subject: [StGIT PATCH 5/6] Use the output from merge-recursive to list conflicts

From: Karl Hasselström <[email-masked]>
Date: Sun, 26 Aug 2007 22:42:59 +0200

From: David Kågedal <[email-masked]>

merge-recursive already has useful information about what the conflicts
were, so we reuse that when pushing.

Signed-off-by: David Kågedal <[email-masked]>
Signed-off-by: Karl Hasselström <[email-masked]>

---

 stgit/git.py   |   22 +++++++++++++++++-----
 stgit/stack.py |    2 ++
 2 files changed, 19 insertions(+), 5 deletions(-)

diff --git a/stgit/git.py b/stgit/git.py
index 173cc4b..a185f19 100644
--- a/stgit/git.py
+++ b/stgit/git.py
@@ -39,6 +39,14 @@ class GitRunException(GitException):
 class GRun(Run):
     exc = GitRunException
 
+class GitConflictException(GitException):
+    def __init__(self, conflicts):
+        GitException.__init__(self)
+        self.conflicts = conflicts
+    def __str__(self):
+        return "%d conflicts" % len(self.conflicts)
+    def list(self):
+        out.info(*self.conflicts)
 
 #
 # Classes
@@ -642,11 +650,15 @@ def merge_recursive(base, head1, head2):
     """
     refresh_index()
 
-    try:
-        # discard output to mask the verbose prints of the tool
-        GRun('git-merge-recursive', base, '--', head1, head2).discard_output()
-    except GitRunException:
-        raise GitException, 'GIT index merging failed (possible conflicts)'
+    p = GRun('git-merge-recursive', base, '--', head1, head2).returns([0, 1])
+    output = p.output_lines()
+    if p.exitcode == 0:
+        # No problems
+        return
+    else: # exitcode == 1
+        # There were conflicts
+        conflicts = [l for l in output if l.startswith('CONFLICT')]
+        raise GitConflictException(conflicts)
 
 def merge(base, head1, head2):
     """Perform a 3-way merge between base, head1 and head2 into the
diff --git a/stgit/stack.py b/stgit/stack.py
index eb0114e..d2ca0e2 100644
--- a/stgit/stack.py
+++ b/stgit/stack.py
@@ -1075,6 +1075,8 @@ class Series(PatchSet):
                 # merge can fail but the patch needs to be pushed
                 try:
                     git.merge_recursive(bottom, head, top)
+                except git.GitConflictException, ex:
+                    ex.list()
                 except git.GitException, ex:
                     out.error('The merge failed during "push".',
                               'Use "refresh" after fixing the conflicts or'