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

Side by Side Diff: tools/checkdeps/checkdeps.py

Issue 21025: Fix the dependency checker tool. Rules for a directory did modify their direc... (Closed) Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: '' Created 11 years, 10 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/base/DEPS ('k') | webkit/DEPS » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/python 1 #!/usr/bin/python
2 # Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 """Makes sure that files include headers from allowed directories. 6 """Makes sure that files include headers from allowed directories.
7 7
8 Checks DEPS files in the source tree for rules, and applies those rules to 8 Checks DEPS files in the source tree for rules, and applies those rules to
9 "#include" commands in source files. Any source file including something not 9 "#include" commands in source files. Any source file including something not
10 permitted by the DEPS files will fail. 10 permitted by the DEPS files will fail.
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 49
50 Note that all directory separators must be slashes (Unix-style) and not 50 Note that all directory separators must be slashes (Unix-style) and not
51 backslashes. All directories should be relative to the source root and use 51 backslashes. All directories should be relative to the source root and use
52 only lowercase. 52 only lowercase.
53 """ 53 """
54 54
55 import os 55 import os
56 import optparse 56 import optparse
57 import re 57 import re
58 import sys 58 import sys
59 import copy
59 60
60 # Variable name used in the DEPS file to specify module-level deps. 61 # Variable name used in the DEPS file to specify module-level deps.
61 DEPS_VAR_NAME = "deps" 62 DEPS_VAR_NAME = "deps"
62 63
63 # Variable name used in the DEPS file to add or subtract include files from 64 # Variable name used in the DEPS file to add or subtract include files from
64 # the module-level deps. 65 # the module-level deps.
65 INCLUDE_RULES_VAR_NAME = "include_rules" 66 INCLUDE_RULES_VAR_NAME = "include_rules"
66 67
67 # Optionally present in the DEPS file to list subdirectories which should not 68 # Optionally present in the DEPS file to list subdirectories which should not
68 # be checked. This allows us to skip third party code, for example. 69 # be checked. This allows us to skip third party code, for example.
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
173 Args: 174 Args:
174 existing_rules: A set of existing rules that will be combined. 175 existing_rules: A set of existing rules that will be combined.
175 deps: The list of imports from the "deps" section of the DEPS file. 176 deps: The list of imports from the "deps" section of the DEPS file.
176 include: The list of rules from the "include_rules" section of DEPS. 177 include: The list of rules from the "include_rules" section of DEPS.
177 cur_dir: The current directory. We will create an implicit rule that 178 cur_dir: The current directory. We will create an implicit rule that
178 allows inclusion from this directory. 179 allows inclusion from this directory.
179 180
180 Returns: A new set of rules combining the existing_rules with the other 181 Returns: A new set of rules combining the existing_rules with the other
181 arguments. 182 arguments.
182 """ 183 """
183 rules = existing_rules 184 rules = copy.copy(existing_rules)
184 185
185 # First apply the implicit "allow" rule for the current directory. 186 # First apply the implicit "allow" rule for the current directory.
186 if cur_dir.lower().startswith(BASE_DIRECTORY): 187 if cur_dir.lower().startswith(BASE_DIRECTORY):
187 relative_dir = cur_dir[len(BASE_DIRECTORY) + 1:] 188 relative_dir = cur_dir[len(BASE_DIRECTORY) + 1:]
188 # Normalize path separators to slashes. 189 # Normalize path separators to slashes.
189 relative_dir = relative_dir.replace("\\", "/") 190 relative_dir = relative_dir.replace("\\", "/")
190 source = relative_dir 191 source = relative_dir
191 if len(source) == 0: 192 if len(source) == 0:
192 source = "top level" # Make the help string a little more meaningful. 193 source = "top level" # Make the help string a little more meaningful.
193 rules.AddRule("+" + relative_dir, "Default rule for " + source) 194 rules.AddRule("+" + relative_dir, "Default rule for " + source)
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
248 249
249 def Lookup(self, var_name): 250 def Lookup(self, var_name):
250 """Implements the Var syntax.""" 251 """Implements the Var syntax."""
251 if var_name in self._local_scope.get("vars", {}): 252 if var_name in self._local_scope.get("vars", {}):
252 return self._local_scope["vars"][var_name] 253 return self._local_scope["vars"][var_name]
253 raise Error("Var is not defined: %s" % var_name) 254 raise Error("Var is not defined: %s" % var_name)
254 255
255 local_scope = {} 256 local_scope = {}
256 global_scope = {"From": FromImpl, "Var": _VarImpl(local_scope).Lookup} 257 global_scope = {"From": FromImpl, "Var": _VarImpl(local_scope).Lookup}
257 deps_file = os.path.join(dir_name, "DEPS") 258 deps_file = os.path.join(dir_name, "DEPS")
258 if not os.path.exists(deps_file):
259 if VERBOSE:
260 print " No deps file found in", dir_name
261 return (existing_rules, []) # Nothing to change from the input rules.
262 259
263 execfile(deps_file, global_scope, local_scope) 260 if os.path.exists(deps_file):
261 execfile(deps_file, global_scope, local_scope)
262 elif VERBOSE:
263 print " No deps file found in", dir_name
264 264
265 # Even if a DEPS file does not exist we still invoke ApplyRules
266 # to apply the implicit "allow" rule for the current directory
265 deps = local_scope.get(DEPS_VAR_NAME, {}) 267 deps = local_scope.get(DEPS_VAR_NAME, {})
266 include_rules = local_scope.get(INCLUDE_RULES_VAR_NAME, []) 268 include_rules = local_scope.get(INCLUDE_RULES_VAR_NAME, [])
267 skip_subdirs = local_scope.get(SKIP_SUBDIRS_VAR_NAME, []) 269 skip_subdirs = local_scope.get(SKIP_SUBDIRS_VAR_NAME, [])
268 270
269 return (ApplyRules(existing_rules, deps, include_rules, dir_name), 271 return (ApplyRules(existing_rules, deps, include_rules, dir_name),
270 skip_subdirs) 272 skip_subdirs)
271 273
272 274
273 def ShouldCheckFile(file_name): 275 def ShouldCheckFile(file_name):
274 """Returns True if the given file is a type we want to check.""" 276 """Returns True if the given file is a type we want to check."""
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
341 if VERBOSE: 343 if VERBOSE:
342 print "Unable to open file: " + file_name 344 print "Unable to open file: " + file_name
343 cur_file.close() 345 cur_file.close()
344 346
345 # Map empty string to None for easier checking. 347 # Map empty string to None for easier checking.
346 if len(ret_val) == 0: 348 if len(ret_val) == 0:
347 return None 349 return None
348 return ret_val 350 return ret_val
349 351
350 352
351 def CheckDirectory(rules, dir_name): 353 def CheckDirectory(parent_rules, dir_name):
352 (rules, skip_subdirs) = ApplyDirectoryRules(rules, dir_name) 354 (rules, skip_subdirs) = ApplyDirectoryRules(parent_rules, dir_name)
353 if rules == None: 355 if rules == None:
354 return True 356 return True
355 357
356 # Collect a list of all files and directories to check. 358 # Collect a list of all files and directories to check.
357 files_to_check = [] 359 files_to_check = []
358 dirs_to_check = [] 360 dirs_to_check = []
359 success = True 361 success = True
360 contents = os.listdir(dir_name) 362 contents = os.listdir(dir_name)
361 for cur in contents: 363 for cur in contents:
362 if cur in skip_subdirs: 364 if cur in skip_subdirs:
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
446 option_parser.add_option("", "--root", default="", dest="base_directory", 448 option_parser.add_option("", "--root", default="", dest="base_directory",
447 help='Specifies the repository root. This defaults ' 449 help='Specifies the repository root. This defaults '
448 'to "../../.." relative to the script file, which ' 450 'to "../../.." relative to the script file, which '
449 'will normally be the repository root.') 451 'will normally be the repository root.')
450 option_parser.add_option("-v", "--verbose", action="store_true", 452 option_parser.add_option("-v", "--verbose", action="store_true",
451 default=False, help="Print debug logging") 453 default=False, help="Print debug logging")
452 options, args = option_parser.parse_args() 454 options, args = option_parser.parse_args()
453 main(options, args) 455 main(options, args)
454 456
455 457
OLDNEW
« no previous file with comments | « net/base/DEPS ('k') | webkit/DEPS » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698