Index: gclient.py |
diff --git a/gclient.py b/gclient.py |
index 9a654c752d74801c83d3c1fb6127977ebfb4b59d..7a17e0e8d6a1ec920c1d1df6452cef9acdc89a48 100644 |
--- a/gclient.py |
+++ b/gclient.py |
@@ -182,11 +182,15 @@ class Dependency(GClientKeywords): |
'filename. %s' % self.deps_file) |
def LateOverride(self, url): |
+ """Resolves the parsed url from url. |
+ |
+ Manages From() keyword accordingly. Do not touch self.parsed_url nor |
+ self.url because it may called with other urls due to From().""" |
overriden_url = self.get_custom_deps(self.name, url) |
if overriden_url != url: |
- self.parsed_url = overriden_url |
logging.debug('%s, %s was overriden to %s' % (self.name, url, |
- self.parsed_url)) |
+ overriden_url)) |
+ return overriden_url |
elif isinstance(url, self.FromImpl): |
ref = [dep for dep in self.tree(True) if url.module_name == dep.name] |
if not len(ref) == 1: |
@@ -206,8 +210,9 @@ class Dependency(GClientKeywords): |
raise Exception('Couldn\'t find %s in %s, referenced by %s' % ( |
sub_target, ref.name, self.name)) |
# Call LateOverride() again. |
- self.parsed_url = found_dep.LateOverride(found_dep.url) |
- logging.debug('%s, %s to %s' % (self.name, url, self.parsed_url)) |
+ parsed_url = found_dep.LateOverride(found_dep.url) |
+ logging.debug('%s, %s to %s' % (self.name, url, parsed_url)) |
+ return parsed_url |
elif isinstance(url, basestring): |
parsed_url = urlparse.urlparse(url) |
if not parsed_url[0]: |
@@ -221,14 +226,19 @@ class Dependency(GClientKeywords): |
if isinstance(parent_url, self.FileImpl): |
parent_url = parent_url.file_location |
scm = gclient_scm.CreateSCM(parent_url, self.root_dir(), None) |
- self.parsed_url = scm.FullUrlForRelativeUrl(url) |
+ parsed_url = scm.FullUrlForRelativeUrl(url) |
else: |
- self.parsed_url = url |
- logging.debug('%s, %s -> %s' % (self.name, url, self.parsed_url)) |
+ parsed_url = url |
+ logging.debug('%s, %s -> %s' % (self.name, url, parsed_url)) |
+ return parsed_url |
elif isinstance(url, self.FileImpl): |
- self.parsed_url = url |
- logging.debug('%s, %s -> %s (File)' % (self.name, url, self.parsed_url)) |
- return self.parsed_url |
+ parsed_url = url |
+ logging.debug('%s, %s -> %s (File)' % (self.name, url, parsed_url)) |
+ return parsed_url |
+ elif url is None: |
+ return None |
+ else: |
+ raise gclient_utils.Error('Unkown url type') |
def ParseDepsFile(self, direct_reference): |
"""Parses the DEPS file for this dependency.""" |
@@ -299,7 +309,11 @@ class Dependency(GClientKeywords): |
raise |
self.dependencies.append(Dependency(self, name, url, None, None, None, |
None)) |
- # Sort by name. |
+ # Sorting by name would in theory make the whole thing coherent, since |
+ # subdirectories will be sorted after the parent directory, but that doens't |
+ # work with From() that fetch from a dependency with a name being sorted |
+ # later. But if this would be removed right now, many projects wouldn't be |
+ # able to sync anymore. |
self.dependencies.sort(key=lambda x: x.name) |
logging.info('Loaded: %s' % str(self)) |
@@ -312,7 +326,7 @@ class Dependency(GClientKeywords): |
# All known hooks are expected to run unconditionally regardless of working |
# copy state, so skip the SCM status check. |
run_scm = command not in ('runhooks', None) |
- self.LateOverride(self.url) |
+ self.parsed_url = self.LateOverride(self.url) |
if run_scm and self.parsed_url: |
if isinstance(self.parsed_url, self.FileImpl): |
# Special support for single-file checkout. |