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 [] |