gclient: Add better error reporting and handling when there is a rebase conflict
When a rebase generates a conflict, report an error and exit immediately.
If in an existing conflict (no branch), report an error and exit immediately.
Review URL: http://codereview.chromium.org/496003
git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@34459 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/gclient_scm.py b/gclient_scm.py
index 8c7e70f..a3e902c 100644
--- a/gclient_scm.py
+++ b/gclient_scm.py
@@ -140,13 +140,32 @@
new_base = 'origin'
if revision:
new_base = revision
- cur_branch = self._Run(['symbolic-ref', 'HEAD']).split('/')[-1]
+ cur_branch = self._GetCurrentBranch()
+
+ # Check if we are in a rebase conflict
+ if cur_branch is None:
+ raise gclient_utils.Error('\n____ %s%s\n'
+ '\tAlready in a conflict, i.e. (no branch).\n'
+ '\tFix the conflict and run gclient again.\n'
+ '\tOr to abort run:\n\t\tgit-rebase --abort\n'
+ '\tSee man git-rebase for details.\n'
+ % (self.relpath, rev_str))
+
merge_base = self._Run(['merge-base', 'HEAD', new_base])
self._Run(['remote', 'update'], redirect_stdout=False)
files = self._Run(['diff', new_base, '--name-only']).split()
file_list.extend([os.path.join(self.checkout_path, f) for f in files])
self._Run(['rebase', '-v', '--onto', new_base, merge_base, cur_branch],
- redirect_stdout=False)
+ redirect_stdout=False, checkrc=False)
+
+ # If the rebase generated a conflict, abort and ask user to fix
+ if self._GetCurrentBranch() is None:
+ raise gclient_utils.Error('\n____ %s%s\n'
+ '\nConflict while rebasing this branch.\n'
+ 'Fix the conflict and run gclient again.\n'
+ 'See man git-rebase for details.\n'
+ % (self.relpath, rev_str))
+
print "Checked out revision %s." % self.revinfo(options, (), None)
def revert(self, options, args, file_list):
@@ -204,6 +223,15 @@
elif min_ver < ver:
return
+ def _GetCurrentBranch(self):
+ # Returns name of current branch
+ # Returns None if inside a (no branch)
+ tokens = self._Run(['branch']).split()
+ branch = tokens[tokens.index('*') + 1]
+ if branch == '(no':
+ return None
+ return branch
+
def _Run(self, args, cwd=None, checkrc=True, redirect_stdout=True):
# TODO(maruel): Merge with Capture?
if cwd is None: