| Index: gclient.py
|
| diff --git a/gclient.py b/gclient.py
|
| index 7246cdeac47383317023d1fa6ab0d1c89c0a51bb..5839f00c3ae9e0c9830b4d33a4e9814a2e33f35e 100644
|
| --- a/gclient.py
|
| +++ b/gclient.py
|
| @@ -506,31 +506,33 @@ solutions = [
|
| def _EnforceRevisions(self, solutions):
|
| """Checks for revision overrides."""
|
| revision_overrides = {}
|
| - solutions = [s['name'] for s in solutions]
|
| - if self._options.revisions:
|
| - revision = self._options.revisions[0]
|
| - # Ignore solution@
|
| - rev = revision
|
| - if '@' in revision:
|
| - rev = revision.split('@', 1)[1]
|
| - revision_overrides[solutions[0]] = rev
|
| -
|
| - if len(self._options.revisions) > 1:
|
| - # Enforce solution@rev format for following params.
|
| - for revision in self._options.revisions[1:]:
|
| - if not '@' in revision:
|
| - raise gclient_utils.Error(
|
| - 'Specify the full dependency when specifying a revision number '
|
| - 'for non-primary solution.')
|
| - sol, rev = revision.split("@", 1)
|
| - # Disallow conflicting revs
|
| - if revision_overrides.get(sol, rev) != rev:
|
| - raise gclient_utils.Error(
|
| - 'Conflicting revision numbers specified for %s: %s and %s.' %
|
| - (sol, revision_overrides[sol], rev))
|
| - if not sol in solutions:
|
| - raise gclient_utils.Error('%s is not a valid solution.' % sol)
|
| + if self._options.head:
|
| + return revision_overrides
|
| + for s in solutions:
|
| + if not s.get('safesync_url', None):
|
| + continue
|
| + handle = urllib.urlopen(s['safesync_url'])
|
| + rev = handle.read().strip()
|
| + handle.close()
|
| + if len(rev):
|
| + self._options.revisions.append('%s@%s' % (s['name'], rev))
|
| + if not self._options.revisions:
|
| + return revision_overrides
|
| + # --revision will take over safesync_url.
|
| + solutions_names = [s['name'] for s in solutions]
|
| + index = 0
|
| + for revision in self._options.revisions:
|
| + if not '@' in revision:
|
| + # Support for --revision 123
|
| + revision = '%s@%s' % (solutions_names[index], revision)
|
| + sol, rev = revision.split("@", 1)
|
| + if not sol in solutions_names:
|
| + #raise gclient_utils.Error('%s is not a valid solution.' % sol)
|
| + print >> sys.stderr, ('Please fix your script, having invalid '
|
| + '--revision flags will soon considered an error.')
|
| + else:
|
| revision_overrides[sol] = rev
|
| + index += 1
|
| return revision_overrides
|
|
|
| def RunOnDeps(self, command, args):
|
| @@ -942,10 +944,11 @@ def CMDsync(parser, args):
|
| help="don't run hooks after the update is complete")
|
| parser.add_option("-r", "--revision", action="append",
|
| dest="revisions", metavar="REV", default=[],
|
| - help="Enforces revision/hash for the primary solution. "
|
| - "To modify a secondary solution, use it at least once "
|
| - "for the primary solution and then use the format "
|
| - "solution@rev/hash, e.g. -r src@123")
|
| + help="Enforces revision/hash for the solutions with the "
|
| + "format src@rev. The src@ part is optional and can be "
|
| + "skipped. -r can be used multiple times when .gclient "
|
| + "has multiple solutions configured and will work even "
|
| + "if the src@ part is skipped.")
|
| parser.add_option("--head", action="store_true",
|
| help="skips any safesync_urls specified in "
|
| "configured solutions and sync to head instead")
|
| @@ -967,29 +970,9 @@ def CMDsync(parser, args):
|
| if not client:
|
| raise gclient_utils.Error("client not configured; see 'gclient config'")
|
|
|
| - if not options.head:
|
| - solutions = client.GetVar('solutions')
|
| - if solutions:
|
| - first = True
|
| - for s in solutions:
|
| - if s.get('safesync_url', None):
|
| - # rip through revisions and make sure we're not over-riding
|
| - # something that was explicitly passed
|
| - has_key = False
|
| - r_first = True
|
| - for r in options.revisions:
|
| - if (first and r_first) or r.split('@', 1)[0] == s['name']:
|
| - has_key = True
|
| - break
|
| - r_first = False
|
| -
|
| - if not has_key:
|
| - handle = urllib.urlopen(s['safesync_url'])
|
| - rev = handle.read().strip()
|
| - handle.close()
|
| - if len(rev):
|
| - options.revisions.append(s['name']+'@'+rev)
|
| - first = False
|
| + if options.revisions and options.head:
|
| + # TODO(maruel): Make it a parser.error if it doesn't break any builder.
|
| + print("Warning: you cannot use both --head and --revision")
|
|
|
| if options.verbose:
|
| # Print out the .gclient file. This is longer than if we just printed the
|
| @@ -1125,6 +1108,8 @@ def Main(argv):
|
| if not hasattr(options, 'revisions'):
|
| # GClient.RunOnDeps expects it even if not applicable.
|
| options.revisions = []
|
| + if not hasattr(options, 'head'):
|
| + options.head = None
|
| return (options, args)
|
| parser.parse_args = Parse
|
| # We don't want wordwrapping in epilog (usually examples)
|
|
|