Chromium Code Reviews| Index: gclient.py |
| diff --git a/gclient.py b/gclient.py |
| index 85f144c1faa052298c3c082dbdd2dfd4d453b205..163fe62b333e5324085976880e56497b6d8be529 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,43 @@ 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): |
| + """Use revision/timestamp from 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 != None |
| + parent_revision_date = self.parent.used_scm.GetRevisionDate( |
| + options.revision) |
| + parent_revision = gclient_utils.MakeDateRevision(parent_revision_date) |
| + # 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 |
|
ricow1
2013/04/15 09:13:32
which can can -> which can
kustermann
2013/04/17 13:55:06
Done.
|
| + # can result in dependencies to be checked out at the wrong revision) |
| + if self.url.startswith('/'): |
| + if options.verbose: |
| + print('Not updating revision override from %s to %s. Using ' |
| + 'parent\'s revision %s since we are in the same repository.' |
| + % (options.revision, parent_revision, options.revision)) |
| + else: |
| + if options.verbose: |
| + print('Updating revision override from %s to %s.' % |
| + (options.revision, parent_revision)) |
| + revision_overrides[self.name] = parent_revision |
| + options.revision = parent_revision |
| # Arguments number differs from overridden method |
| # pylint: disable=W0221 |
| @@ -596,22 +600,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 +829,12 @@ class Dependency(gclient_utils.WorkItem, DependencySettings): |
| return tuple(self._file_list) |
| @property |
| + def used_scm(self): |
| + """The scm that was used to checkout self.url. None if nothing has been |
| + checked out""" |
| + return self._used_scm |
| + |
| + @property |
| def file_list_and_children(self): |
| result = list(self.file_list) |
| for d in self.dependencies: |