Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1764)

Unified Diff: tools/checkdeps/checkdeps.py

Issue 10823271: Add ability to write include rules specific to subsets of files in a directory. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Merge to head. Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | tools/checkdeps/checkdeps_test.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/checkdeps/checkdeps.py
diff --git a/tools/checkdeps/checkdeps.py b/tools/checkdeps/checkdeps.py
index a7cff8bc633bc18ddc2f3c751cd7f17fd61c6797..74b61fa15cd2535a8d2abbb3995bedc172443f33 100755
--- a/tools/checkdeps/checkdeps.py
+++ b/tools/checkdeps/checkdeps.py
@@ -47,6 +47,20 @@ Note that for .java files, there is currently no difference between
"!base/evil/ok_for_now.h",
}
+If you have certain include rules that should only be applied for some
+files within this directory and subdirectories, you can write a
+section named specific_include_rules that is a hash map of regular
+expressions to the list of rules that should apply to files matching
+them. Note that such rules will always be applied before the rules
+from 'include_rules' have been applied, but the order in which rules
+associated with different regular expressions is applied is arbitrary.
+
+ specific_include_rules = {
+ ".*_(unit|browser|api)test\.cc": [
+ "+libraries/testsupport",
+ ],
+ }
+
DEPS files may be placed anywhere in the tree. Each one applies to all
subdirectories, where there may be more DEPS files that provide additions or
subtractions for their own sub-trees.
@@ -80,6 +94,11 @@ from rules import Rule, Rules
# the module-level deps.
INCLUDE_RULES_VAR_NAME = 'include_rules'
+# Variable name used in the DEPS file to add or subtract include files
+# from module-level deps specific to files whose basename (last
+# component of path) matches a given regular expression.
+SPECIFIC_INCLUDE_RULES_VAR_NAME = 'specific_include_rules'
+
# Optionally present in the DEPS file to list subdirectories which should not
# be checked. This allows us to skip third party code, for example.
SKIP_SUBDIRS_VAR_NAME = 'skip_child_includes'
@@ -130,12 +149,14 @@ class DepsChecker(object):
print '\nSUCCESS\n'
return 0
- def _ApplyRules(self, existing_rules, includes, cur_dir):
+ def _ApplyRules(self, existing_rules, includes, specific_includes, cur_dir):
"""Applies the given include rules, returning the new rules.
Args:
existing_rules: A set of existing rules that will be combined.
include: The list of rules from the "include_rules" section of DEPS.
+ specific_includes: E.g. {'.*_unittest\.cc': ['+foo', '-blat']} rules
+ from the "specific_include_rules" section of DEPS.
cur_dir: The current directory, normalized path. We will create an
implicit rule that allows inclusion from this directory.
@@ -158,13 +179,24 @@ class DepsChecker(object):
' for\n %s and base dir\n %s' %
(cur_dir, self.base_directory))
- # Last, apply the additional explicit rules.
- for (_, rule_str) in enumerate(includes):
+ def AddRuleWithDescription(rule_str, dependee_regexp=None):
+ rule_block_name = 'include_rules'
+ if dependee_regexp:
+ rule_block_name = 'specific_include_rules'
if not relative_dir:
- rule_description = 'the top level include_rules'
+ rule_description = 'the top level %s' % rule_block_name
else:
- rule_description = relative_dir + "'s include_rules"
- rules.AddRule(rule_str, rule_description)
+ rule_description = relative_dir + "'s %s" % rule_block_name
+ rules.AddRule(rule_str, rule_description, dependee_regexp)
+
+ # Apply the additional explicit rules.
+ for (_, rule_str) in enumerate(includes):
+ AddRuleWithDescription(rule_str)
+
+ # Finally, apply the specific rules.
+ for regexp, specific_rules in specific_includes.iteritems():
+ for rule_str in specific_rules:
+ AddRuleWithDescription(rule_str, regexp)
return rules
@@ -239,9 +271,12 @@ class DepsChecker(object):
# Even if a DEPS file does not exist we still invoke ApplyRules
# to apply the implicit "allow" rule for the current directory
include_rules = local_scope.get(INCLUDE_RULES_VAR_NAME, [])
+ specific_include_rules = local_scope.get(SPECIFIC_INCLUDE_RULES_VAR_NAME,
+ {})
skip_subdirs = local_scope.get(SKIP_SUBDIRS_VAR_NAME, [])
- return (self._ApplyRules(existing_rules, include_rules, norm_dir_name),
+ return (self._ApplyRules(existing_rules, include_rules,
+ specific_include_rules, norm_dir_name),
skip_subdirs)
def _ApplyDirectoryRulesAndSkipSubdirs(self, parent_rules, dir_path):
@@ -357,7 +392,8 @@ class DepsChecker(object):
rules_for_file = self.GetDirectoryRules(os.path.dirname(file_path))
if rules_for_file:
for line in include_lines:
- is_include, violation = cpp.CheckLine(rules_for_file, line, True)
+ is_include, violation = cpp.CheckLine(
+ rules_for_file, line, file_path, True)
if violation:
rule_type = violation.violated_rule.allow
if rule_type != Rule.ALLOW:
« no previous file with comments | « no previous file | tools/checkdeps/checkdeps_test.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698