• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 # Copyright (C) 2018 The Android Open Source Project
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 #      http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14 
15 import subprocess
16 from os.path import relpath
17 
18 
19 def CheckChange(input, output):
20     results = []
21     results += CheckTslint(input, output)
22     return results
23 
24 
25 def CheckChangeOnUpload(input_api, output_api):
26     return CheckChange(input_api, output_api)
27 
28 
29 def CheckChangeOnCommit(input_api, output_api):
30     return CheckChange(input_api, output_api)
31 
32 
33 def CheckTslint(input_api, output_api):
34     path = input_api.os_path
35     ui_path = input_api.PresubmitLocalPath();
36     node = path.join(ui_path, 'node')
37     tslint = path.join(ui_path, 'node_modules', '.bin', 'tslint')
38 
39     if not path.exists(tslint):
40         repo_root = input_api.change.RepositoryRoot()
41         install_path = path.join(repo_root, 'tools', 'install-build-deps')
42         return [
43             output_api.PresubmitError("Tslint not found. Please first run\n" +
44                 "$ {0} --ui".format(install_path))
45         ]
46 
47     # Some tslint rules require type information and thus need the whole
48     # project. We therefore call tslint on the whole project instead of only the
49     # changed files. It is possible to break tslint on files that was not
50     # changed by changing the type of an object.
51     if subprocess.call([node, tslint, '--project', ui_path,
52                         '--format', 'codeFrame']):
53         return [
54             output_api.PresubmitError("""\
55 There were tslint errors. You may be able to fix some of them using
56 $ {} {} --project {} --fix""".format(relpath(node), relpath(tslint), ui_path))
57         ]
58     return []
59