Add Kotlin format check to presubmit

Also format all Kotlin files in tests from running:

  find src/test/ -name '*.kt' | \
    xargs /usr/local/google/home/sgjesse/prj/r8/r8/third_party/openjdk/jdk-11/linux/bin/java \
    -jar \
    third_party/google/google-kotlin-format/0.54/ktfmt-0.54-jar-with-dependencies.jar \
    --google-style

Change-Id: I414e6fb1e4736552708ac3fc87042bddaabb2dfd
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index 986d67c..31c491e 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -14,6 +14,20 @@
 sys.path.append(os.path.join(
     path.dirname(inspect.getfile(lambda: None)), 'tools'))
 from tools.utils import EnsureDepFromGoogleCloudStorage
+from tools.jdk import GetJavaExecutable
+
+
+KOTLIN_FMT_JAR = path.join(
+  'third_party',
+  'google',
+  'google-kotlin-format',
+  '0.54',
+  'ktfmt-0.54-jar-with-dependencies.jar')
+
+KOTLIN_FMT_SHA1 = path.join(
+    'third_party', 'google', 'google-kotlin-format', '0.54.tar.gz.sha1')
+KOTLIN_FMT_TGZ = path.join(
+    'third_party', 'google', 'google-kotlin-format', '0.54.tar.gz.sha1')
 
 FMT_CMD = path.join(
     'third_party',
@@ -38,22 +52,45 @@
   return []
 
 def CheckFormatting(input_api, output_api, branch):
-  EnsureDepFromGoogleCloudStorage(FMT_CMD, FMT_TGZ, FMT_SHA1, 'google-format')
+  EnsureDepFromGoogleCloudStorage(
+    KOTLIN_FMT_JAR, KOTLIN_FMT_TGZ, KOTLIN_FMT_SHA1, 'google-kotlin-format')
+  EnsureDepFromGoogleCloudStorage(
+    FMT_CMD, FMT_TGZ, FMT_SHA1, 'google-java-format')
   results = []
   for f in input_api.AffectedFiles():
     path = f.LocalPath()
-    if not path.endswith('.java'):
+    if not path.endswith('.java') and not path.endswith('.kt'):
       continue
-    diff = check_output(
-        ['git', 'diff', '--no-prefix', '-U0', branch, '--', path])
+    if path.endswith('.kt'):
+      result = check_output(
+        [GetJavaExecutable(), '-jar', KOTLIN_FMT_JAR, '--google-style', '-n', path])
+      if len(result) > 0:
+        results.append(output_api.PresubmitError(
+          """Please fix the Kotlin formatting by running:
 
-    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 $(git cl upstream) --name-only "*.kt" | xargs {java} -jar {fmt_jar} --google-style
+
+or fix formatting, commit and upload:
+
+  git diff $(git cl upstream) --name-only "*.kt" | xargs {java} -jar {fmt_jar} --google-style && git commit -a --amend --no-edit && git cl upload
+
+or bypass the checks with:
+
+  git cl upload --bypass-hooks
+        """.format(java=GetJavaExecutable(), fmt_jar=KOTLIN_FMT_JAR)))
+        return results
+    else:
+      # Now path.endeWith('.java') is true.
+      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 Java formatting by running:
 
   git diff -U0 $(git cl upstream) | %s -p1 -i