From a79cd5d5eb048bdd9e78d096f7f2cbf923d85eca Mon Sep 17 00:00:00 2001 From: Catalin Marinas 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 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() -- 2.11.0