Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Unified Diff: gclient.py

Issue 13814012: Changed the behaviour of '--transitive' in gclient.py to use revision instead of timestamp for iden… (Closed) Base URL: https://chromium.googlesource.com/chromium/tools/depot_tools.git@master
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | testing_support/fake_repos.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: gclient.py
diff --git a/gclient.py b/gclient.py
index 85f144c1faa052298c3c082dbdd2dfd4d453b205..3137093f5e2623d3d7c9120442d3acfacf78feb4 100755
--- a/gclient.py
+++ b/gclient.py
@@ -298,6 +298,9 @@ class Dependency(gclient_utils.WorkItem, DependencySettings):
self._processed = False
# This dependency had its hook run
self._hooks_ran = False
+ # This is the scm used to checkout self.url. It may be used by dependencies
+ # to get the datetime of the revision we checked out.
+ self._used_scm = None
if not self.name and self.parent:
raise gclient_utils.Error('Dependency without name')
@@ -538,42 +541,42 @@ class Dependency(gclient_utils.WorkItem, DependencySettings):
self.add_dependency(dep)
self._mark_as_parsed(hooks)
- @staticmethod
def maybeGetParentRevision(
- command, options, parsed_url, parent_name, revision_overrides):
- """If we are performing an update and --transitive is set, set the
- revision to the parent's revision. If we have an explicit revision
- do nothing."""
+ self, command, options, parsed_url, parent_name, revision_overrides):
+ """Uses revision/timestamp of parent if no explicit revision was specified.
+
+ If we are performing an update and --transitive is set, use
+ - the parent's revision if 'self.url' is in the same repository
+ - the parent's timestamp otherwise
+ to update 'self.url'. The used revision/timestamp will be set in
+ 'options.revision'.
+ If we have an explicit revision do nothing.
+ """
if command == 'update' and options.transitive and not options.revision:
_, revision = gclient_utils.SplitUrlRevision(parsed_url)
if not revision:
options.revision = revision_overrides.get(parent_name)
- if options.verbose and options.revision:
- print("Using parent's revision date: %s" % options.revision)
- # If the parent has a revision override, then it must have been
- # converted to date format.
- assert (not options.revision or
- gclient_utils.IsDateRevision(options.revision))
-
- @staticmethod
- def maybeConvertToDateRevision(
- command, options, name, scm, revision_overrides):
- """If we are performing an update and --transitive is set, convert the
- revision to a date-revision (if necessary). Instead of having
- -r 101 replace the revision with the time stamp of 101 (e.g.
- "{2011-18-04}").
- This way dependencies are upgraded to the revision they had at the
- check-in of revision 101."""
- if (command == 'update' and
- options.transitive and
- options.revision and
- not gclient_utils.IsDateRevision(options.revision)):
- revision_date = scm.GetRevisionDate(options.revision)
- revision = gclient_utils.MakeDateRevision(revision_date)
- if options.verbose:
- print("Updating revision override from %s to %s." %
- (options.revision, revision))
- revision_overrides[name] = revision
+ if (options.revision and
+ not gclient_utils.IsDateRevision(options.revision)):
+ assert self.parent and self.parent.used_scm
+ # If this dependency is in the same repository as parent it's url will
+ # start with a slash. If so we take the parent revision instead of
+ # it's timestamp.
+ # (The timestamps of commits in google code are broken -- which can
+ # result in dependencies to be checked out at the wrong revision)
+ if self.url.startswith('/'):
+ if options.verbose:
+ print('Using parent\'s revision %s since we are in the same '
+ 'repository.' % options.revision)
+ else:
+ parent_revision_date = self.parent.used_scm.GetRevisionDate(
+ options.revision)
+ options.revision = gclient_utils.MakeDateRevision(
+ parent_revision_date)
+ if options.verbose:
+ print('Using parent\'s revision date %s since we are in a '
+ 'different repository.' % options.revision)
+ revision_overrides[self.name] = options.revision
# Arguments number differs from overridden method
# pylint: disable=W0221
@@ -596,22 +599,19 @@ class Dependency(gclient_utils.WorkItem, DependencySettings):
# Sadly, pylint doesn't realize that parsed_url is of FileImpl.
# pylint: disable=E1103
options.revision = parsed_url.GetRevision()
- scm = gclient_scm.SVNWrapper(parsed_url.GetPath(),
- self.root.root_dir,
- self.name)
- scm.RunCommand('updatesingle', options,
- args + [parsed_url.GetFilename()],
- file_list)
+ self._used_scm = gclient_scm.SVNWrapper(
+ parsed_url.GetPath(), self.root.root_dir, self.name)
+ self._used_scm.RunCommand('updatesingle',
+ options, args + [parsed_url.GetFilename()], file_list)
else:
# Create a shallow copy to mutate revision.
options = copy.copy(options)
options.revision = revision_overrides.get(self.name)
self.maybeGetParentRevision(
command, options, parsed_url, self.parent.name, revision_overrides)
- scm = gclient_scm.CreateSCM(parsed_url, self.root.root_dir, self.name)
- scm.RunCommand(command, options, args, file_list)
- self.maybeConvertToDateRevision(
- command, options, self.name, scm, revision_overrides)
+ self._used_scm = gclient_scm.CreateSCM(
+ parsed_url, self.root.root_dir, self.name)
+ self._used_scm.RunCommand(command, options, args, file_list)
file_list = [os.path.join(self.name, f.strip()) for f in file_list]
# TODO(phajdan.jr): We should know exactly when the paths are absolute.
@@ -828,6 +828,11 @@ class Dependency(gclient_utils.WorkItem, DependencySettings):
return tuple(self._file_list)
@property
+ def used_scm(self):
+ """SCMWrapper instance for this dependency or None if not processed yet."""
+ return self._used_scm
+
+ @property
def file_list_and_children(self):
result = list(self.file_list)
for d in self.dependencies:
« no previous file with comments | « no previous file | testing_support/fake_repos.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698