Merge branch 'stable-2.14' into stable-2.15

* stable-2.14:
  Fix indentation
  Add Prolog skylark rule
  Set gerrit maven local api to version 2.14.7-SNAPSHOT
  Update API to 2.14.6
  Upgrade Gerrit API to 2.14.5.1

Change-Id: I731065b7bb97485fd929e340674af9ca92645548
diff --git a/gerrit_api.bzl b/gerrit_api.bzl
index 26358e7..cfe72c5 100644
--- a/gerrit_api.bzl
+++ b/gerrit_api.bzl
@@ -11,9 +11,9 @@
   bouncycastle_repos()
 
   maven_jar(
-   name = 'gerrit_plugin_api',
-   artifact = 'com.google.gerrit:gerrit-plugin-api:' + VER,
-   sha1 = 'a448355a7fdfbace0e6e4f449c9a37aaa3a889f9',
+    name = 'gerrit_plugin_api',
+    artifact = 'com.google.gerrit:gerrit-plugin-api:' + VER,
+    sha1 = 'a448355a7fdfbace0e6e4f449c9a37aaa3a889f9',
   )
   maven_jar(
     name = 'gerrit_plugin_gwtui',
diff --git a/lib/prolog/BUILD b/lib/prolog/BUILD
new file mode 100644
index 0000000..bbbc0de
--- /dev/null
+++ b/lib/prolog/BUILD
@@ -0,0 +1,17 @@
+java_binary(
+    name = "compiler_bin",
+    main_class = "PrologCompiler",
+    visibility = ["//visibility:public"],
+    runtime_deps = [":compiler_lib"],
+)
+
+java_library(
+    name = "compiler_lib",
+    srcs = ["java/PrologCompiler.java"],
+    visibility = ["//visibility:public"],
+    deps = [
+        "@prolog_compiler//jar",
+        "@prolog_runtime//jar",
+        "@prolog_io//jar",
+    ],
+)
diff --git a/lib/prolog/java/PrologCompiler.java b/lib/prolog/java/PrologCompiler.java
new file mode 100644
index 0000000..f1506c1
--- /dev/null
+++ b/lib/prolog/java/PrologCompiler.java
@@ -0,0 +1,86 @@
+// Copyright (C) 2017 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.
+
+import com.googlecode.prolog_cafe.compiler.Compiler;
+import com.googlecode.prolog_cafe.exceptions.CompileException;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.util.jar.JarEntry;
+import java.util.jar.JarOutputStream;
+
+public class PrologCompiler {
+  private static File tmpdir;
+
+  public static void main(String[] argv) throws IOException, CompileException {
+    int i = 0;
+    tmpdir = new File(argv[i++]);
+    File out = new File(argv[i++]);
+    File java = tmpdir("java");
+    for (; i < argv.length; i++) {
+      new Compiler().prologToJavaSource(argv[i], java.getPath());
+    }
+    jar(out, java);
+  }
+
+  private static File tmpdir(String name) throws IOException {
+    File d = File.createTempFile(name + "_", "", tmpdir);
+    if (!d.delete() || !d.mkdir()) {
+      throw new IOException("Cannot mkdir " + d);
+    }
+    return d;
+  }
+
+  private static void jar(File jar, File classes) throws IOException {
+    File tmp = File.createTempFile("prolog", ".jar", tmpdir);
+    try {
+      try (JarOutputStream out = new JarOutputStream(Files.newOutputStream(tmp.toPath()))) {
+        add(out, classes, "");
+      }
+      if (!tmp.renameTo(jar)) {
+        throw new IOException("Cannot create " + jar);
+      }
+    } finally {
+      tmp.delete();
+    }
+  }
+
+  private static void add(JarOutputStream out, File classes, String prefix) throws IOException {
+    String[] list = classes.list();
+    if (list == null) {
+      return;
+    }
+    for (String name : list) {
+      File f = new File(classes, name);
+      if (f.isDirectory()) {
+        add(out, f, prefix + name + "/");
+        continue;
+      }
+
+      JarEntry e = new JarEntry(prefix + name);
+      try (InputStream in = Files.newInputStream(f.toPath())) {
+        e.setTime(f.lastModified());
+        out.putNextEntry(e);
+        byte[] buf = new byte[16 << 10];
+        int n;
+        while (0 < (n = in.read(buf))) {
+          out.write(buf, 0, n);
+        }
+      } finally {
+        out.closeEntry();
+      }
+    }
+  }
+}
diff --git a/lib/prolog/prolog.bzl b/lib/prolog/prolog.bzl
new file mode 100644
index 0000000..dad82b4
--- /dev/null
+++ b/lib/prolog/prolog.bzl
@@ -0,0 +1,34 @@
+# Copyright (C) 2017 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.
+
+def prolog_cafe_library(
+    name,
+    srcs,
+    deps = [],
+    **kwargs):
+  native.genrule(
+    name = name + '__pl2j',
+    cmd = '$(location @com_googlesource_gerrit_bazlets//lib/prolog:compiler_bin) ' +
+      '$$(dirname $@) $@ ' +
+      '$(SRCS)',
+    srcs = srcs,
+    tools = ['@com_googlesource_gerrit_bazlets//lib/prolog:compiler_bin'],
+    outs = [ name + '.srcjar' ],
+  )
+  native.java_library(
+    name = name,
+    srcs = [':' + name + '__pl2j'],
+    deps = ['@prolog_runtime//jar:neverlink'] + deps,
+    **kwargs
+  )