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: