• Home
  • 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
15import subprocess
16from os.path import relpath
17
18
19def CheckChange(input, output):
20    results = []
21    results += CheckTslint(input, output)
22    return results
23
24
25def CheckChangeOnUpload(input_api, output_api):
26    return CheckChange(input_api, output_api)
27
28
29def CheckChangeOnCommit(input_api, output_api):
30    return CheckChange(input_api, output_api)
31
32
33def 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("""\
55There 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