Index: tools/checkdeps/checkdeps.py |
diff --git a/tools/checkdeps/checkdeps.py b/tools/checkdeps/checkdeps.py |
deleted file mode 100755 |
index 5bf79076063b98d5293616292d4b9157b7044196..0000000000000000000000000000000000000000 |
--- a/tools/checkdeps/checkdeps.py |
+++ /dev/null |
@@ -1,237 +0,0 @@ |
-#!/usr/bin/env python |
-# Copyright 2012 The Chromium Authors. All rights reserved. |
-# Use of this source code is governed by a BSD-style license that can be |
-# found in the LICENSE file. |
- |
-"""Makes sure that files include headers from allowed directories. |
- |
-Checks DEPS files in the source tree for rules, and applies those rules to |
-"#include" and "import" directives in the .cpp and .java source files. |
-Any source file including something not permitted by the DEPS files will fail. |
- |
-See builddeps.py for a detailed description of the DEPS format. |
-""" |
- |
-import os |
-import optparse |
-import re |
-import sys |
- |
-import cpp_checker |
-import java_checker |
-import results |
- |
-from builddeps import DepsBuilder |
-from rules import Rule, Rules |
- |
- |
-def _IsTestFile(filename): |
- """Does a rudimentary check to try to skip test files; this could be |
- improved but is good enough for now. |
- """ |
- return re.match('(test|mock|dummy)_.*|.*_[a-z]*test\.(cc|mm|java)', filename) |
- |
- |
-class DepsChecker(DepsBuilder): |
- """Parses include_rules from DEPS files and verifies files in the |
- source tree against them. |
- """ |
- |
- def __init__(self, |
- base_directory=None, |
- verbose=False, |
- being_tested=False, |
- ignore_temp_rules=False, |
- skip_tests=False): |
- """Creates a new DepsChecker. |
- |
- Args: |
- base_directory: OS-compatible path to root of checkout, e.g. C:\chr\src. |
- verbose: Set to true for debug output. |
- being_tested: Set to true to ignore the DEPS file at tools/checkdeps/DEPS. |
- ignore_temp_rules: Ignore rules that start with Rule.TEMP_ALLOW ("!"). |
- """ |
- DepsBuilder.__init__( |
- self, base_directory, verbose, being_tested, ignore_temp_rules) |
- |
- self._skip_tests = skip_tests |
- self.results_formatter = results.NormalResultsFormatter(verbose) |
- |
- def Report(self): |
- """Prints a report of results, and returns an exit code for the process.""" |
- if self.results_formatter.GetResults(): |
- self.results_formatter.PrintResults() |
- return 1 |
- print '\nSUCCESS\n' |
- return 0 |
- |
- def CheckDirectory(self, start_dir): |
- """Checks all relevant source files in the specified directory and |
- its subdirectories for compliance with DEPS rules throughout the |
- tree (starting at |self.base_directory|). |start_dir| must be a |
- subdirectory of |self.base_directory|. |
- |
- On completion, self.results_formatter has the results of |
- processing, and calling Report() will print a report of results. |
- """ |
- java = java_checker.JavaChecker(self.base_directory, self.verbose) |
- cpp = cpp_checker.CppChecker(self.verbose) |
- checkers = dict( |
- (extension, checker) |
- for checker in [java, cpp] for extension in checker.EXTENSIONS) |
- self._CheckDirectoryImpl(checkers, start_dir) |
- |
- def _CheckDirectoryImpl(self, checkers, dir_name): |
- rules = self.GetDirectoryRules(dir_name) |
- if rules is None: |
- return |
- |
- # Collect a list of all files and directories to check. |
- files_to_check = [] |
- dirs_to_check = [] |
- contents = sorted(os.listdir(dir_name)) |
- for cur in contents: |
- full_name = os.path.join(dir_name, cur) |
- if os.path.isdir(full_name): |
- dirs_to_check.append(full_name) |
- elif os.path.splitext(full_name)[1] in checkers: |
- if not self._skip_tests or not _IsTestFile(cur): |
- files_to_check.append(full_name) |
- |
- # First check all files in this directory. |
- for cur in files_to_check: |
- checker = checkers[os.path.splitext(cur)[1]] |
- file_status = checker.CheckFile(rules, cur) |
- if file_status.HasViolations(): |
- self.results_formatter.AddError(file_status) |
- |
- # Next recurse into the subdirectories. |
- for cur in dirs_to_check: |
- self._CheckDirectoryImpl(checkers, cur) |
- |
- def CheckAddedCppIncludes(self, added_includes): |
- """This is used from PRESUBMIT.py to check new #include statements added in |
- the change being presubmit checked. |
- |
- Args: |
- added_includes: ((file_path, (include_line, include_line, ...), ...) |
- |
- Return: |
- A list of tuples, (bad_file_path, rule_type, rule_description) |
- where rule_type is one of Rule.DISALLOW or Rule.TEMP_ALLOW and |
- rule_description is human-readable. Empty if no problems. |
- """ |
- cpp = cpp_checker.CppChecker(self.verbose) |
- problems = [] |
- for file_path, include_lines in added_includes: |
- if not cpp.IsCppFile(file_path): |
- continue |
- rules_for_file = self.GetDirectoryRules(os.path.dirname(file_path)) |
- if not rules_for_file: |
- continue |
- for line in include_lines: |
- is_include, violation = cpp.CheckLine( |
- rules_for_file, line, file_path, True) |
- if not violation: |
- continue |
- rule_type = violation.violated_rule.allow |
- if rule_type == Rule.ALLOW: |
- continue |
- violation_text = results.NormalResultsFormatter.FormatViolation( |
- violation, self.verbose) |
- problems.append((file_path, rule_type, violation_text)) |
- return problems |
- |
- |
-def PrintUsage(): |
- print """Usage: python checkdeps.py [--root <root>] [tocheck] |
- |
- --root ROOT Specifies the repository root. This defaults to "../../.." |
- relative to the script file. This will be correct given the |
- normal location of the script in "<root>/tools/checkdeps". |
- |
- --(others) There are a few lesser-used options; run with --help to show them. |
- |
- tocheck Specifies the directory, relative to root, to check. This defaults |
- to "." so it checks everything. |
- |
-Examples: |
- python checkdeps.py |
- python checkdeps.py --root c:\\source chrome""" |
- |
- |
-def main(): |
- option_parser = optparse.OptionParser() |
- option_parser.add_option( |
- '', '--root', |
- default='', dest='base_directory', |
- help='Specifies the repository root. This defaults ' |
- 'to "../../.." relative to the script file, which ' |
- 'will normally be the repository root.') |
- option_parser.add_option( |
- '', '--ignore-temp-rules', |
- action='store_true', dest='ignore_temp_rules', default=False, |
- help='Ignore !-prefixed (temporary) rules.') |
- option_parser.add_option( |
- '', '--generate-temp-rules', |
- action='store_true', dest='generate_temp_rules', default=False, |
- help='Print rules to temporarily allow files that fail ' |
- 'dependency checking.') |
- option_parser.add_option( |
- '', '--count-violations', |
- action='store_true', dest='count_violations', default=False, |
- help='Count #includes in violation of intended rules.') |
- option_parser.add_option( |
- '', '--skip-tests', |
- action='store_true', dest='skip_tests', default=False, |
- help='Skip checking test files (best effort).') |
- option_parser.add_option( |
- '-v', '--verbose', |
- action='store_true', default=False, |
- help='Print debug logging') |
- option_parser.add_option( |
- '', '--json', |
- help='Path to JSON output file') |
- options, args = option_parser.parse_args() |
- |
- deps_checker = DepsChecker(options.base_directory, |
- verbose=options.verbose, |
- ignore_temp_rules=options.ignore_temp_rules, |
- skip_tests=options.skip_tests) |
- base_directory = deps_checker.base_directory # Default if needed, normalized |
- |
- # Figure out which directory we have to check. |
- start_dir = base_directory |
- if len(args) == 1: |
- # Directory specified. Start here. It's supposed to be relative to the |
- # base directory. |
- start_dir = os.path.abspath(os.path.join(base_directory, args[0])) |
- elif len(args) >= 2 or (options.generate_temp_rules and |
- options.count_violations): |
- # More than one argument, or incompatible flags, we don't handle this. |
- PrintUsage() |
- return 1 |
- |
- if not start_dir.startswith(deps_checker.base_directory): |
- print 'Directory to check must be a subdirectory of the base directory,' |
- print 'but %s is not a subdirectory of %s' % (start_dir, base_directory) |
- return 1 |
- |
- print 'Using base directory:', base_directory |
- print 'Checking:', start_dir |
- |
- if options.generate_temp_rules: |
- deps_checker.results_formatter = results.TemporaryRulesFormatter() |
- elif options.count_violations: |
- deps_checker.results_formatter = results.CountViolationsFormatter() |
- |
- if options.json: |
- deps_checker.results_formatter = results.JSONResultsFormatter( |
- options.json, deps_checker.results_formatter) |
- |
- deps_checker.CheckDirectory(start_dir) |
- return deps_checker.Report() |
- |
- |
-if '__main__' == __name__: |
- sys.exit(main()) |