| Index: gclient.py
|
| diff --git a/gclient.py b/gclient.py
|
| index 9efc1c83fcb60aa79b8f6af3b43fe673c72642a0..49873003db9f561512f08b6f71c8ec22d8acef13 100644
|
| --- a/gclient.py
|
| +++ b/gclient.py
|
| @@ -136,15 +136,18 @@ class GClientKeywords(object):
|
| raise gclient_utils.Error("Var is not defined: %s" % var_name)
|
|
|
|
|
| -class DependencySettings(object):
|
| +class DependencySettings(GClientKeywords):
|
| """Immutable configuration settings."""
|
| def __init__(
|
| - self, parent, safesync_url, managed, custom_deps, custom_vars,
|
| + self, parent, url, safesync_url, managed, custom_deps, custom_vars,
|
| deps_file, should_process):
|
| + GClientKeywords.__init__(self)
|
| +
|
| # These are not mutable:
|
| self._parent = parent
|
| self._safesync_url = safesync_url
|
| self._deps_file = deps_file
|
| + self._url = url
|
| # 'managed' determines whether or not this dependency is synced/updated by
|
| # gclient after gclient checks it out initially. The difference between
|
| # 'managed' and 'should_process' is that the user specifies 'managed' via
|
| @@ -158,6 +161,18 @@ class DependencySettings(object):
|
| self._custom_vars = custom_vars or {}
|
| self._custom_deps = custom_deps or {}
|
|
|
| + # Post process the url to remove trailing slashes.
|
| + if isinstance(self._url, basestring):
|
| + # urls are sometime incorrectly written as proto://host/path/@rev. Replace
|
| + # it to proto://host/path@rev.
|
| + if self._url.count('@') > 1:
|
| + raise gclient_utils.Error('Invalid url "%s"' % self._url)
|
| + self._url = self._url.replace('/@', '@')
|
| + elif not isinstance(self._url,
|
| + (self.FromImpl, self.FileImpl, None.__class__)):
|
| + raise gclient_utils.Error(
|
| + ('dependency url must be either a string, None, '
|
| + 'File() or From() instead of %s') % self._url.__class__.__name__)
|
| if '/' in self._deps_file or '\\' in self._deps_file:
|
| raise gclient_utils.Error('deps_file name must not be a path, just a '
|
| 'filename. %s' % self._deps_file)
|
| @@ -197,60 +212,41 @@ class DependencySettings(object):
|
| """Immutable so no need to lock."""
|
| return self._custom_deps.copy()
|
|
|
| + @property
|
| + def url(self):
|
| + return self._url
|
| +
|
|
|
| -class Dependency(GClientKeywords, gclient_utils.WorkItem, DependencySettings):
|
| +class Dependency(gclient_utils.WorkItem, DependencySettings):
|
| """Object that represents a dependency checkout."""
|
|
|
| def __init__(self, parent, name, url, safesync_url, managed, custom_deps,
|
| custom_vars, deps_file, should_process):
|
| - GClientKeywords.__init__(self)
|
| gclient_utils.WorkItem.__init__(self, name)
|
| DependencySettings.__init__(
|
| - self, parent, safesync_url, managed, custom_deps, custom_vars,
|
| + self, parent, url, safesync_url, managed, custom_deps, custom_vars,
|
| deps_file, should_process)
|
|
|
| # This is in both .gclient and DEPS files:
|
| - self.url = url
|
| -
|
| - self.deps_hooks = []
|
| + self._deps_hooks = []
|
|
|
| # Calculates properties:
|
| - self.parsed_url = None
|
| + self._parsed_url = None
|
| self._dependencies = []
|
| # 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
|
| + self._deps_parsed = False
|
| # This dependency has been processed, i.e. checked out
|
| - self.processed = False
|
| + self._processed = False
|
| # This dependency had its hook run
|
| - self.hooks_ran = False
|
| + self._hooks_ran = False
|
|
|
| - # Post process the url to remove trailing slashes.
|
| - if isinstance(self.url, basestring):
|
| - # urls are sometime incorrectly written as proto://host/path/@rev. Replace
|
| - # it to proto://host/path@rev.
|
| - if self.url.count('@') > 1:
|
| - raise gclient_utils.Error('Invalid url "%s"' % self.url)
|
| - self.url = self.url.replace('/@', '@')
|
| + # Setup self.requirements and find any other dependency who would have self
|
| + # as a requirement.
|
|
|
| - self._FindDependencies()
|
| -
|
| - # Sanity checks
|
| - if not self.name and self.parent:
|
| - raise gclient_utils.Error('Dependency without name')
|
| - if not isinstance(self.url,
|
| - (basestring, self.FromImpl, self.FileImpl, None.__class__)):
|
| - raise gclient_utils.Error('dependency url must be either a string, None, '
|
| - 'File() or From() instead of %s' %
|
| - self.url.__class__.__name__)
|
| -
|
| - def _FindDependencies(self):
|
| - """Setup self.requirements and find any other dependency who would have self
|
| - as a requirement.
|
| - """
|
| # self.parent is implicitly a requirement. This will be recursive by
|
| # definition.
|
| if self.parent and self.parent.name:
|
| @@ -303,6 +299,9 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem, DependencySettings):
|
| finally:
|
| obj.lock.release()
|
|
|
| + if not self.name and self.parent:
|
| + raise gclient_utils.Error('Dependency without name')
|
| +
|
| def LateOverride(self, url):
|
| """Resolves the parsed url from url.
|
|
|
| @@ -375,7 +374,6 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem, DependencySettings):
|
| if self.deps_parsed:
|
| logging.debug('%s was already parsed' % self.name)
|
| return
|
| - self.deps_parsed = True
|
| # One thing is unintuitive, vars= {} must happen before Var() use.
|
| local_scope = {}
|
| var = self.VarImpl(self.custom_vars, local_scope)
|
| @@ -413,7 +411,7 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem, DependencySettings):
|
| else:
|
| deps.update(os_deps)
|
|
|
| - self.deps_hooks.extend(local_scope.get('hooks', []))
|
| + self._deps_hooks.extend(local_scope.get('hooks', []))
|
|
|
| # If a line is in custom_deps, but not in the solution, we want to append
|
| # this line to the solution.
|
| @@ -457,6 +455,7 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem, DependencySettings):
|
| Dependency(
|
| self, name, url, None, None, None, None,
|
| self.deps_file, should_process))
|
| + self._deps_parsed = True
|
| logging.debug('Loaded: %s' % str(self))
|
|
|
| # Arguments number differs from overridden method
|
| @@ -505,7 +504,7 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem, DependencySettings):
|
| # 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.parsed_url = 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.
|
| @@ -542,7 +541,7 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem, DependencySettings):
|
| while (self._file_list[i].startswith('\\') or
|
| self._file_list[i].startswith('/')):
|
| self._file_list[i] = self._file_list[i][1:]
|
| - self.processed = True
|
| + self._processed = True
|
| if self.recursion_limit:
|
| # Then we can parse the DEPS file.
|
| self.ParseDepsFile()
|
| @@ -586,7 +585,7 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem, DependencySettings):
|
| # A single DEPS file can specify multiple hooks so this function can be
|
| # called multiple times on a single Dependency.
|
| #assert self.hooks_ran == False
|
| - self.hooks_ran = True
|
| + self._hooks_ran = True
|
| logging.debug(hook_dict)
|
| logging.debug(matching_file_list)
|
| command = hook_dict['action'][:]
|
| @@ -641,6 +640,26 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem, DependencySettings):
|
| return tuple(self._dependencies)
|
|
|
| @property
|
| + def deps_hooks(self):
|
| + return tuple(self._deps_hooks)
|
| +
|
| + @property
|
| + def parsed_url(self):
|
| + return self._parsed_url
|
| +
|
| + @property
|
| + def deps_parsed(self):
|
| + return self._deps_parsed
|
| +
|
| + @property
|
| + def processed(self):
|
| + return self._processed
|
| +
|
| + @property
|
| + def hooks_ran(self):
|
| + return self._hooks_ran
|
| +
|
| + @property
|
| def file_list(self):
|
| result = self._file_list[:]
|
| for d in self.dependencies:
|
| @@ -775,8 +794,8 @@ solutions = [
|
| raise gclient_utils.Error('Invalid .gclient file. Solution is '
|
| 'incomplete: %s' % s)
|
| # .gclient can have hooks.
|
| - self.deps_hooks = config_dict.get('hooks', [])
|
| - self.deps_parsed = True
|
| + self._deps_hooks = config_dict.get('hooks', [])
|
| + self._deps_parsed = True
|
|
|
| def SaveConfig(self):
|
| gclient_utils.FileWrite(os.path.join(self.root_dir,
|
|
|