OLD | NEW |
1 # Copyright (C) 2014 Google Inc. All rights reserved. | 1 # Copyright (C) 2014 Google Inc. All rights reserved. |
2 # | 2 # |
3 # Redistribution and use in source and binary forms, with or without | 3 # Redistribution and use in source and binary forms, with or without |
4 # modification, are permitted provided that the following conditions are | 4 # modification, are permitted provided that the following conditions are |
5 # met: | 5 # met: |
6 # | 6 # |
7 # * Redistributions of source code must retain the above copyright | 7 # * Redistributions of source code must retain the above copyright |
8 # notice, this list of conditions and the following disclaimer. | 8 # notice, this list of conditions and the following disclaimer. |
9 # * Redistributions in binary form must reproduce the above | 9 # * Redistributions in binary form must reproduce the above |
10 # copyright notice, this list of conditions and the following disclaimer | 10 # copyright notice, this list of conditions and the following disclaimer |
(...skipping 13 matching lines...) Expand all Loading... |
24 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 24 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
25 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 25 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
26 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 26 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
27 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 27 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
28 """DevTools JSDoc validator presubmit script | 28 """DevTools JSDoc validator presubmit script |
29 | 29 |
30 See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts | 30 See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts |
31 for more details about the presubmit API built into gcl. | 31 for more details about the presubmit API built into gcl. |
32 """ | 32 """ |
33 | 33 |
34 from collections import namedtuple | |
35 import sys | 34 import sys |
36 | 35 |
37 CheckOutput = namedtuple('CheckOutput', ['results', 'has_errors']) | |
38 | |
39 | 36 |
40 def _CheckNodeAndNPMModules(input_api, output_api): | 37 def _CheckNodeAndNPMModules(input_api, output_api): |
41 node_script_path = input_api.os_path.join(input_api.PresubmitLocalPath(), "s
cripts", "install_node_deps.py") | 38 node_script_path = input_api.os_path.join(input_api.PresubmitLocalPath(), "s
cripts", "install_node_deps.py") |
42 process = input_api.subprocess.Popen( | 39 process = input_api.subprocess.Popen( |
43 [input_api.python_executable, node_script_path], stdout=input_api.subpro
cess.PIPE, stderr=input_api.subprocess.STDOUT) | 40 [input_api.python_executable, node_script_path], stdout=input_api.subpro
cess.PIPE, stderr=input_api.subprocess.STDOUT) |
44 out, _ = process.communicate() | 41 out, _ = process.communicate() |
45 if process.returncode != 0: | 42 if process.returncode != 0: |
46 return CheckOutput([output_api.PresubmitError(out)], has_errors=True) | 43 return [output_api.PresubmitError(out)] |
47 return CheckOutput([output_api.PresubmitNotifyResult(out)], has_errors=False
) | 44 return [output_api.PresubmitNotifyResult(out)] |
48 | 45 |
49 | 46 |
50 def _FormatDevtools(input_api, output_api): | 47 def _CheckFormat(input_api, output_api): |
| 48 |
| 49 def popen(args): |
| 50 return input_api.subprocess.Popen(args=args, stdout=input_api.subprocess
.PIPE, stderr=input_api.subprocess.STDOUT) |
| 51 |
51 affected_files = _getAffectedJSFiles(input_api) | 52 affected_files = _getAffectedJSFiles(input_api) |
52 if len(affected_files) == 0: | 53 if len(affected_files) == 0: |
53 return CheckOutput([], has_errors=False) | 54 return [] |
54 original_sys_path = sys.path | 55 original_sys_path = sys.path |
55 try: | 56 try: |
56 sys.path = sys.path + [input_api.os_path.join(input_api.PresubmitLocalPa
th(), "scripts")] | 57 sys.path = sys.path + [input_api.os_path.join(input_api.PresubmitLocalPa
th(), "scripts")] |
57 import install_node_deps | 58 import install_node_deps |
58 finally: | 59 finally: |
59 sys.path = original_sys_path | 60 sys.path = original_sys_path |
60 | 61 |
61 node_path, _ = install_node_deps.resolve_node_paths() | 62 node_path, _ = install_node_deps.resolve_node_paths() |
62 format_path = input_api.os_path.join(input_api.PresubmitLocalPath(), "script
s", "format.js") | |
63 glob_arg = "--glob=" + ",".join(affected_files) | |
64 check_formatting_process = _inputPopen(input_api, args=[node_path, format_pa
th] + [glob_arg, "--output-replacements-xml"]) | |
65 check_formatting_out, _ = check_formatting_process.communicate() | |
66 if check_formatting_process.returncode != 0: | |
67 return CheckOutput([output_api.PresubmitError(check_formatting_out)], ha
s_errors=True) | |
68 if "</replacement>" not in check_formatting_out: | |
69 return CheckOutput([output_api.PresubmitNotifyResult("CL is properly for
matted")], has_errors=False) | |
70 | 63 |
71 format_args = [node_path, format_path] + [glob_arg] | 64 check_formatting_process = popen(['git', 'cl', 'format', '--js', '--dry-run'
, input_api.PresubmitLocalPath()]) |
72 format_process = _inputPopen(input_api, format_args) | 65 check_formatting_process.communicate() |
73 format_process_out, _ = format_process.communicate() | 66 if check_formatting_process.returncode == 0: |
| 67 return [] |
| 68 |
| 69 format_args = ['git', 'cl', 'format', '--js', input_api.PresubmitLocalPath()
] |
| 70 format_process = popen(format_args) |
| 71 format_out, _ = format_process.communicate() |
| 72 if format_process.returncode != 0: |
| 73 return [output_api.PresubmitError(format_out)] |
74 | 74 |
75 # Use eslint to autofix the braces | 75 # Use eslint to autofix the braces |
76 eslint_path = input_api.os_path.join(input_api.PresubmitLocalPath(), "node_m
odules", ".bin", "eslint") | 76 eslint_path = input_api.os_path.join(input_api.PresubmitLocalPath(), "node_m
odules", ".bin", "eslint") |
77 eslint_process = _inputPopen( | 77 eslint_process = popen([ |
78 input_api, | 78 node_path, eslint_path, '--no-eslintrc', '--fix', '--env=es6', '--rule={
"curly": [2, "multi-or-nest", "consistent"]}' |
79 [node_path, eslint_path, '--no-eslintrc', '--fix', '--env=es6', '--rule=
{"curly": [2, "multi-or-nest", "consistent"]}'] + | 79 ] + affected_files) |
80 affected_files) | |
81 eslint_process.communicate() | 80 eslint_process.communicate() |
82 | 81 |
83 # Need to run clang-format again to align the braces | 82 # Need to run clang-format again to align the braces |
84 reformat_process = _inputPopen(input_api, format_args) | 83 popen(format_args).communicate() |
85 reformat_process.communicate() | |
86 | 84 |
87 return CheckOutput( | 85 return [ |
88 [ | 86 output_api.PresubmitError("ERROR: Found formatting violations in third_p
arty/WebKit/Source/devtools.\n" |
89 output_api.PresubmitError("ERROR: Found formatting violations.\n" | 87 "Ran clang-format on diff\n" |
90 "Ran clang-format on files changed in CL\n
" | 88 "Use git status to check the formatting change
s"), |
91 "Use git status to check the formatting ch
anges"), | 89 output_api.PresubmitError(format_out), |
92 output_api.PresubmitError(format_process_out) | 90 ] |
93 ], | |
94 has_errors=True) | |
95 | 91 |
96 | 92 |
97 def _CheckDevtoolsStyle(input_api, output_api): | 93 def _CheckDevtoolsStyle(input_api, output_api): |
98 affected_front_end_files = _getAffectedFrontEndFiles(input_api) | 94 affected_front_end_files = _getAffectedFrontEndFiles(input_api) |
99 if len(affected_front_end_files) > 0: | 95 if len(affected_front_end_files) > 0: |
100 lint_path = input_api.os_path.join(input_api.PresubmitLocalPath(), "scri
pts", "lint_javascript.py") | 96 lint_path = input_api.os_path.join(input_api.PresubmitLocalPath(), "scri
pts", "lint_javascript.py") |
101 process = input_api.subprocess.Popen( | 97 process = input_api.subprocess.Popen( |
102 [input_api.python_executable, lint_path] + affected_front_end_files, | 98 [input_api.python_executable, lint_path] + affected_front_end_files, |
103 stdout=input_api.subprocess.PIPE, | 99 stdout=input_api.subprocess.PIPE, |
104 stderr=input_api.subprocess.STDOUT) | 100 stderr=input_api.subprocess.STDOUT) |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
181 for line_number, line in f.ChangedContents(): | 177 for line_number, line in f.ChangedContents(): |
182 if "/deep/" in line: | 178 if "/deep/" in line: |
183 results.append(output_api.PresubmitError(("%s:%d uses /deep/ sel
ector") % (f.LocalPath(), line_number))) | 179 results.append(output_api.PresubmitError(("%s:%d uses /deep/ sel
ector") % (f.LocalPath(), line_number))) |
184 if "::shadow" in line: | 180 if "::shadow" in line: |
185 results.append(output_api.PresubmitError(("%s:%d uses ::shadow s
elector") % (f.LocalPath(), line_number))) | 181 results.append(output_api.PresubmitError(("%s:%d uses ::shadow s
elector") % (f.LocalPath(), line_number))) |
186 return results | 182 return results |
187 | 183 |
188 | 184 |
189 def CheckChangeOnUpload(input_api, output_api): | 185 def CheckChangeOnUpload(input_api, output_api): |
190 results = [] | 186 results = [] |
191 | 187 results.extend(_CheckNodeAndNPMModules(input_api, output_api)) |
192 (node_results, has_errors) = _CheckNodeAndNPMModules(input_api, output_api) | 188 results.extend(_CheckFormat(input_api, output_api)) |
193 results.extend(node_results) | |
194 if has_errors: | |
195 results.append(output_api.PresubmitError("ERROR: Bailed out early becaus
e error using node.js/npm")) | |
196 return results | |
197 | |
198 (format_results, has_errors) = _FormatDevtools(input_api, output_api) | |
199 results.extend(format_results) | |
200 if has_errors: | |
201 results.append(output_api.PresubmitError("ERROR: Bailed out early becaus
e formatting errors were found")) | |
202 return results | |
203 | |
204 results.extend(_CheckDevtoolsStyle(input_api, output_api)) | 189 results.extend(_CheckDevtoolsStyle(input_api, output_api)) |
205 results.extend(_CompileDevtoolsFrontend(input_api, output_api)) | 190 results.extend(_CompileDevtoolsFrontend(input_api, output_api)) |
206 results.extend(_CheckConvertSVGToPNGHashes(input_api, output_api)) | 191 results.extend(_CheckConvertSVGToPNGHashes(input_api, output_api)) |
207 results.extend(_CheckOptimizePNGHashes(input_api, output_api)) | 192 results.extend(_CheckOptimizePNGHashes(input_api, output_api)) |
208 results.extend(_CheckCSSViolations(input_api, output_api)) | 193 results.extend(_CheckCSSViolations(input_api, output_api)) |
209 return results | 194 return results |
210 | 195 |
211 | 196 |
212 def CheckChangeOnCommit(input_api, output_api): | 197 def CheckChangeOnCommit(input_api, output_api): |
213 return [] | 198 return [] |
(...skipping 12 matching lines...) Expand all Loading... |
226 def _getAffectedJSFiles(input_api): | 211 def _getAffectedJSFiles(input_api): |
227 local_paths = [f.AbsoluteLocalPath() for f in input_api.AffectedFiles() if f
.Action() != "D"] | 212 local_paths = [f.AbsoluteLocalPath() for f in input_api.AffectedFiles() if f
.Action() != "D"] |
228 devtools_root = input_api.PresubmitLocalPath() | 213 devtools_root = input_api.PresubmitLocalPath() |
229 devtools_front_end = input_api.os_path.join(devtools_root, "front_end") | 214 devtools_front_end = input_api.os_path.join(devtools_root, "front_end") |
230 devtools_scripts = input_api.os_path.join(devtools_root, "scripts") | 215 devtools_scripts = input_api.os_path.join(devtools_root, "scripts") |
231 affected_js_files = [ | 216 affected_js_files = [ |
232 file_name for file_name in local_paths | 217 file_name for file_name in local_paths |
233 if (devtools_front_end in file_name or devtools_scripts in file_name) an
d file_name.endswith(".js") | 218 if (devtools_front_end in file_name or devtools_scripts in file_name) an
d file_name.endswith(".js") |
234 ] | 219 ] |
235 return [input_api.os_path.relpath(file_name, devtools_root) for file_name in
affected_js_files] | 220 return [input_api.os_path.relpath(file_name, devtools_root) for file_name in
affected_js_files] |
236 | |
237 | |
238 def _inputPopen(input_api, args): | |
239 return input_api.subprocess.Popen(args, stdout=input_api.subprocess.PIPE, st
derr=input_api.subprocess.STDOUT) | |
OLD | NEW |