| Index: PRESUBMIT.py
|
| diff --git a/PRESUBMIT.py b/PRESUBMIT.py
|
| index 23d78673850c0303d74de9b5e6cb91c4b29e0f9f..16f00ad5bff741fd78119cda7f62031447597c1d 100644
|
| --- a/PRESUBMIT.py
|
| +++ b/PRESUBMIT.py
|
| @@ -1049,57 +1049,7 @@
|
| return results
|
|
|
|
|
| -def _ExtractAddRulesFromParsedDeps(parsed_deps):
|
| - """Extract the rules that add dependencies from a parsed DEPS file.
|
| -
|
| - Args:
|
| - parsed_deps: the locals dictionary from evaluating the DEPS file."""
|
| - add_rules = set()
|
| - add_rules.update([
|
| - rule[1:] for rule in parsed_deps.get('include_rules', [])
|
| - if rule.startswith('+') or rule.startswith('!')
|
| - ])
|
| - for specific_file, rules in parsed_deps.get('specific_include_rules',
|
| - {}).iteritems():
|
| - add_rules.update([
|
| - rule[1:] for rule in rules
|
| - if rule.startswith('+') or rule.startswith('!')
|
| - ])
|
| - return add_rules
|
| -
|
| -
|
| -def _ParseDeps(contents):
|
| - """Simple helper for parsing DEPS files."""
|
| - # Stubs for handling special syntax in the root DEPS file.
|
| - def FromImpl(*_):
|
| - pass # NOP function so "From" doesn't fail.
|
| -
|
| - def FileImpl(_):
|
| - pass # NOP function so "File" doesn't fail.
|
| -
|
| - class _VarImpl:
|
| -
|
| - def __init__(self, local_scope):
|
| - self._local_scope = local_scope
|
| -
|
| - def Lookup(self, var_name):
|
| - """Implements the Var syntax."""
|
| - try:
|
| - return self._local_scope['vars'][var_name]
|
| - except KeyError:
|
| - raise Exception('Var is not defined: %s' % var_name)
|
| -
|
| - local_scope = {}
|
| - global_scope = {
|
| - 'File': FileImpl,
|
| - 'From': FromImpl,
|
| - 'Var': _VarImpl(local_scope).Lookup,
|
| - }
|
| - exec contents in global_scope, local_scope
|
| - return local_scope
|
| -
|
| -
|
| -def _CalculateAddedDeps(os_path, old_contents, new_contents):
|
| +def _FilesToCheckForIncomingDeps(re, changed_lines):
|
| """Helper method for _CheckAddedDepsHaveTargetApprovals. Returns
|
| a set of DEPS entries that we should look up.
|
|
|
| @@ -1110,20 +1060,22 @@
|
| # We ignore deps entries on auto-generated directories.
|
| AUTO_GENERATED_DIRS = ['grit', 'jni']
|
|
|
| - old_deps = _ExtractAddRulesFromParsedDeps(_ParseDeps(old_contents))
|
| - new_deps = _ExtractAddRulesFromParsedDeps(_ParseDeps(new_contents))
|
| -
|
| - added_deps = new_deps.difference(old_deps)
|
| -
|
| + # This pattern grabs the path without basename in the first
|
| + # parentheses, and the basename (if present) in the second. It
|
| + # relies on the simple heuristic that if there is a basename it will
|
| + # be a header file ending in ".h".
|
| + pattern = re.compile(
|
| + r"""['"]\+([^'"]+?)(/[a-zA-Z0-9_]+\.h)?['"].*""")
|
| results = set()
|
| - for added_dep in added_deps:
|
| - if added_dep.split('/')[0] in AUTO_GENERATED_DIRS:
|
| - continue
|
| - # Assume that a rule that ends in .h is a rule for a specific file.
|
| - if added_dep.endswith('.h'):
|
| - results.add(added_dep)
|
| - else:
|
| - results.add(os_path.join(added_dep, 'DEPS'))
|
| + for changed_line in changed_lines:
|
| + m = pattern.match(changed_line)
|
| + if m:
|
| + path = m.group(1)
|
| + if path.split('/')[0] not in AUTO_GENERATED_DIRS:
|
| + if m.group(2):
|
| + results.add('%s%s' % (path, m.group(2)))
|
| + else:
|
| + results.add('%s/DEPS' % path)
|
| return results
|
|
|
|
|
| @@ -1133,7 +1085,7 @@
|
| target file or directory, to avoid layering violations from being
|
| introduced. This check verifies that this happens.
|
| """
|
| - virtual_depended_on_files = set()
|
| + changed_lines = set()
|
|
|
| file_filter = lambda f: not input_api.re.match(
|
| r"^third_party[\\\/]WebKit[\\\/].*", f.LocalPath())
|
| @@ -1141,11 +1093,14 @@
|
| file_filter=file_filter):
|
| filename = input_api.os_path.basename(f.LocalPath())
|
| if filename == 'DEPS':
|
| - virtual_depended_on_files.update(_CalculateAddedDeps(
|
| - input_api.os_path,
|
| - '\n'.join(f.OldContents()),
|
| - '\n'.join(f.NewContents())))
|
| -
|
| + changed_lines |= set(line.strip()
|
| + for line_num, line
|
| + in f.ChangedContents())
|
| + if not changed_lines:
|
| + return []
|
| +
|
| + virtual_depended_on_files = _FilesToCheckForIncomingDeps(input_api.re,
|
| + changed_lines)
|
| if not virtual_depended_on_files:
|
| return []
|
|
|
|
|