Index: gclient.py |
=================================================================== |
--- gclient.py (revision 126269) |
+++ gclient.py (working copy) |
@@ -604,13 +604,31 @@ |
self._parsed_url = parsed_url |
self._processed = True |
- def RunHooksRecursively(self, options): |
- """Evaluates all hooks, running actions as needed. run() |
- must have been called before to load the DEPS.""" |
- assert self.hooks_ran == False |
+ @staticmethod |
+ def GetHookAction(hook_dict, matching_file_list): |
+ """Turns a parsed 'hook' dict into an executable command.""" |
+ logging.debug(hook_dict) |
+ logging.debug(matching_file_list) |
+ command = hook_dict['action'][:] |
+ if command[0] == 'python': |
+ # If the hook specified "python" as the first item, the action is a |
+ # Python script. Run it by starting a new copy of the same |
+ # interpreter. |
+ command[0] = sys.executable |
+ if '$matching_files' in command: |
+ splice_index = command.index('$matching_files') |
+ command[splice_index:splice_index + 1] = matching_file_list |
+ return command |
+ |
+ def GetHooks(self, options): |
+ """Evaluates all hooks, and return them in a flat list. |
+ |
+ RunOnDeps() must have been called before to load the DEPS. |
+ """ |
+ result = [] |
if not self.should_process or not self.recursion_limit: |
# Don't run the hook when it is above recursion_limit. |
- return |
+ return result |
# If "--force" was specified, run all hooks regardless of what files have |
# changed. |
if self.deps_hooks: |
@@ -622,7 +640,7 @@ |
gclient_scm.GetScmName(self.parsed_url) in ('git', None) or |
os.path.isdir(os.path.join(self.root.root_dir, self.name, '.git'))): |
for hook_dict in self.deps_hooks: |
- self._RunHookAction(hook_dict, []) |
+ result.append(self.GetHookAction(hook_dict, [])) |
else: |
# Run hooks on the basis of whether the files from the gclient operation |
# match each hook's pattern. |
@@ -632,39 +650,25 @@ |
f for f in self.file_list_and_children if pattern.search(f) |
] |
if matching_file_list: |
- self._RunHookAction(hook_dict, matching_file_list) |
+ result.append(self.GetHookAction(hook_dict, matching_file_list)) |
for s in self.dependencies: |
- s.RunHooksRecursively(options) |
+ result.extend(s.GetHooks(options)) |
+ return result |
- def _RunHookAction(self, hook_dict, matching_file_list): |
- """Runs the action from a single hook.""" |
- # 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 |
+ def RunHooksRecursively(self, options): |
+ assert self.hooks_ran == False |
self._hooks_ran = True |
- logging.debug(hook_dict) |
- logging.debug(matching_file_list) |
- command = hook_dict['action'][:] |
- if command[0] == 'python': |
- # If the hook specified "python" as the first item, the action is a |
- # Python script. Run it by starting a new copy of the same |
- # interpreter. |
- command[0] = sys.executable |
+ for hook in self.GetHooks(options): |
+ try: |
+ gclient_utils.CheckCallAndFilterAndHeader( |
+ hook, cwd=self.root.root_dir, always=True) |
+ except (gclient_utils.Error, subprocess2.CalledProcessError), e: |
+ # Use a discrete exit status code of 2 to indicate that a hook action |
+ # failed. Users of this script may wish to treat hook action failures |
+ # differently from VC failures. |
+ print >> sys.stderr, 'Error: %s' % str(e) |
+ sys.exit(2) |
- if '$matching_files' in command: |
- splice_index = command.index('$matching_files') |
- command[splice_index:splice_index + 1] = matching_file_list |
- |
- try: |
- gclient_utils.CheckCallAndFilterAndHeader( |
- command, cwd=self.root.root_dir, always=True) |
- except (gclient_utils.Error, subprocess2.CalledProcessError), e: |
- # Use a discrete exit status code of 2 to indicate that a hook action |
- # failed. Users of this script may wish to treat hook action failures |
- # differently from VC failures. |
- print >> sys.stderr, 'Error: %s' % str(e) |
- sys.exit(2) |
- |
def subtree(self, include_all): |
"""Breadth first recursion excluding root node.""" |
dependencies = self.dependencies |
@@ -1454,6 +1458,18 @@ |
return 0 |
+def CMDhookinfo(parser, args): |
+ """Output the hooks that would be run by `gclient runhooks`""" |
+ (options, args) = parser.parse_args(args) |
+ options.force = True |
+ client = GClient.LoadCurrentConfig(options) |
+ if not client: |
+ raise gclient_utils.Error('client not configured; see \'gclient config\'') |
+ client.RunOnDeps(None, []) |
+ print '; '.join(' '.join(hook) for hook in client.GetHooks(options)) |
+ return 0 |
+ |
+ |
def Command(name): |
return getattr(sys.modules[__name__], 'CMD' + name, None) |