Commit 384039b1 authored by sbc@chromium.org's avatar sbc@chromium.org

Improve error handling in git-rebase-update

Don't discard stderr from failed rebase operations
I had an issue where stdout of the failed rebase was
empty but stderr contained:
First, rewinding head to replay your work on top of it...
Dirty index: cannot apply patches (dirty: internal_gyp
third_party/html_office).

Also, in my case the second rebase was actually succeeding
for some reason, which is clearly no expected, so assert
in this case.

BUG=410339

Review URL: https://codereview.chromium.org/645763002

git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@292444 0039d316-1c4b-4281-b951-d872f2087c98
parent 09b2920a
...@@ -497,7 +497,7 @@ def parse_commitrefs(*commitrefs): ...@@ -497,7 +497,7 @@ def parse_commitrefs(*commitrefs):
raise BadCommitRefException(commitrefs) raise BadCommitRefException(commitrefs)
RebaseRet = collections.namedtuple('RebaseRet', 'success message') RebaseRet = collections.namedtuple('RebaseRet', 'success stdout stderr')
def rebase(parent, start, branch, abort=False): def rebase(parent, start, branch, abort=False):
...@@ -521,11 +521,11 @@ def rebase(parent, start, branch, abort=False): ...@@ -521,11 +521,11 @@ def rebase(parent, start, branch, abort=False):
if TEST_MODE: if TEST_MODE:
args.insert(0, '--committer-date-is-author-date') args.insert(0, '--committer-date-is-author-date')
run('rebase', *args) run('rebase', *args)
return RebaseRet(True, '') return RebaseRet(True, '', '')
except subprocess2.CalledProcessError as cpe: except subprocess2.CalledProcessError as cpe:
if abort: if abort:
run('rebase', '--abort') run('rebase', '--abort')
return RebaseRet(False, cpe.stdout) return RebaseRet(False, cpe.stdout, cpe.stderr)
def remove_merge_base(branch): def remove_merge_base(branch):
......
...@@ -130,7 +130,8 @@ def rebase_branch(branch, parent, start_hash): ...@@ -130,7 +130,8 @@ def rebase_branch(branch, parent, start_hash):
if git.hash_one(parent) != start_hash: if git.hash_one(parent) != start_hash:
# Try a plain rebase first # Try a plain rebase first
print 'Rebasing:', branch print 'Rebasing:', branch
if not git.rebase(parent, start_hash, branch, abort=True).success: rebase_ret = git.rebase(parent, start_hash, branch, abort=True)
if not rebase_ret.success:
# TODO(iannucci): Find collapsible branches in a smarter way? # TODO(iannucci): Find collapsible branches in a smarter way?
print "Failed! Attempting to squash", branch, "...", print "Failed! Attempting to squash", branch, "...",
squash_branch = branch+"_squash_attempt" squash_branch = branch+"_squash_attempt"
...@@ -148,14 +149,19 @@ def rebase_branch(branch, parent, start_hash): ...@@ -148,14 +149,19 @@ def rebase_branch(branch, parent, start_hash):
git.rebase(parent, start_hash, branch) git.rebase(parent, start_hash, branch)
else: else:
# rebase and leave in mid-rebase state. # rebase and leave in mid-rebase state.
git.rebase(parent, start_hash, branch) # This second rebase attempt should always fail in the same
# way that the first one does. If it magically succeeds then
# something very strange has happened.
second_rebase_ret = git.rebase(parent, start_hash, branch)
assert(not second_rebase_ret.success)
print "Failed!" print "Failed!"
print print
print "Here's what git-rebase had to say:" print "Here's what git-rebase (squashed) had to say:"
print squash_ret.message
print print
print squash_ret.stdout
print squash_ret.stderr
print textwrap.dedent( print textwrap.dedent(
""" """\
Squashing failed. You probably have a real merge conflict. Squashing failed. You probably have a real merge conflict.
Your working copy is in mid-rebase. Either: Your working copy is in mid-rebase. Either:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment