diff options
author | Jordan Demeulenaere <jdemeulenaere@google.com> | 2022-08-12 11:40:31 +0200 |
---|---|---|
committer | Jordan Demeulenaere <jdemeulenaere@google.com> | 2022-08-12 11:57:14 +0200 |
commit | 9839dc339f059bdeb33e1fb2ef2ea31350b12895 (patch) | |
tree | 35c29ce8718854f9631fc94ce57ad05d1233a674 /ktfmt.py | |
parent | 4b33ade636a65c3d7b4b4b52ae27b1260b91e998 (diff) | |
download | ktfmt-9839dc339f059bdeb33e1fb2ef2ea31350b12895.tar.gz |
Add a ktfmt.py wrapper around ktfmt.jar
This CL adds a wrapper script around ktfmt.jar to easily format or check
some Kotlin files folders, optionally filtering only the files in an
include list. This will be used by a preupload hook to check the Kotlin
files modified in a commit.
Bug: 235461679
Test: Manual
Change-Id: I8a1d3eb7e00c7f7fa95a57d6df98bbe09c065c29
Diffstat (limited to 'ktfmt.py')
-rwxr-xr-x | ktfmt.py | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/ktfmt.py b/ktfmt.py new file mode 100755 index 0000000..9cfbd13 --- /dev/null +++ b/ktfmt.py @@ -0,0 +1,135 @@ +#!/usr/bin/env python3 + +# +# Copyright 2022, The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +"""Script to format or check Kotlin files.""" + +import argparse +import os +import subprocess +import sys + + +def main(): + parser = argparse.ArgumentParser( + 'Format Kotlin files or check that they are correctly formatted.') + parser.add_argument( + '--check', + '-c', + action='store_true', + default=False, + help='Perform a format check instead of formatting.') + parser.add_argument( + '--includes_file', + '-i', + default='', + help='The file containing the Kotlin files and directories that should be formatted/checked.' + ) + parser.add_argument( + 'files', + nargs='*', + help='The files to format or check. If --include_file is specified, only the files at their intersection will be formatted/checked.' + ) + args = parser.parse_args() + + ktfmt_args = ['--kotlinlang-style'] + + check = args.check + if check: + ktfmt_args += ['--set-exit-if-changed', '--dry-run'] + + kt_files = [] + for file in args.files: + if os.path.isdir(file): + for root, dirs, files in os.walk(file): + for f in files: + if is_kotlin_file(f): + kt_files += [os.path.join(root, f)] + + if is_kotlin_file(file): + kt_files += [file] + + # Only format/check files from the includes list. + includes_file = args.includes_file + if kt_files and includes_file: + f = open(includes_file, 'r') + + lines = f.read().splitlines() + included_files = set() + included_dirs = [] + for line in lines: + if is_kotlin_file(line): + included_files.add(line) + else: + included_dirs += [line] + + kt_files = [ + kt_file for kt_file in kt_files + if kt_file in included_files or is_included(kt_file, included_dirs) + ] + + # No need to start ktfmt if there are no files to check/format. + if not kt_files: + sys.exit(0) + + ktfmt_args += kt_files + + dir = os.path.normpath(os.path.dirname(__file__)) + ktfmt_jar = os.path.join( + dir, '../../prebuilts/build-tools/common/framework/ktfmt.jar') + + ktlint_env = os.environ.copy() + ktlint_env['JAVA_CMD'] = 'java' + try: + process = subprocess.Popen( + ['java', '-jar', ktfmt_jar] + ktfmt_args, + stdout=subprocess.PIPE, + env=ktlint_env) + stdout, _ = process.communicate() + code = process.returncode + if check and code != 0: + print( + '**********************************************************************' + ) + print( + 'Some Kotlin files are not properly formatted. Run the following command to format them:\n\n' + ) + script_path = os.path.normpath(__file__) + incorrect_files = stdout.decode('utf-8').splitlines() + print('$ ' + script_path + ' ' + ' '.join(incorrect_files) + '\n') + print( + '**********************************************************************' + ) + sys.exit(code) + else: + sys.exit(0) + except OSError as e: + print('Error running ktfmt') + sys.exit(1) + + +def is_kotlin_file(name): + return name.endswith('.kt') or name.endswith('.kts') + + +def is_included(file, dirs): + for dir in dirs: + if file.startswith(dir): + return True + + +if __name__ == '__main__': + main() |