-
Notifications
You must be signed in to change notification settings - Fork 2
/
PRESUBMIT.py
144 lines (124 loc) · 4.97 KB
/
PRESUBMIT.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.
from os import path
import datetime
from subprocess import check_output, Popen, PIPE, STDOUT
import inspect
import os
import sys
# Add both current path to allow us to package import utils and the tools
# dir to allow transitive (for utils) dependendies to be loaded.
sys.path.append(path.dirname(inspect.getfile(lambda: None)))
sys.path.append(os.path.join(
path.dirname(inspect.getfile(lambda: None)), 'tools'))
from tools.utils import EnsureDepFromGoogleCloudStorage
FMT_CMD = path.join(
'third_party',
'google',
'google-java-format',
'1.14.0',
'google-java-format-1.14.0',
'scripts',
'google-java-format-diff.py')
FMT_CMD_JDK17 = path.join('tools','google-java-format-diff.py')
FMT_SHA1 = path.join(
'third_party', 'google', 'google-java-format', '1.14.0.tar.gz.sha1')
FMT_TGZ = path.join(
'third_party', 'google', 'google-java-format', '1.14.0.tar.gz')
def CheckDoNotMerge(input_api, output_api):
for l in input_api.change.FullDescriptionText().splitlines():
if l.lower().startswith('do not merge'):
msg = 'Your cl contains: \'Do not merge\' - this will break WIP bots'
return [output_api.PresubmitPromptWarning(msg, [])]
return []
def CheckFormatting(input_api, output_api, branch):
EnsureDepFromGoogleCloudStorage(FMT_CMD, FMT_TGZ, FMT_SHA1, 'google-format')
results = []
for f in input_api.AffectedFiles():
path = f.LocalPath()
if not path.endswith('.java'):
continue
diff = check_output(
['git', 'diff', '--no-prefix', '-U0', branch, '--', path])
proc = Popen(FMT_CMD, stdin=PIPE, stdout=PIPE, stderr=STDOUT)
(stdout, stderr) = proc.communicate(input=diff)
if len(stdout) > 0:
results.append(output_api.PresubmitError(stdout.decode('utf-8')))
if len(results) > 0:
results.append(output_api.PresubmitError(
"""Please fix the formatting by running:
git diff -U0 $(git cl upstream) | %s -p1 -i
or fix formatting, commit and upload:
git diff -U0 $(git cl upstream) | %s -p1 -i && git commit -a --amend --no-edit && git cl upload
or bypass the checks with:
git cl upload --bypass-hooks
If formatting fails with 'No enum constant javax.lang.model.element.Modifier.SEALED' try
git diff -U0 $(git cl upstream) | %s %s %s -p1 -i && git commit -a --amend --no-edit && git cl upload
""" % (
FMT_CMD,
FMT_CMD,
FMT_CMD_JDK17,
'--google-java-format-jar',
'third_party/google/google-java-format/1.14.0/google-java-format-1.14.0-all-deps.jar'
)))
return results
def CheckDeterministicDebuggingChanged(input_api, output_api, branch):
for f in input_api.AffectedFiles():
path = f.LocalPath()
if not path.endswith('InternalOptions.java'):
continue
diff = check_output(
['git', 'diff', '--no-prefix', '-U0', branch, '--', path]).decode('utf-8')
if 'DETERMINISTIC_DEBUGGING' in diff:
return [output_api.PresubmitError(diff)]
return []
def CheckForAddedDisassemble(input_api, output_api):
results = []
for (file, line_nr, line) in input_api.RightHandSideLines():
if file.LocalPath().endswith('.java') and '.disassemble()' in line:
results.append(
output_api.PresubmitError(
'Test call to disassemble\n%s:%s %s' % (file.LocalPath(), line_nr, line)))
return results
def CheckForCopyRight(input_api, output_api, branch):
results = []
for f in input_api.AffectedSourceFiles(None):
# Check if it is a new file.
if f.OldContents():
continue
contents = f.NewContents()
if (not contents) or (len(contents) == 0):
continue
if not CopyRightInContents(f, contents):
results.append(
output_api.PresubmitError('Could not find correctly formatted '
'copyright in file: %s' % f))
return results
def CopyRightInContents(f, contents):
expected = '//'
if f.LocalPath().endswith('.py') or f.LocalPath().endswith('.sh'):
expected = '#'
expected = expected + ' Copyright (c) ' + str(datetime.datetime.now().year)
for content_line in contents:
if expected in content_line:
return True
return False
def CheckChange(input_api, output_api):
branch = (
check_output(['git', 'cl', 'upstream'])
.decode('utf-8')
.strip()
.replace('refs/heads/', ''))
results = []
results.extend(CheckDoNotMerge(input_api, output_api))
results.extend(CheckFormatting(input_api, output_api, branch))
results.extend(
CheckDeterministicDebuggingChanged(input_api, output_api, branch))
results.extend(CheckForAddedDisassemble(input_api, output_api))
results.extend(CheckForCopyRight(input_api, output_api, branch))
return results
def CheckChangeOnCommit(input_api, output_api):
return CheckChange(input_api, output_api)
def CheckChangeOnUpload(input_api, output_api):
return CheckChange(input_api, output_api)