| Index: gclient.py
|
| ===================================================================
|
| --- gclient.py (revision 209166)
|
| +++ gclient.py (working copy)
|
| @@ -10,8 +10,9 @@
|
| Format is a Python script defining 'solutions', a list whose
|
| entries each are maps binding the strings "name" and "url"
|
| to strings specifying the name and location of the client
|
| - module, as well as "custom_deps" to a map similar to the DEPS
|
| - file below.
|
| + module, as well as "custom_deps" to a map similar to the deps
|
| + section of the DEPS file below, as well as "custom_hooks" to
|
| + a list similar to the hooks sections of the DEPS file below.
|
| .gclient_entries : A cache constructed by 'update' command. Format is a
|
| Python script defining 'entries', a list of the names
|
| of all modules in the client
|
| @@ -24,8 +25,8 @@
|
| working copy as a result of a "sync"/"update" or "revert" operation. This
|
| can be prevented by using --nohooks (hooks run by default). Hooks can also
|
| be forced to run with the "runhooks" operation. If "sync" is run with
|
| - --force, all known hooks will run regardless of the state of the working
|
| - copy.
|
| + --force, all known but not suppressed hooks will run regardless of the state
|
| + of the working copy.
|
|
|
| Each item in a "hooks" list is a dict, containing these two keys:
|
| "pattern" The associated value is a string containing a regular
|
| @@ -41,11 +42,16 @@
|
| to run the command. If the list contains string "$matching_files"
|
| it will be removed from the list and the list will be extended
|
| by the list of matching files.
|
| + "name" An optional string specifying the group to which a hook belongs
|
| + for overriding and organizing.
|
|
|
| Example:
|
| hooks = [
|
| { "pattern": "\\.(gif|jpe?g|pr0n|png)$",
|
| "action": ["python", "image_indexer.py", "--all"]},
|
| + { "pattern": ".",
|
| + "name": "gyp",
|
| + "action": ["python", "src/build/gyp_chromium"]},
|
| ]
|
|
|
| Specifying a target OS
|
| @@ -159,7 +165,7 @@
|
| """Immutable configuration settings."""
|
| def __init__(
|
| self, parent, url, safesync_url, managed, custom_deps, custom_vars,
|
| - deps_file, should_process):
|
| + custom_hooks, deps_file, should_process):
|
| GClientKeywords.__init__(self)
|
|
|
| # These are not mutable:
|
| @@ -186,6 +192,7 @@
|
| # These are only set in .gclient and not in DEPS files.
|
| self._custom_vars = custom_vars or {}
|
| self._custom_deps = custom_deps or {}
|
| + self._custom_hooks = custom_hooks or []
|
|
|
| # TODO(iannucci): Remove this when all masters are correctly substituting
|
| # the new blink url.
|
| @@ -247,6 +254,10 @@
|
| return self._custom_deps.copy()
|
|
|
| @property
|
| + def custom_hooks(self):
|
| + return self._custom_hooks[:]
|
| +
|
| + @property
|
| def url(self):
|
| return self._url
|
|
|
| @@ -276,11 +287,11 @@
|
| """Object that represents a dependency checkout."""
|
|
|
| def __init__(self, parent, name, url, safesync_url, managed, custom_deps,
|
| - custom_vars, deps_file, should_process):
|
| + custom_vars, custom_hooks, deps_file, should_process):
|
| gclient_utils.WorkItem.__init__(self, name)
|
| DependencySettings.__init__(
|
| self, parent, url, safesync_url, managed, custom_deps, custom_vars,
|
| - deps_file, should_process)
|
| + custom_hooks, deps_file, should_process)
|
|
|
| # This is in both .gclient and DEPS files:
|
| self._deps_hooks = []
|
| @@ -528,10 +539,23 @@
|
| for name, url in deps.iteritems():
|
| should_process = self.recursion_limit and self.should_process
|
| deps_to_add.append(Dependency(
|
| - self, name, url, None, None, None, None,
|
| + self, name, url, None, None, None, None, None,
|
| self.deps_file, should_process))
|
| deps_to_add.sort(key=lambda x: x.name)
|
| - self.add_dependencies_and_close(deps_to_add, local_scope.get('hooks', []))
|
| +
|
| + # override named sets of hooks by the custom hooks
|
| + hooks_to_run = []
|
| + hook_names_to_suppress = [c.get('name', '') for c in self.custom_hooks]
|
| + for hook in local_scope.get('hooks', []):
|
| + if hook.get('name', '') not in hook_names_to_suppress:
|
| + hooks_to_run.append(hook)
|
| +
|
| + # add the replacements and any additions
|
| + for hook in self.custom_hooks:
|
| + if 'action' in hook:
|
| + hooks_to_run.append(hook)
|
| +
|
| + self.add_dependencies_and_close(deps_to_add, hooks_to_run)
|
| logging.info('ParseDepsFile(%s) done' % self.name)
|
|
|
| def add_dependencies_and_close(self, deps_to_add, hooks):
|
| @@ -921,7 +945,7 @@
|
| # Do not change previous behavior. Only solution level and immediate DEPS
|
| # are processed.
|
| self._recursion_limit = 2
|
| - Dependency.__init__(self, None, None, None, None, True, None, None,
|
| + Dependency.__init__(self, None, None, None, None, True, None, None, None,
|
| 'unused', True)
|
| self._options = options
|
| if options.deps_os:
|
| @@ -963,6 +987,7 @@
|
| s.get('managed', True),
|
| s.get('custom_deps', {}),
|
| s.get('custom_vars', {}),
|
| + s.get('custom_hooks', []),
|
| s.get('deps_file', 'DEPS'),
|
| True))
|
| except KeyError:
|
|
|