From a79cd5d5eb048bdd9e78d096f7f2cbf923d85eca Mon Sep 17 00:00:00 2001 Message-Id: From: Mark Wooding Date: Wed, 3 Dec 2008 21:49:23 +0000 Subject: [PATCH] Print conflict details with the new infrastructure (bug #11181) MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Organization: Straylight/Edgeware From: Catalin Marinas The patch modifies the IndexAndWorkTree.merge() function to display pass the conflict information (files) when raising an exception. The logic is similar to the one in the old infrastructure. Signed-off-by: Catalin Marinas Acked-by: Karl Hasselström --- stgit/lib/git.py | 15 ++++++++++----- stgit/lib/transaction.py | 11 ++++++++--- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/stgit/lib/git.py b/stgit/lib/git.py index 0a208ef..e2b4266 100644 --- a/stgit/lib/git.py +++ b/stgit/lib/git.py @@ -677,6 +677,9 @@ class MergeException(exception.StgException): class MergeConflictException(MergeException): """Exception raised when a merge fails due to conflicts.""" + def __init__(self, conflicts): + MergeException.__init__(self) + self.conflicts = conflicts class Index(RunWithEnv): """Represents a git index file.""" @@ -829,12 +832,14 @@ class IndexAndWorktree(RunWithEnvCwd): env = { 'GITHEAD_%s' % base.sha1: 'ancestor', 'GITHEAD_%s' % ours.sha1: 'current', 'GITHEAD_%s' % theirs.sha1: 'patched'}) - r.discard_output() + r.returns([0, 1]) + output = r.output_lines() + if r.exitcode: + # There were conflicts + conflicts = [l for l in output if l.startswith('CONFLICT')] + raise MergeConflictException(conflicts) except run.RunException, e: - if r.exitcode == 1: - raise MergeConflictException() - else: - raise MergeException('Index/worktree dirty') + raise MergeException('Index/worktree dirty') def changed_files(self, tree, pathlimits = []): """Return the set of files in the worktree that have changed with respect to C{tree}. The listing is optionally restricted to diff --git a/stgit/lib/transaction.py b/stgit/lib/transaction.py index 0f414d8..54de127 100644 --- a/stgit/lib/transaction.py +++ b/stgit/lib/transaction.py @@ -94,6 +94,7 @@ class StackTransaction(object): self.__base = self.__stack.base self.__discard_changes = discard_changes self.__bad_head = None + self.__conflicts = None if isinstance(allow_conflicts, bool): self.__allow_conflicts = lambda trans: allow_conflicts else: @@ -201,7 +202,10 @@ class StackTransaction(object): self.__stack.set_head(new_head, self.__msg) if self.__error: - out.error(self.__error) + if self.__conflicts: + out.error(*([self.__error] + self.__conflicts)) + else: + out.error(self.__error) # Write patches. def write(msg): @@ -311,9 +315,10 @@ class StackTransaction(object): tree = iw.index.write_tree() self.__current_tree = tree s = ' (modified)' - except git.MergeConflictException: + except git.MergeConflictException, e: tree = ours merge_conflict = True + self.__conflicts = e.conflicts s = ' (conflict)' except git.MergeException, e: self.__halt(str(e)) @@ -344,7 +349,7 @@ class StackTransaction(object): # Save this update so that we can run it a little later. self.__conflicting_push = update - self.__halt('Merge conflict') + self.__halt("%d merge conflict(s)" % len(self.__conflicts)) else: # Update immediately. update() -- [mdw]