| Index: gclient.py
|
| diff --git a/gclient.py b/gclient.py
|
| index 5d03c146c9601eb6a1c05843fde50dd9ca5360f7..725642e478d9a9ada003773f3a5c60f538360f81 100644
|
| --- a/gclient.py
|
| +++ b/gclient.py
|
| @@ -146,24 +146,30 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem):
|
| # multiple threads at the same time. Sad.
|
| GClientKeywords.__init__(self)
|
| gclient_utils.WorkItem.__init__(self, name)
|
| - self.parent = parent
|
| +
|
| + # These are not mutable:
|
| + self._parent = parent
|
| + self._safesync_url = safesync_url
|
| + self._deps_file = deps_file
|
| + self._should_process = should_process
|
| +
|
| + # This is in both .gclient and DEPS files:
|
| self.url = url
|
| - self.parsed_url = None
|
| - # These 2 are only set in .gclient and not in DEPS files.
|
| - self.safesync_url = safesync_url
|
| +
|
| + # These are only set in .gclient and not in DEPS files.
|
| self.custom_vars = custom_vars or {}
|
| self.custom_deps = custom_deps or {}
|
| self.deps_hooks = []
|
| +
|
| + # Calculates properties:
|
| + self.parsed_url = None
|
| self.dependencies = []
|
| - self.deps_file = deps_file
|
| # A cache of the files affected by the current operation, necessary for
|
| # hooks.
|
| self._file_list = []
|
| # If it is not set to True, the dependency wasn't processed for its child
|
| # dependency, i.e. its DEPS wasn't read.
|
| self.deps_parsed = False
|
| - # This dependency should be processed, i.e. checked out
|
| - self.should_process = should_process
|
| # This dependency has been processed, i.e. checked out
|
| self.processed = False
|
| # This dependency had its hook run
|
| @@ -258,7 +264,9 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem):
|
| overriden_url))
|
| return overriden_url
|
| elif isinstance(url, self.FromImpl):
|
| - ref = [dep for dep in self.tree(True) if url.module_name == dep.name]
|
| + ref = [
|
| + dep for dep in self.root.subtree(True) if url.module_name == dep.name
|
| + ]
|
| if not ref:
|
| raise gclient_utils.Error('Failed to find one reference to %s. %s' % (
|
| url.module_name, ref))
|
| @@ -379,9 +387,9 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem):
|
| raise gclient_utils.Error(
|
| 'The same name "%s" appears multiple times in the deps section' %
|
| name)
|
| - should_process = self.recursion_limit() > 0 and self.should_process
|
| + should_process = self.recursion_limit and self.should_process
|
| if should_process:
|
| - tree = dict((d.name, d) for d in self.tree(False))
|
| + tree = dict((d.name, d) for d in self.root.subtree(False))
|
| if name in tree:
|
| if url == tree[name].url:
|
| logging.info('Won\'t process duplicate dependency %s' % tree[name])
|
| @@ -466,8 +474,22 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem):
|
| maybeConvertToDateRevision(options)
|
| self._file_list = [os.path.join(self.name, f.strip())
|
| for f in self._file_list]
|
| +
|
| + # TODO(phajdan.jr): We should know exactly when the paths are absolute.
|
| + # Convert all absolute paths to relative.
|
| + for i in range(len(self._file_list)):
|
| + # It depends on the command being executed (like runhooks vs sync).
|
| + if not os.path.isabs(self._file_list[i]):
|
| + continue
|
| + prefix = os.path.commonprefix(
|
| + [self.root.root_dir.lower(), self._file_list[i].lower()])
|
| + self._file_list[i] = self._file_list[i][len(prefix):]
|
| + # Strip any leading path separators.
|
| + while (self._file_list[i].startswith('\\') or
|
| + self._file_list[i].startswith('/')):
|
| + self._file_list[i] = self._file_list[i][1:]
|
| self.processed = True
|
| - if self.recursion_limit() > 0:
|
| + if self.recursion_limit:
|
| # Then we can parse the DEPS file.
|
| self.ParseDepsFile()
|
|
|
| @@ -479,7 +501,7 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem):
|
| """Evaluates all hooks, running actions as needed. run()
|
| must have been called before to load the DEPS."""
|
| assert self.hooks_ran == False
|
| - if not self.should_process or self.recursion_limit() <= 0:
|
| + if not self.should_process or not self.recursion_limit:
|
| # Don't run the hook when it is above recursion_limit.
|
| return
|
| # If "--force" was specified, run all hooks regardless of what files have
|
| @@ -495,28 +517,11 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem):
|
| for hook_dict in self.deps_hooks:
|
| self._RunHookAction(hook_dict, [])
|
| else:
|
| - # TODO(phajdan.jr): We should know exactly when the paths are absolute.
|
| - # Convert all absolute paths to relative.
|
| - file_list = self.file_list()
|
| - for i in range(len(file_list)):
|
| - # It depends on the command being executed (like runhooks vs sync).
|
| - if not os.path.isabs(file_list[i]):
|
| - continue
|
| -
|
| - prefix = os.path.commonprefix([self.root.root_dir.lower(),
|
| - file_list[i].lower()])
|
| - file_list[i] = file_list[i][len(prefix):]
|
| -
|
| - # Strip any leading path separators.
|
| - while (file_list[i].startswith('\\') or
|
| - file_list[i].startswith('/')):
|
| - file_list[i] = file_list[i][1:]
|
| -
|
| # Run hooks on the basis of whether the files from the gclient operation
|
| # match each hook's pattern.
|
| for hook_dict in self.deps_hooks:
|
| pattern = re.compile(hook_dict['pattern'])
|
| - matching_file_list = [f for f in file_list if pattern.search(f)]
|
| + matching_file_list = [f for f in self.file_list if pattern.search(f)]
|
| if matching_file_list:
|
| self._RunHookAction(hook_dict, matching_file_list)
|
| for s in self.dependencies:
|
| @@ -551,12 +556,6 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem):
|
| print >> sys.stderr, 'Error: %s' % str(e)
|
| sys.exit(2)
|
|
|
| - def recursion_limit(self):
|
| - return self.parent.recursion_limit() - 1
|
| -
|
| - def tree(self, include_all):
|
| - return self.parent.tree(include_all)
|
| -
|
| def subtree(self, include_all):
|
| """Breadth first"""
|
| result = []
|
| @@ -574,11 +573,34 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem):
|
| # None is a valid return value to disable a dependency.
|
| return self.custom_deps.get(name, url)
|
|
|
| + @property
|
| + def recursion_limit(self):
|
| + """Returns > 0 if this dependency is not too recursed to be processed."""
|
| + return max(self.parent.recursion_limit - 1, 0)
|
| +
|
| + @property
|
| + def deps_file(self):
|
| + return self._deps_file
|
| +
|
| + @property
|
| + def safesync_url(self):
|
| + return self._safesync_url
|
| +
|
| + @property
|
| + def should_process(self):
|
| + """True if this dependency should be processed, i.e. checked out."""
|
| + return self._should_process
|
| +
|
| + @property
|
| + def parent(self):
|
| + return self._parent
|
| +
|
| + @property
|
| def file_list(self):
|
| result = self._file_list[:]
|
| for d in self.dependencies:
|
| - result.extend(d.file_list())
|
| - return result
|
| + result.extend(d.file_list)
|
| + return tuple(result)
|
|
|
| def __str__(self):
|
| out = []
|
| @@ -690,7 +712,7 @@ solutions = [
|
| gclient_utils.SyntaxErrorToError('.gclient', e)
|
| for s in config_dict.get('solutions', []):
|
| try:
|
| - tree = dict((d.name, d) for d in self.tree(False))
|
| + tree = dict((d.name, d) for d in self.root.subtree(False))
|
| if s['name'] in tree:
|
| raise gclient_utils.Error(
|
| 'Dependency %s specified more than once in .gclient' % s['name'])
|
| @@ -742,7 +764,7 @@ solutions = [
|
| # Sometimes pprint.pformat will use {', sometimes it'll use { ' ... It
|
| # makes testing a bit too fun.
|
| result = 'entries = {\n'
|
| - for entry in self.tree(False):
|
| + for entry in self.root.subtree(False):
|
| # Skip over File() dependencies as we can't version them.
|
| if not isinstance(entry.parsed_url, self.FileImpl):
|
| result += ' %s: %s,\n' % (pprint.pformat(entry.name),
|
| @@ -831,7 +853,7 @@ solutions = [
|
| # Notify the user if there is an orphaned entry in their working copy.
|
| # Only delete the directory if there are no changes in it, and
|
| # delete_unversioned_trees is set to true.
|
| - entries = [i.name for i in self.tree(False) if i.url]
|
| + entries = [i.name for i in self.root.subtree(False) if i.url]
|
| for entry, prev_url in self._ReadEntries().iteritems():
|
| if not prev_url:
|
| # entry must have been overridden via .gclient custom_deps
|
| @@ -913,7 +935,7 @@ solutions = [
|
| print(self.DEFAULT_SNAPSHOT_FILE_TEXT % {'solution_list': new_gclient})
|
| else:
|
| entries = {}
|
| - for d in self.tree(False):
|
| + for d in self.root.subtree(False):
|
| if self._options.actual:
|
| entries[d.name] = GetURLAndRev(d)
|
| else:
|
| @@ -937,14 +959,11 @@ solutions = [
|
| """What deps_os entries that are to be parsed."""
|
| return self._enforced_os
|
|
|
| + @property
|
| def recursion_limit(self):
|
| """How recursive can each dependencies in DEPS file can load DEPS file."""
|
| return self._recursion_limit
|
|
|
| - def tree(self, include_all):
|
| - """Returns a flat list of all the dependencies."""
|
| - return self.subtree(include_all)
|
| -
|
|
|
| #### gclient commands.
|
|
|
|
|