1 # Copyright 2013 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 """Script that is used by PRESUBMIT.py to run style checks on Java files."""
12 CHROMIUM_SRC
= os
.path
.normpath(
13 os
.path
.join(os
.path
.dirname(__file__
),
14 os
.pardir
, os
.pardir
, os
.pardir
))
15 CHECKSTYLE_ROOT
= os
.path
.join(CHROMIUM_SRC
, 'third_party', 'checkstyle',
16 'checkstyle-6.1-all.jar')
19 def RunCheckstyle(input_api
, output_api
, style_file
):
20 if not os
.path
.exists(style_file
):
21 file_error
= (' Java checkstyle configuration file is missing: '
23 return [output_api
.PresubmitError(file_error
)]
25 # Filter out non-Java files and files that were deleted.
26 java_files
= [x
.LocalPath() for x
in input_api
.AffectedFiles(False, False)
27 if os
.path
.splitext(x
.LocalPath())[1] == '.java']
32 checkstyle_env
= os
.environ
.copy()
33 checkstyle_env
['JAVA_CMD'] = 'java'
35 check
= subprocess
.Popen(['java', '-cp',
37 'com.puppycrawl.tools.checkstyle.Main', '-c',
38 style_file
, '-f', 'xml'] + java_files
,
39 stdout
=subprocess
.PIPE
, env
=checkstyle_env
)
40 stdout
, _
= check
.communicate()
43 if e
.errno
== errno
.ENOENT
:
44 install_error
= (' checkstyle is not installed. Please run '
45 'build/install-build-deps-android.sh')
46 return [output_api
.PresubmitPromptWarning(install_error
)]
51 local_path
= input_api
.PresubmitLocalPath()
52 root
= xml
.dom
.minidom
.parseString(stdout
)
53 for fileElement
in root
.getElementsByTagName('file'):
54 fileName
= fileElement
.attributes
['name'].value
55 fileName
= os
.path
.relpath(fileName
, local_path
)
56 errors
= fileElement
.getElementsByTagName('error')
58 line
= error
.attributes
['line'].value
60 if error
.hasAttribute('column'):
61 column
= '%s:' % (error
.attributes
['column'].value
)
62 message
= error
.attributes
['message'].value
63 result
= ' %s:%s:%s %s' % (fileName
, line
, column
, message
)
65 severity
= error
.attributes
['severity'].value
66 if severity
== 'error':
67 result_errors
.append(result
)
68 elif severity
== 'warning':
69 result_warnings
.append(result
)
73 result
.append(output_api
.PresubmitPromptWarning('\n'.join(result_warnings
)))
75 result
.append(output_api
.PresubmitError('\n'.join(result_errors
)))