diff options
Diffstat (limited to 'android_webview/tools')
30 files changed, 233 insertions, 137 deletions
diff --git a/android_webview/tools/PRESUBMIT.py b/android_webview/tools/PRESUBMIT.py new file mode 100644 index 0000000..455701e --- /dev/null +++ b/android_webview/tools/PRESUBMIT.py @@ -0,0 +1,29 @@ +# Copyright 2014 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. + +def CheckChangeOnUpload(input_api, output_api): + return _CommonChecks(input_api, output_api) + +def CheckChangeOnCommit(input_api, output_api): + return _CommonChecks(input_api, output_api) + +def _CommonChecks(input_api, output_api): + """Checks common to both upload and commit.""" + results = [] + + would_affect_tests = [ + 'PRESUBMIT.py', + 'copyright_scanner.py', + 'copyright_scanner_unittest.py' + ] + need_to_run_unittests = False + for f in input_api.AffectedFiles(): + if any(t for t in would_affect_tests if f.LocalPath().endswith(t)): + need_to_run_unittests = True + break + tests = [input_api.os_path.join( + input_api.PresubmitLocalPath(), 'copyright_scanner_unittest.py')] + results.extend( + input_api.canned_checks.RunUnitTests(input_api, output_api, tests)) + return results diff --git a/android_webview/tools/copyright_scanner.py b/android_webview/tools/copyright_scanner.py index 90da30d..7e4ef0c 100644 --- a/android_webview/tools/copyright_scanner.py +++ b/android_webview/tools/copyright_scanner.py @@ -6,14 +6,13 @@ """ import itertools -import os -import re -def FindFiles(root_dir, start_paths_list, excluded_dirs_list): +def FindFiles(input_api, root_dir, start_paths_list, excluded_dirs_list): """Similar to UNIX utility find(1), searches for files in the directories. Automatically leaves out only source code files. Args: + input_api: InputAPI, as in presubmit scripts. root_dir: The root directory, to which all other paths are relative. start_paths_list: The list of paths to start search from. Each path can be a file or a directory. @@ -28,7 +27,7 @@ def FindFiles(root_dir, start_paths_list, excluded_dirs_list): return True return False - files_whitelist_re = re.compile( + files_whitelist_re = input_api.re.compile( r'\.(asm|c(c|pp|xx)?|h(h|pp|xx)?|p(l|m)|xs|sh|php|py(|x)' '|rb|idl|java|el|sc(i|e)|cs|pas|inc|js|pac|html|dtd|xsl|mod|mm?' '|tex|mli?)$') @@ -36,66 +35,75 @@ def FindFiles(root_dir, start_paths_list, excluded_dirs_list): base_path_len = len(root_dir) for path in start_paths_list: - full_path = os.path.join(root_dir, path) - if os.path.isfile(full_path): + full_path = input_api.os_path.join(root_dir, path) + if input_api.os_path.isfile(full_path): if files_whitelist_re.search(path): files.append(path) else: - for dirpath, dirnames, filenames in os.walk(full_path): + for dirpath, dirnames, filenames in input_api.os_walk(full_path): # Remove excluded subdirs for faster scanning. for item in dirnames[:]: - if IsBlacklistedDir(os.path.join(dirpath, item)[base_path_len + 1:]): + if IsBlacklistedDir( + input_api.os_path.join(dirpath, item)[base_path_len + 1:]): dirnames.remove(item) for filename in filenames: - filepath = os.path.join(dirpath, filename)[base_path_len + 1:] + filepath = \ + input_api.os_path.join(dirpath, filename)[base_path_len + 1:] if files_whitelist_re.search(filepath) and \ not IsBlacklistedDir(filepath): files.append(filepath) return files -python_multiline_string_double_re = re.compile( - r'"""[^"]*(?:"""|$)', flags=re.MULTILINE) -python_multiline_string_single_re = re.compile( - r"'''[^']*(?:'''|$)", flags=re.MULTILINE) -automatically_generated_re = re.compile( - r'(All changes made in this file will be lost' - '|DO NOT (EDIT|delete this file)' - '|Generated (at|automatically|data)' - '|Automatically generated' - '|\Wgenerated\s+(?:\w+\s+)*file\W)', flags=re.IGNORECASE) - -def _IsGeneratedFile(header): - header = header.upper() - if '"""' in header: - header = python_multiline_string_double_re.sub('', header) - if "'''" in header: - header = python_multiline_string_single_re.sub('', header) - # First do simple strings lookup to save time. - if 'ALL CHANGES MADE IN THIS FILE WILL BE LOST' in header: - return True - if 'DO NOT EDIT' in header or 'DO NOT DELETE' in header or \ - 'GENERATED' in header: - return automatically_generated_re.search(header) - return False - - -GENERATED_FILE = 'GENERATED FILE' -NO_COPYRIGHT = '*No copyright*' +class _GeneratedFilesDetector(object): + GENERATED_FILE = 'GENERATED FILE' + NO_COPYRIGHT = '*No copyright*' + + def __init__(self, input_api): + self.python_multiline_string_double_re = \ + input_api.re.compile(r'"""[^"]*(?:"""|$)', flags=input_api.re.MULTILINE) + self.python_multiline_string_single_re = \ + input_api.re.compile(r"'''[^']*(?:'''|$)", flags=input_api.re.MULTILINE) + self.automatically_generated_re = input_api.re.compile( + r'(All changes made in this file will be lost' + '|DO NOT (EDIT|delete this file)' + '|Generated (at|automatically|data)' + '|Automatically generated' + '|\Wgenerated\s+(?:\w+\s+)*file\W)', flags=input_api.re.IGNORECASE) + + def IsGeneratedFile(self, header): + header = header.upper() + if '"""' in header: + header = self.python_multiline_string_double_re.sub('', header) + if "'''" in header: + header = self.python_multiline_string_single_re.sub('', header) + # First do simple strings lookup to save time. + if 'ALL CHANGES MADE IN THIS FILE WILL BE LOST' in header: + return True + if 'DO NOT EDIT' in header or 'DO NOT DELETE' in header or \ + 'GENERATED' in header: + return self.automatically_generated_re.search(header) + return False + class _CopyrightsScanner(object): - _c_comment_re = re.compile(r'''"[^"\\]*(?:\\.[^"\\]*)*"''') - _copyright_indicator = r'(?:copyright|copr\.|\xc2\xa9|\(c\))' - _full_copyright_indicator_re = \ - re.compile(r'(?:\W|^)' + _copyright_indicator + r'(?::\s*|\s+)(\w.*)$', \ - re.IGNORECASE) - _copyright_disindicator_re = \ - re.compile(r'\s*\b(?:info(?:rmation)?|notice|and|or)\b', re.IGNORECASE) - - def __init__(self): + @staticmethod + def StaticInit(input_api): + _CopyrightsScanner._c_comment_re = \ + input_api.re.compile(r'''"[^"\\]*(?:\\.[^"\\]*)*"''') + _CopyrightsScanner._copyright_indicator = \ + r'(?:copyright|copr\.|\xc2\xa9|\(c\))' + _CopyrightsScanner._full_copyright_indicator_re = input_api.re.compile( + r'(?:\W|^)' + _CopyrightsScanner._copyright_indicator + \ + r'(?::\s*|\s+)(\w.*)$', input_api.re.IGNORECASE) + _CopyrightsScanner._copyright_disindicator_re = input_api.re.compile( + r'\s*\b(?:info(?:rmation)?|notice|and|or)\b', input_api.re.IGNORECASE) + + def __init__(self, input_api): self.max_line_numbers_proximity = 3 self.last_a_item_line_number = -200 self.last_b_item_line_number = -100 + self.re = input_api.re def _CloseLineNumbers(self, a, b): return 0 <= a - b <= self.max_line_numbers_proximity @@ -131,17 +139,20 @@ class _CopyrightsScanner(object): not _CopyrightsScanner._copyright_disindicator_re.match(m.group(1)): copyr = m.group(0) # Prettify the authorship string. - copyr = re.sub(r'([,.])?\s*$/', '', copyr) - copyr = re.sub(self._copyright_indicator, '', copyr, flags=re.IGNORECASE) - copyr = re.sub(r'^\s+', '', copyr) - copyr = re.sub(r'\s{2,}', ' ', copyr) - copyr = re.sub(r'\\@', '@', copyr) + copyr = self.re.sub(r'([,.])?\s*$/', '', copyr) + copyr = self.re.sub( + _CopyrightsScanner._copyright_indicator, '', copyr, \ + flags=self.re.IGNORECASE) + copyr = self.re.sub(r'^\s+', '', copyr) + copyr = self.re.sub(r'\s{2,}', ' ', copyr) + copyr = self.re.sub(r'\\@', '@', copyr) return copyr -def FindCopyrights(root_dir, files_to_scan): +def FindCopyrights(input_api, root_dir, files_to_scan): """Determines code autorship, and finds generated files. Args: + input_api: InputAPI, as in presubmit scripts. root_dir: The root directory, to which all other paths are relative. files_to_scan: The list of file names to scan. Returns: @@ -150,47 +161,52 @@ def FindCopyrights(root_dir, files_to_scan): entry -- 'GENERATED_FILE' string. If the file has no copyright info, the corresponding list contains 'NO_COPYRIGHT' string. """ + generated_files_detector = _GeneratedFilesDetector(input_api) + _CopyrightsScanner.StaticInit(input_api) copyrights = [] for file_name in files_to_scan: linenum = 0 - header = '' + header = [] file_copyrights = [] - scanner = _CopyrightsScanner() - with open(os.path.join(root_dir, file_name), 'r') as f: - for l in f.readlines(): - linenum += 1 - if linenum <= 25: - header += l - c = scanner.MatchLine(linenum, l) - if c: - file_copyrights.append(c) - if _IsGeneratedFile(header): - copyrights.append([GENERATED_FILE]) - elif file_copyrights: - copyrights.append(file_copyrights) - else: - copyrights.append([NO_COPYRIGHT]) + scanner = _CopyrightsScanner(input_api) + contents = input_api.ReadFile( + input_api.os_path.join(root_dir, file_name), 'r') + for l in contents.split('\n'): + linenum += 1 + if linenum <= 25: + header.append(l) + c = scanner.MatchLine(linenum, l) + if c: + file_copyrights.append(c) + if generated_files_detector.IsGeneratedFile('\n'.join(header)): + copyrights.append([_GeneratedFilesDetector.GENERATED_FILE]) + elif file_copyrights: + copyrights.append(file_copyrights) + else: + copyrights.append([_GeneratedFilesDetector.NO_COPYRIGHT]) return copyrights -def FindCopyrightViolations(root_dir, files_to_scan): +def FindCopyrightViolations(input_api, root_dir, files_to_scan): """Looks for files that are not belong exlusively to the Chromium Authors. Args: + input_api: InputAPI, as in presubmit scripts. root_dir: The root directory, to which all other paths are relative. files_to_scan: The list of file names to scan. Returns: The list of file names that contain non-Chromium copyrights. """ - copyrights = FindCopyrights(root_dir, files_to_scan) + copyrights = FindCopyrights(input_api, root_dir, files_to_scan) offending_files = [] - allowed_copyrights_re = re.compile( + allowed_copyrights_re = input_api.re.compile( r'^(?:20[0-9][0-9](?:-20[0-9][0-9])? The Chromium Authors\. ' 'All rights reserved.*)$') for f, cs in itertools.izip(files_to_scan, copyrights): - if cs[0] == GENERATED_FILE or cs[0] == NO_COPYRIGHT: + if cs[0] == _GeneratedFilesDetector.GENERATED_FILE or \ + cs[0] == _GeneratedFilesDetector.NO_COPYRIGHT: continue for c in cs: if not allowed_copyrights_re.match(c): - offending_files.append(os.path.normpath(f)) + offending_files.append(input_api.os_path.normpath(f)) break return offending_files diff --git a/android_webview/tools/copyright_scanner_unittest.py b/android_webview/tools/copyright_scanner_unittest.py new file mode 100755 index 0000000..df406d09 --- /dev/null +++ b/android_webview/tools/copyright_scanner_unittest.py @@ -0,0 +1,88 @@ +#!/usr/bin/env python +# Copyright 2014 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. + +"""Unit tests for Copyright Scanner utilities.""" + +import os +import re +import sys +import unittest + +test_dir = os.path.dirname(os.path.abspath(__file__)) +sys.path.extend([ + os.path.normpath(os.path.join(test_dir, '..', '..', 'tools')), + os.path.join(test_dir), +]) + +import find_depot_tools +from testing_support.super_mox import SuperMoxTestBase + +import copyright_scanner + +class FindCopyrightsTest(SuperMoxTestBase): + def setUp(self): + SuperMoxTestBase.setUp(self) + self.input_api = self.mox.CreateMockAnything() + self.input_api.re = re + self.input_api.os_path = os.path + self.input_api.os_walk = os.walk + + def ShouldMatchReferenceOutput(self, test_data, expected_output): + for data in test_data: + self.input_api.ReadFile = lambda _1, _2: data + actual_output = copyright_scanner.FindCopyrights(self.input_api, '', ['']) + self.assertEqual( + expected_output, + actual_output, + 'Input """\n%s""", expected output: "%s", actual: "%s"' % \ + (data, expected_output, actual_output)); + + def testCopyrightedFiles(self): + test_data = [ + '// (c) 2014 Google Inc.\n//\n// (a) One\n//\n// (b) Two\n//\n', + 'Copyright 2014 Google Inc.\n', + 'Copr. 2014 Google Inc.', + '\xc2\xa9 2014 Google Inc.', + 'Copyright 2014 Google Inc.' + ] + self.ShouldMatchReferenceOutput(test_data, [['2014 Google Inc.']]) + + def testGeneratedFiles(self): + test_data = [ + 'ALL CHANGES MADE IN THIS FILE WILL BE LOST\nCopyright 2014 Google\n', + 'GENERATED FILE. DO NOT EDIT\nCopyright 2014 Google\n', + 'GENERATED. DO NOT DELETE THIS FILE.\nCopyright 2014 Google\n', + 'DO NOT EDIT\nCopyright 2014 Google\n', + 'DO NOT DELETE THIS FILE\nCopyright 2014 Google\n', + 'All changes made in this file will be lost\nCopyright 2014 Google\n', + 'Automatically generated file\nCopyright 2014 Google\n', + 'Synthetically generated dummy file\nCopyright 2014 Google\n', + 'Generated data (by gnugnu)\nCopyright 2014 Google\n' + ] + self.ShouldMatchReferenceOutput(test_data, [['GENERATED FILE']]) + + def testNonCopyrightedFiles(self): + test_data = [ + 'std::cout << "Copyright 2014 Google"\n', + '// Several points can be made:\n//\n// (a) One\n//\n// (b) Two\n' + '//\n// (c) Three\n//\n', + 'See \'foo\' for copyright information.\n', + 'See \'foo\' for the copyright notice.\n', + 'See \'foo\' for the copyright and other things.\n' + ] + self.ShouldMatchReferenceOutput(test_data, [['*No copyright*']]) + + def testNonGeneratedFiles(self): + test_data = [ + 'This file was prohibited from being generated.\n', + 'Please do not delete our files! They are valuable to us.\n', + 'Manually generated from dice rolls.\n', + '"""This Python script produces generated data\n"""\n', + '\'\'\'This Python script produces generated data\n\'\'\'\n' + ] + self.ShouldMatchReferenceOutput(test_data, [['*No copyright*']]) + +if __name__ == '__main__': + unittest.main() diff --git a/android_webview/tools/run_find_copyrights_manual_tests.sh b/android_webview/tools/run_find_copyrights_manual_tests.sh deleted file mode 100755 index 88ef193..0000000 --- a/android_webview/tools/run_find_copyrights_manual_tests.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh -# Copyright 2014 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. -find android_webview/tools/tests -type f | sort \ - | android_webview/tools/webview_licenses.py display_copyrights diff --git a/android_webview/tools/tests/copyright-01 b/android_webview/tools/tests/copyright-01 deleted file mode 100644 index 414f52c..0000000 --- a/android_webview/tools/tests/copyright-01 +++ /dev/null @@ -1,6 +0,0 @@ -// (c) 2014 Google Inc. -// -// (a) One -// -// (b) Two -// diff --git a/android_webview/tools/tests/copyright-02 b/android_webview/tools/tests/copyright-02 deleted file mode 100644 index 2fb8825..0000000 --- a/android_webview/tools/tests/copyright-02 +++ /dev/null @@ -1 +0,0 @@ -Copyright 2014 Google Inc. diff --git a/android_webview/tools/tests/copyright-03 b/android_webview/tools/tests/copyright-03 deleted file mode 100644 index 05d7d35..0000000 --- a/android_webview/tools/tests/copyright-03 +++ /dev/null @@ -1 +0,0 @@ -Copr. 2014 Google Inc. diff --git a/android_webview/tools/tests/copyright-04 b/android_webview/tools/tests/copyright-04 deleted file mode 100644 index cb0e164..0000000 --- a/android_webview/tools/tests/copyright-04 +++ /dev/null @@ -1 +0,0 @@ -© 2014 Google Inc. diff --git a/android_webview/tools/tests/copyright-05 b/android_webview/tools/tests/copyright-05 deleted file mode 100644 index c47eb57..0000000 --- a/android_webview/tools/tests/copyright-05 +++ /dev/null @@ -1 +0,0 @@ -Copyright 2014 Google Inc. diff --git a/android_webview/tools/tests/generated-01 b/android_webview/tools/tests/generated-01 deleted file mode 100644 index bfc2944..0000000 --- a/android_webview/tools/tests/generated-01 +++ /dev/null @@ -1,2 +0,0 @@ -ALL CHANGES MADE IN THIS FILE WILL BE LOST -Copyright 2014 Google diff --git a/android_webview/tools/tests/generated-02 b/android_webview/tools/tests/generated-02 deleted file mode 100644 index a5a3c1a..0000000 --- a/android_webview/tools/tests/generated-02 +++ /dev/null @@ -1,2 +0,0 @@ -GENERATED FILE. DO NOT EDIT -Copyright 2014 Google diff --git a/android_webview/tools/tests/generated-03 b/android_webview/tools/tests/generated-03 deleted file mode 100644 index be609a7..0000000 --- a/android_webview/tools/tests/generated-03 +++ /dev/null @@ -1,2 +0,0 @@ -GENERATED. DO NOT DELETE THIS FILE. -Copyright 2014 Google diff --git a/android_webview/tools/tests/generated-04 b/android_webview/tools/tests/generated-04 deleted file mode 100644 index f14a94e..0000000 --- a/android_webview/tools/tests/generated-04 +++ /dev/null @@ -1,2 +0,0 @@ -DO NOT EDIT -Copyright 2014 Google diff --git a/android_webview/tools/tests/generated-05 b/android_webview/tools/tests/generated-05 deleted file mode 100644 index 66bf448..0000000 --- a/android_webview/tools/tests/generated-05 +++ /dev/null @@ -1,2 +0,0 @@ -DO NOT DELETE THIS FILE -Copyright 2014 Google diff --git a/android_webview/tools/tests/generated-06 b/android_webview/tools/tests/generated-06 deleted file mode 100644 index 02932e3..0000000 --- a/android_webview/tools/tests/generated-06 +++ /dev/null @@ -1,2 +0,0 @@ -All changes made in this file will be lost -Copyright 2014 Google diff --git a/android_webview/tools/tests/generated-07 b/android_webview/tools/tests/generated-07 deleted file mode 100644 index 0b1ffab..0000000 --- a/android_webview/tools/tests/generated-07 +++ /dev/null @@ -1,2 +0,0 @@ -Automatically generated file -Copyright 2014 Google diff --git a/android_webview/tools/tests/generated-08 b/android_webview/tools/tests/generated-08 deleted file mode 100644 index a9d23dd..0000000 --- a/android_webview/tools/tests/generated-08 +++ /dev/null @@ -1,2 +0,0 @@ -Synthetically generated dummy file -Copyright 2014 Google diff --git a/android_webview/tools/tests/generated-09 b/android_webview/tools/tests/generated-09 deleted file mode 100644 index f79ef34..0000000 --- a/android_webview/tools/tests/generated-09 +++ /dev/null @@ -1,2 +0,0 @@ -Generated data (by gnugnu) -Copyright 2014 Google diff --git a/android_webview/tools/tests/no-copyright-01 b/android_webview/tools/tests/no-copyright-01 deleted file mode 100644 index ac4787e..0000000 --- a/android_webview/tools/tests/no-copyright-01 +++ /dev/null @@ -1 +0,0 @@ -std::cout << "Copyright 2014 Google" diff --git a/android_webview/tools/tests/no-copyright-02 b/android_webview/tools/tests/no-copyright-02 deleted file mode 100644 index 6257f7d..0000000 --- a/android_webview/tools/tests/no-copyright-02 +++ /dev/null @@ -1,9 +0,0 @@ -// Several points can be made: -// -// (a) One -// -// (b) Two -// -// (c) Three -// - diff --git a/android_webview/tools/tests/no-copyright-03 b/android_webview/tools/tests/no-copyright-03 deleted file mode 100644 index 289d451..0000000 --- a/android_webview/tools/tests/no-copyright-03 +++ /dev/null @@ -1 +0,0 @@ -See 'foo' for copyright information. diff --git a/android_webview/tools/tests/no-copyright-04 b/android_webview/tools/tests/no-copyright-04 deleted file mode 100644 index 390a71b..0000000 --- a/android_webview/tools/tests/no-copyright-04 +++ /dev/null @@ -1 +0,0 @@ -See 'foo' for the copyright notice. diff --git a/android_webview/tools/tests/no-copyright-05 b/android_webview/tools/tests/no-copyright-05 deleted file mode 100644 index 654d261..0000000 --- a/android_webview/tools/tests/no-copyright-05 +++ /dev/null @@ -1 +0,0 @@ -See 'foo' for the copyright and other things. diff --git a/android_webview/tools/tests/non-generated-01 b/android_webview/tools/tests/non-generated-01 deleted file mode 100644 index b0be44d..0000000 --- a/android_webview/tools/tests/non-generated-01 +++ /dev/null @@ -1 +0,0 @@ -This file was prohibited from being generated. diff --git a/android_webview/tools/tests/non-generated-02 b/android_webview/tools/tests/non-generated-02 deleted file mode 100644 index 758b570..0000000 --- a/android_webview/tools/tests/non-generated-02 +++ /dev/null @@ -1 +0,0 @@ -Please do not delete our files! They are valuable to us. diff --git a/android_webview/tools/tests/non-generated-03 b/android_webview/tools/tests/non-generated-03 deleted file mode 100644 index e93fcd4..0000000 --- a/android_webview/tools/tests/non-generated-03 +++ /dev/null @@ -1 +0,0 @@ -Manually generated from dice rolls. diff --git a/android_webview/tools/tests/non-generated-04 b/android_webview/tools/tests/non-generated-04 deleted file mode 100644 index 20634ec..0000000 --- a/android_webview/tools/tests/non-generated-04 +++ /dev/null @@ -1,2 +0,0 @@ -"""This Python script produces generated data -""" diff --git a/android_webview/tools/tests/non-generated-05 b/android_webview/tools/tests/non-generated-05 deleted file mode 100644 index 5d00845..0000000 --- a/android_webview/tools/tests/non-generated-05 +++ /dev/null @@ -1,2 +0,0 @@ -'''This Python script produces generated data -''' diff --git a/android_webview/tools/third_party_files_whitelist.txt b/android_webview/tools/third_party_files_whitelist.txt index 986467f..c789230 100644 --- a/android_webview/tools/third_party_files_whitelist.txt +++ b/android_webview/tools/third_party_files_whitelist.txt @@ -9,6 +9,8 @@ # so additions to this file should be rare. See # http://www.chromium.org/developers/adding-3rd-party-libraries. +# Contains test strings that look like copyrights. +android_webview/tools/copyright_scanner_unittest.py # Copyright IBM; MIT license. This third-party code is taken from ICU, the # license for which we already pick up from third_party/icu/. base/i18n/icu_string_conversions.cc diff --git a/android_webview/tools/webview_licenses.py b/android_webview/tools/webview_licenses.py index 8d09630..3b4e006 100755 --- a/android_webview/tools/webview_licenses.py +++ b/android_webview/tools/webview_licenses.py @@ -44,7 +44,10 @@ import known_issues class InputApi(object): def __init__(self): + self.os_path = os.path + self.os_walk = os.walk self.re = re + self.ReadFile = _ReadFile def GetIncompatibleDirectories(): """Gets a list of third-party directories which use licenses incompatible @@ -99,7 +102,7 @@ class ScanResult(object): # Needs to be a top-level function for multiprocessing def _FindCopyrightViolations(files_to_scan_as_string): return copyright_scanner.FindCopyrightViolations( - REPOSITORY_ROOT, files_to_scan_as_string) + InputApi(), REPOSITORY_ROOT, files_to_scan_as_string) def _ShardList(l, shard_len): return [l[i:i + shard_len] for i in range(0, len(l), shard_len)] @@ -157,7 +160,7 @@ def _CheckLicenseHeaders(excluded_dirs_list, whitelisted_files): excluded_dirs_list.append('skia/tools/clusterfuzz-data') files_to_scan = copyright_scanner.FindFiles( - REPOSITORY_ROOT, ['.'], excluded_dirs_list) + InputApi(), REPOSITORY_ROOT, ['.'], excluded_dirs_list) sharded_files_to_scan = _ShardList(files_to_scan, 2000) pool = multiprocessing.Pool() offending_files_chunks = pool.map_async( @@ -193,7 +196,19 @@ def _CheckLicenseHeaders(excluded_dirs_list, whitelisted_files): return ScanResult.Ok -def _ReadFile(path): +def _ReadFile(full_path, mode='rU'): + """Reads a file from disk. This emulates presubmit InputApi.ReadFile func. + Args: + full_path: The path of the file to read. + Returns: + The contents of the file as a string. + """ + + with open(full_path, mode) as f: + return f.read() + + +def _ReadLocalFile(path, mode='rb'): """Reads a file from disk. Args: path: The path of the file to read, relative to the root of the repository. @@ -201,8 +216,7 @@ def _ReadFile(path): The contents of the file as a string. """ - with open(os.path.join(REPOSITORY_ROOT, path), 'rb') as f: - return f.read() + return _ReadFile(os.path.join(REPOSITORY_ROOT, path), mode) def _FindThirdPartyDirs(): @@ -262,8 +276,8 @@ def _Scan(): all_licenses_valid = False # Second, check for non-standard license text. - files_data = _ReadFile(os.path.join('android_webview', 'tools', - 'third_party_files_whitelist.txt')) + files_data = _ReadLocalFile(os.path.join('android_webview', 'tools', + 'third_party_files_whitelist.txt')) whitelisted_files = [] for line in files_data.splitlines(): match = re.match(r'([^#\s]+)', line) @@ -284,7 +298,7 @@ def GenerateNoticeFile(): third_party_dirs = _FindThirdPartyDirs() # Don't forget Chromium's LICENSE file - content = [_ReadFile('LICENSE')] + content = [_ReadLocalFile('LICENSE')] # We provide attribution for all third-party directories. # TODO(steveblock): Limit this to only code used by the WebView binary. @@ -293,7 +307,7 @@ def GenerateNoticeFile(): require_license_file=False) license_file = metadata['License File'] if license_file and license_file != licenses.NOT_SHIPPED: - content.append(_ReadFile(license_file)) + content.append(_ReadLocalFile(license_file)) return '\n'.join(content) @@ -344,7 +358,8 @@ def main(): return _ProcessIncompatibleResult(GetIncompatibleDirectories()) elif args[0] == 'display_copyrights': files = sys.stdin.read().splitlines() - for f, c in zip(files, copyright_scanner.FindCopyrights('.', files)): + for f, c in \ + zip(files, copyright_scanner.FindCopyrights(InputApi(), '.', files)): print f, '\t', ' / '.join(sorted(c)) return ScanResult.Ok parser.print_help() |