aboutsummaryrefslogtreecommitdiff
path: root/ktfmt.py
diff options
context:
space:
mode:
authorJordan Demeulenaere <jdemeulenaere@google.com>2022-08-12 11:40:31 +0200
committerJordan Demeulenaere <jdemeulenaere@google.com>2022-08-12 11:57:14 +0200
commit9839dc339f059bdeb33e1fb2ef2ea31350b12895 (patch)
tree35c29ce8718854f9631fc94ce57ad05d1233a674 /ktfmt.py
parent4b33ade636a65c3d7b4b4b52ae27b1260b91e998 (diff)
downloadktfmt-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-xktfmt.py135
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()