diff --git a/gclient_scm.py b/gclient_scm.py index f1b62f7f0..635590619 100644 --- a/gclient_scm.py +++ b/gclient_scm.py @@ -638,6 +638,7 @@ class GitWrapper(SCMWrapper): raise gclient_utils.Error("Unsupported argument(s): %s" % ",".join(args)) + current_revision = None url, deps_revision = gclient_utils.SplitUrlRevision(self.url) revision = deps_revision managed = True @@ -713,11 +714,11 @@ class GitWrapper(SCMWrapper): self._UpdateMirrorIfNotContains(mirror, options, rev_type, revision) try: - self._Clone(revision, url, options) + current_revision = self._Clone(revision, url, options) except subprocess2.CalledProcessError as e: logging.warning('Clone failed due to: %s', e) self._DeleteOrMove(options.force) - self._Clone(revision, url, options) + current_revision = self._Clone(revision, url, options) if file_list is not None: files = self._Capture( ['-c', 'core.quotePath=false', 'ls-files']).splitlines() @@ -790,15 +791,18 @@ class GitWrapper(SCMWrapper): os.path.join(self.checkout_path, '.git', 'objects', 'info', 'alternates'), 'a') as fh: fh.write("\n" + os.path.join(url, 'objects')) - self._EnsureValidHeadObjectOrCheckout(revision, options, url) + current_revision = self._EnsureValidHeadObjectOrCheckout( + revision, options, url) self._FetchAndReset(revision, file_list, options) return_early = True else: - self._EnsureValidHeadObjectOrCheckout(revision, options, url) + current_revision = self._EnsureValidHeadObjectOrCheckout( + revision, options, url) if return_early: - return self._Capture(['rev-parse', '--verify', 'HEAD']) + return current_revision or self._Capture( + ['rev-parse', '--verify', 'HEAD']) cur_branch = self._GetCurrentBranch() @@ -878,7 +882,11 @@ class GitWrapper(SCMWrapper): if not (options.force or options.reset): self._CheckClean(revision) self._CheckDetachedHead(revision, options) - if self._Capture(['rev-list', '-n', '1', 'HEAD']) == revision: + + if not current_revision: + current_revision = self._Capture( + ['rev-list', '-n', '1', 'HEAD']) + if current_revision == revision: self.Print('Up-to-date; skipping checkout.') else: # 'git checkout' may need to overwrite existing untracked files. @@ -1061,10 +1069,12 @@ class GitWrapper(SCMWrapper): self.Print('_____ removing unversioned directory %s' % path) gclient_utils.rmtree(full_path) - rev_hash = self._Capture(['rev-parse', '--verify', 'HEAD']) + if not current_revision: + current_revision = self._Capture(['rev-parse', '--verify', 'HEAD']) if verbose: - self.Print(f'Checked out revision {rev_hash}', timestamp=False) - return rev_hash + self.Print(f'Checked out revision {current_revision}', + timestamp=False) + return current_revision def revert(self, options, _args, file_list): """Reverts local modifications. @@ -1288,6 +1298,7 @@ class GitWrapper(SCMWrapper): 'in this repo, you should use \'git checkout \' to switch \n' 'to an existing branch or use \'git checkout %s -b \' to\n' 'create a new branch for your work.') % (revision, self.remote)) + return revision def _AskForData(self, prompt, options): if options.jobs > 1: @@ -1397,7 +1408,7 @@ class GitWrapper(SCMWrapper): # on most git operations. Since git cache is used, just deleted the .git # folder, and re-create it by cloning. try: - self._Capture(['rev-list', '-n', '1', 'HEAD']) + return self._Capture(['rev-list', '-n', '1', 'HEAD']) except subprocess2.CalledProcessError as e: if (b'fatal: bad object HEAD' in e.stderr and self.cache_dir and self.cache_dir in url): @@ -1406,9 +1417,8 @@ class GitWrapper(SCMWrapper): 'the current commit points to no longer existing object.\n' '%s' % e)) self._DeleteOrMove(options.force) - self._Clone(revision, url, options) - else: - raise + return self._Clone(revision, url, options) + raise def _IsRebasing(self): # Check for any of REBASE-i/REBASE-m/REBASE/AM. Unfortunately git