| Index: gclient_scm.py
|
| diff --git a/gclient_scm.py b/gclient_scm.py
|
| index bacbb6557626f872eadf440f19f77af9116bf7a3..bdc9666576bf8a246cf4a70816f80a448699bf86 100644
|
| --- a/gclient_scm.py
|
| +++ b/gclient_scm.py
|
| @@ -179,8 +179,25 @@ class GitWrapper(SCMWrapper, scm.GIT):
|
| print("\n_____ %s%s" % (self.relpath, rev_str))
|
|
|
| if not os.path.exists(self.checkout_path):
|
| - self._Run(['clone', url, self.checkout_path],
|
| - cwd=self._root_dir, redirect_stdout=False)
|
| + # Cloning
|
| + for i in range(3):
|
| + try:
|
| + self._Run(['clone', url, self.checkout_path],
|
| + cwd=self._root_dir, redirect_stdout=False)
|
| + break
|
| + except gclient_utils.Error, e:
|
| + # TODO(maruel): Hackish, should be fixed by moving _Run() to
|
| + # CheckCall().
|
| + # Too bad we don't have access to the actual output.
|
| + # We should check for "transfer closed with NNN bytes remaining to
|
| + # read". In the meantime, just make sure .git exists.
|
| + if (e.args[0] == 'git command clone returned 128' and
|
| + os.path.exists(os.path.join(self.checkout_path, '.git'))):
|
| + print str(e)
|
| + print "Retrying..."
|
| + continue
|
| + raise e
|
| +
|
| if revision:
|
| self._Run(['reset', '--hard', revision], redirect_stdout=False)
|
| files = self._Run(['ls-files']).split()
|
| @@ -209,14 +226,18 @@ class GitWrapper(SCMWrapper, scm.GIT):
|
| '\tSee man git-rebase for details.\n'
|
| % (self.relpath, rev_str))
|
|
|
| + # TODO(maruel): Do we need to do an automatic retry here? Probably overkill
|
| 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])
|
| if options.force:
|
| self._Run(['reset', '--hard', merge_base], redirect_stdout=False)
|
| - self._Run(['rebase', '-v', '--onto', new_base, merge_base, cur_branch],
|
| - redirect_stdout=False, checkrc=False)
|
| + try:
|
| + self._Run(['rebase', '-v', '--onto', new_base, merge_base, cur_branch],
|
| + redirect_stdout=False)
|
| + except gclient_utils.Error:
|
| + pass
|
|
|
| # If the rebase generated a conflict, abort and ask user to fix
|
| if self._GetCurrentBranch() is None:
|
| @@ -298,13 +319,13 @@ class GitWrapper(SCMWrapper, scm.GIT):
|
| return None
|
| return branch
|
|
|
| - def _Run(self, args, cwd=None, checkrc=True, redirect_stdout=True):
|
| - # TODO(maruel): Merge with Capture?
|
| + def _Run(self, args, cwd=None, redirect_stdout=True):
|
| + # TODO(maruel): Merge with Capture or better gclient_utils.CheckCall().
|
| if cwd is None:
|
| cwd = self.checkout_path
|
| - stdout=None
|
| + stdout = None
|
| if redirect_stdout:
|
| - stdout=subprocess.PIPE
|
| + stdout = subprocess.PIPE
|
| if cwd == None:
|
| cwd = self.checkout_path
|
| cmd = [self.COMMAND]
|
| @@ -316,7 +337,7 @@ class GitWrapper(SCMWrapper, scm.GIT):
|
| except OSError:
|
| raise gclient_utils.Error("git command '%s' failed to run." %
|
| ' '.join(cmd) + "\nCheck that you have git installed.")
|
| - if checkrc and sp.returncode:
|
| + if sp.returncode:
|
| raise gclient_utils.Error('git command %s returned %d' %
|
| (args[0], sp.returncode))
|
| if output is not None:
|
|
|