Index: scripts/slave/recipe_modules/filter/api.py |
diff --git a/scripts/slave/recipe_modules/filter/api.py b/scripts/slave/recipe_modules/filter/api.py |
index e5dc141fcd3eaf7cbbc55d9de5626aabec9e935b..65c8c482334541f488179b0677712b59f1d6a928 100644 |
--- a/scripts/slave/recipe_modules/filter/api.py |
+++ b/scripts/slave/recipe_modules/filter/api.py |
@@ -10,6 +10,7 @@ class FilterApi(recipe_api.RecipeApi): |
def __init__(self, **kwargs): |
super(FilterApi, self).__init__(**kwargs) |
self._result = False |
+ self._matching_exes = [] |
def __is_path_in_exclusion_list(self, path, exclusions): |
"""Returns true if |path| matches any of the regular expressions in |
@@ -26,17 +27,26 @@ class FilterApi(recipe_api.RecipeApi): |
does_patch_require_compile.""" |
return self._result |
+ @property |
+ def matching_exes(self): |
+ """Returns the set of exes passed to does_patch_require_compile() that |
+ are effected by the set of files that have changed.""" |
+ return self._matching_exes |
- def does_patch_require_compile(self, exclusions=None, **kwargs): |
- """Return true if the current patch requires a build (and tests to run). |
+ def does_patch_require_compile(self, exclusions=None, exes=None, **kwargs): |
+ """Return true if the current patch requires a build (and exes to run). |
Return value can be accessed by call to result(). |
Args: |
exclusions: list of python regular expressions (as strings). If any of |
the files in the current patch match one of the values in |exclusions| |
- True is returned.""" |
+ True is returned (by way of result()). |
+ exes: the possible set of executables that are desired to run. When done |
+ matching_exes() returns the set of exes that are effected by the files |
+ that have changed.""" |
exclusions = exclusions or self.m.properties.get('filter_exclusions', []) |
+ self._matching_exes = exes or self.m.properties.get('matching_exes', []) |
# Get the set of files in the current patch. |
step_result = self.m.git('diff', '--cached', '--name-only', |
@@ -48,7 +58,9 @@ class FilterApi(recipe_api.RecipeApi): |
# Check the path of each file against the exclusion list. If found, no need |
# to check dependencies. |
exclusion_regexs = [re.compile(exclusion) for exclusion in exclusions] |
+ paths = [] |
for path in step_result.stdout.split(): |
+ paths.append(path) |
first_match = self.__is_path_in_exclusion_list(path, exclusion_regexs) |
if first_match: |
step_result.presentation.logs.setdefault('excluded_files', []).append( |
@@ -56,18 +68,27 @@ class FilterApi(recipe_api.RecipeApi): |
self._result = 1 |
return |
+ analyze_input = {'files': paths, 'targets': self._matching_exes} |
+ |
+ test_output = {'status': 'No dependency', 'targets': []} |
+ |
kwargs.setdefault('env', {}) |
kwargs['env'].update(self.m.chromium.c.gyp_env.as_jsonish()) |
step_result = self.m.python('analyze', |
self.m.path['checkout'].join('build', 'gyp_chromium'), |
- ['--analyzer', |
- self.m.raw_io.input(step_result.stdout)], |
- stdout = self.m.raw_io.output(), |
- step_test_data=lambda: |
- self.m.raw_io.test_api.stream_output('No dependency'), |
+ args=['--analyzer2', |
+ self.m.json.input(analyze_input), |
+ self.m.json.output()], |
+ step_test_data=lambda: self.m.json.test_api.output( |
+ test_output), |
**kwargs) |
- if step_result.stdout.find('Found dependency') != -1: |
+ if 'error' in step_result.json.output: |
+ self._result = True |
+ step_result.presentation.step_text = 'Error: ' + \ |
+ step_result.json.output['error'] |
+ elif step_result.json.output['status'] == 'Found dependency': |
+ self._matching_exes = step_result.json.output['targets'] |
self._result = True |
else: |
step_result.presentation.step_text = 'No compile necessary' |