1 # Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
5 """Top-level presubmit script for Chromium.
7 See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts
8 for more details about the presubmit API built into gcl.
13 r
"^net/tools/spdyshark/[\\\/].*",
20 def _CheckNoInterfacesInBase(input_api
, output_api
):
21 """Checks to make sure no files in libbase.a have |@interface|."""
22 pattern
= input_api
.re
.compile(r
'^\s*@interface', input_api
.re
.MULTILINE
)
24 for f
in input_api
.AffectedSourceFiles(input_api
.FilterSourceFile
):
25 if (f
.LocalPath().find('base/') != -1 and
26 f
.LocalPath().find('base/test/') == -1 and
27 not f
.LocalPath().endswith('_unittest.mm')):
28 contents
= input_api
.ReadFile(f
)
29 if pattern
.search(contents
):
33 return [ output_api
.PresubmitError(
34 'Objective-C interfaces or categories are forbidden in libbase. ' +
35 'See http://groups.google.com/a/chromium.org/group/chromium-dev/' +
36 'browse_thread/thread/efb28c10435987fd',
41 def _CommonChecks(input_api
, output_api
):
42 """Checks common to both upload and commit."""
44 results
.extend(input_api
.canned_checks
.PanProjectChecks(
45 input_api
, output_api
, excluded_paths
=_EXCLUDED_PATHS
))
46 results
.extend(_CheckNoInterfacesInBase(input_api
, output_api
))
47 results
.extend(_CheckAuthorizedAuthor(input_api
, output_api
))
51 def _CheckSubversionConfig(input_api
, output_api
):
52 """Verifies the subversion config file is correctly setup.
54 Checks that autoprops are enabled, returns an error otherwise.
56 join
= input_api
.os_path
.join
57 if input_api
.platform
== 'win32':
58 appdata
= input_api
.environ
.get('APPDATA', '')
60 return [output_api
.PresubmitError('%APPDATA% is not configured.')]
61 path
= join(appdata
, 'Subversion', 'config')
63 home
= input_api
.environ
.get('HOME', '')
65 return [output_api
.PresubmitError('$HOME is not configured.')]
66 path
= join(home
, '.subversion', 'config')
69 'Please look at http://dev.chromium.org/developers/coding-style to\n'
70 'configure your subversion configuration file. This enables automatic\n'
71 'properties to simplify the project maintenance.\n'
72 'Pro-tip: just download and install\n'
73 'http://src.chromium.org/viewvc/chrome/trunk/tools/build/slave/config\n')
76 lines
= open(path
, 'r').read().splitlines()
77 # Make sure auto-props is enabled and check for 2 Chromium standard
79 if (not '*.cc = svn:eol-style=LF' in lines
or
80 not '*.pdf = svn:mime-type=application/pdf' in lines
or
81 not 'enable-auto-props = yes' in lines
):
83 output_api
.PresubmitNotifyResult(
84 'It looks like you have not configured your subversion config '
85 'file or it is not up-to-date.\n' + error_msg
)
87 except (OSError, IOError):
89 output_api
.PresubmitNotifyResult(
90 'Can\'t find your subversion config file.\n' + error_msg
)
95 def _CheckAuthorizedAuthor(input_api
, output_api
):
96 """For non-googler/chromites committers, verify the author's email address is
99 # TODO(maruel): Add it to input_api?
102 author
= input_api
.change
.author_email
104 input_api
.logging
.info('No author, skipping AUTHOR check')
106 authors_path
= input_api
.os_path
.join(
107 input_api
.PresubmitLocalPath(), 'AUTHORS')
109 input_api
.re
.match(r
'[^#]+\s+\<(.+?)\>\s*$', line
)
110 for line
in open(authors_path
))
111 valid_authors
= [item
.group(1).lower() for item
in valid_authors
if item
]
112 if input_api
.verbose
:
113 print 'Valid authors are %s' % ', '.join(valid_authors
)
114 if not any(fnmatch
.fnmatch(author
.lower(), valid
) for valid
in valid_authors
):
115 return [output_api
.PresubmitPromptWarning(
116 ('%s is not in AUTHORS file. If you are a new contributor, please visit'
118 'http://www.chromium.org/developers/contributing-code and read the '
120 'If you are a chromite, verify the contributor signed the CLA.') %
125 def CheckChangeOnUpload(input_api
, output_api
):
127 results
.extend(_CommonChecks(input_api
, output_api
))
131 def CheckChangeOnCommit(input_api
, output_api
):
133 results
.extend(_CommonChecks(input_api
, output_api
))
134 # TODO(thestig) temporarily disabled, doesn't work in third_party/
135 #results.extend(input_api.canned_checks.CheckSvnModifiedDirectories(
136 # input_api, output_api, sources))
137 # Make sure the tree is 'open'.
138 results
.extend(input_api
.canned_checks
.CheckTreeIsOpen(
141 json_url
='http://chromium-status.appspot.com/current?format=json'))
142 results
.extend(input_api
.canned_checks
.CheckRietveldTryJobExecution(input_api
,
143 output_api
, 'http://codereview.chromium.org', ('win', 'linux', 'mac'),
144 'tryserver@chromium.org'))
146 results
.extend(input_api
.canned_checks
.CheckChangeHasBugField(
147 input_api
, output_api
))
148 results
.extend(input_api
.canned_checks
.CheckChangeHasTestField(
149 input_api
, output_api
))
150 results
.extend(_CheckSubversionConfig(input_api
, output_api
))
154 def GetPreferredTrySlaves():
155 return ['win', 'linux', 'mac']