From 14a6131ccc19f95f058d39e038b7bbed21431688 Mon Sep 17 00:00:00 2001 From: "joi@chromium.org" Date: Wed, 8 Jan 2014 01:15:41 +0000 Subject: [PATCH] Do per-file OWNERS check for per-file DEPS changes. Before this, an OWNER of the entire directory that a new DEPS rule was pointing to would be required, even when the DEPS rule specified an individual file for which there are per-file OWNERS in the OWNERS file. BUG=290401 Review URL: https://codereview.chromium.org/116443011 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@243459 0039d316-1c4b-4281-b951-d872f2087c98 --- PRESUBMIT.py | 31 +++++++++++++++++++++++++------ PRESUBMIT_test.py | 15 ++++++++------- 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/PRESUBMIT.py b/PRESUBMIT.py index aa8d97f3aa27..0cd69c99ecbc 100644 --- a/PRESUBMIT.py +++ b/PRESUBMIT.py @@ -781,9 +781,14 @@ def _CheckNoAbbreviationInPngFileName(input_api, output_api): return results -def _DepsFilesToCheck(re, changed_lines): +def _FilesToCheckForIncomingDeps(re, changed_lines): """Helper method for _CheckAddedDepsHaveTargetApprovals. Returns - a set of DEPS entries that we should look up.""" + a set of DEPS entries that we should look up. + + For a directory (rather than a specific filename) we fake a path to + a specific filename by adding /DEPS. This is chosen as a file that + will seldom or never be subject to per-file include_rules. + """ # We ignore deps entries on auto-generated directories. AUTO_GENERATED_DIRS = ['grit', 'jni'] @@ -799,7 +804,10 @@ def _DepsFilesToCheck(re, changed_lines): if m: path = m.group(1) if path.split('/')[0] not in AUTO_GENERATED_DIRS: - results.add('%s/DEPS' % m.group(1)) + if m.group(2): + results.add('%s%s' % (path, m.group(2))) + else: + results.add('%s/DEPS' % path) return results @@ -819,7 +827,8 @@ def _CheckAddedDepsHaveTargetApprovals(input_api, output_api): if not changed_lines: return [] - virtual_depended_on_files = _DepsFilesToCheck(input_api.re, changed_lines) + virtual_depended_on_files = _FilesToCheckForIncomingDeps(input_api.re, + changed_lines) if not virtual_depended_on_files: return [] @@ -848,12 +857,22 @@ def _CheckAddedDepsHaveTargetApprovals(input_api, output_api): reviewers_plus_owner.add(owner_email) missing_files = owners_db.files_not_covered_by(virtual_depended_on_files, reviewers_plus_owner) - unapproved_dependencies = ["'+%s'," % path[:-len('/DEPS')] + + # We strip the /DEPS part that was added by + # _FilesToCheckForIncomingDeps to fake a path to a file in a + # directory. + def StripDeps(path): + start_deps = path.rfind('/DEPS') + if start_deps != -1: + return path[:start_deps] + else: + return path + unapproved_dependencies = ["'+%s'," % StripDeps(path) for path in missing_files] if unapproved_dependencies: output_list = [ - output('Missing LGTM from OWNERS of directories added to DEPS:\n %s' % + output('Missing LGTM from OWNERS of dependencies added to DEPS:\n %s' % '\n '.join(sorted(unapproved_dependencies)))] if not input_api.is_committing: suggested_owners = owners_db.reviewers_for(missing_files, owner_email) diff --git a/PRESUBMIT_test.py b/PRESUBMIT_test.py index c6b280a64f5c..2d6e066a2dfa 100755 --- a/PRESUBMIT_test.py +++ b/PRESUBMIT_test.py @@ -394,7 +394,7 @@ def testValidOSMacroNames(self): class CheckAddedDepsHaveTetsApprovalsTest(unittest.TestCase): - def testDepsFilesToCheck(self): + def testFilesToCheckForIncomingDeps(self): changed_lines = [ '"+breakpad",', '"+chrome/installer",', @@ -404,6 +404,7 @@ def testDepsFilesToCheck(self): '"+components/breakpad",', '"+components/nacl/common",', '"+content/public/browser/render_process_host.h",', + '"+jni/fooblat.h",', '"+grit", # For generated headers', '"+grit/generated_resources.h",', '"+grit/",', @@ -412,20 +413,20 @@ def testDepsFilesToCheck(self): '"+tools/memory_watcher",', '"+third_party/lss/linux_syscall_support.h",', ] - files_to_check = PRESUBMIT._DepsFilesToCheck(re, changed_lines) + files_to_check = PRESUBMIT._FilesToCheckForIncomingDeps(re, changed_lines) expected = set([ 'breakpad/DEPS', 'chrome/installer/DEPS', - 'chrome/plugin/DEPS', - 'chrome/utility/DEPS', - 'chromeos/DEPS', + 'chrome/plugin/chrome_content_plugin_client.h', + 'chrome/utility/chrome_content_utility_client.h', + 'chromeos/chromeos_paths.h', 'components/breakpad/DEPS', 'components/nacl/common/DEPS', - 'content/public/browser/DEPS', + 'content/public/browser/render_process_host.h', 'policy/DEPS', 'sandbox/DEPS', 'tools/memory_watcher/DEPS', - 'third_party/lss/DEPS', + 'third_party/lss/linux_syscall_support.h', ]) self.assertEqual(expected, files_to_check);