git/list[1] front-page[2] threads[3] people[4] search[5] about
 

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

From
Karl Hasselström <kha@treskal.com>
Date
Aug 26, 2007, 20:42 UTC
Message-ID
<20070826204259.16700.55770.stgit@yoghurt>
In-Reply-To
<20070826203745.16700.5655.stgit@yoghurt>
From: David Kågedal <davidk@lysator.liu.se>

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

Signed-off-by: David Kågedal <davidk@lysator.liu.se>
Signed-off-by: Karl Hasselström <kha@treskal.com>
---
 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'
Previous: Karl HasselströmNext: Karl Hasselström
Message 6 of 7 in “David's conflict series using my subprocess stuff”
  1. 0/6 David's conflict series using my subprocess stuffKarl Hasselström, Aug 26, 2007
  2. 1/6 Split git.merge into two functionsKarl Hasselström, Aug 26, 2007
  3. 2/6 Leave working dir and index alone after failed (conflicting) pushKarl Hasselström, Aug 26, 2007
  4. 3/6 Added a test case to check what happens when push finds a conflictKarl Hasselström, Aug 26, 2007
  5. 4/6 Simplify merge_recursiveKarl Hasselström, Aug 26, 2007
  6. 5/6 Use the output from merge-recursive to list conflictsKarl Hasselström, Aug 26, 2007
  7. 6/6 Better error message if merge failsKarl Hasselström, Aug 26, 2007

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.