Merge branch 'stable-2.14'

* stable-2.14:
  PluginLoader: Remove stale plugin files from /tmp on startup
  Format Java files with google-java-format
  Update blame-cache to 0.2-1
  Set version to 2.13.8
  Upgrade JGit to 4.5.2.201704071617-r

Change-Id: Ia27737010984ba58ff74c844aa252d9b7adffbad
diff --git a/WORKSPACE b/WORKSPACE
index 64a06ae..97fb1fb 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -556,10 +556,10 @@
 
 maven_jar(
     name = "blame_cache",
-    artifact = "com/google/gitiles:blame-cache:0.2",
+    artifact = "com/google/gitiles:blame-cache:0.2-1",
     attach_source = False,
     repository = GERRIT,
-    sha1 = "519fc548df920123bce986056d2f644663665ae4",
+    sha1 = "da7977e8b140b63f18054214c1d1b86ffa6896cb",
 )
 
 # Keep this version of Soy synchronized with the version used in Gitiles.
diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/ServerInfo.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/ServerInfo.java
index 0a37307..dcd1cf1 100644
--- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/ServerInfo.java
+++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/ServerInfo.java
@@ -70,7 +70,8 @@
 
     public final native String replyTooltip() /*-{ return this.reply_tooltip; }-*/;
 
-    public final native boolean showAssigneeInChangesTable() /*-{ return this.show_assignee_in_changes_table || false; }-*/;
+    public final native boolean
+        showAssigneeInChangesTable() /*-{ return this.show_assignee_in_changes_table || false; }-*/;
 
     public final native int updateDelay() /*-{ return this.update_delay || 0; }-*/;
 
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GetServerInfo.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GetServerInfo.java
index 925cf64..5c09055 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GetServerInfo.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/GetServerInfo.java
@@ -207,7 +207,8 @@
     boolean hasAssigneeInIndex =
         indexes.getSearchIndex().getSchema().hasField(ChangeField.ASSIGNEE);
     info.showAssigneeInChangesTable =
-        toBoolean(cfg.getBoolean("change", "showAssigneeInChangesTable", false) && hasAssigneeInIndex);
+        toBoolean(
+            cfg.getBoolean("change", "showAssigneeInChangesTable", false) && hasAssigneeInIndex);
     info.largeChange = cfg.getInt("change", "largeChange", 500);
     info.replyTooltip =
         Optional.ofNullable(cfg.getString("change", null, "replyTooltip")).orElse("Reply and score")
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginLoader.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginLoader.java
index d790fe9..e0afc08 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginLoader.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginLoader.java
@@ -79,6 +79,7 @@
 
   private final Path pluginsDir;
   private final Path dataDir;
+  private final Path tempDir;
   private final PluginGuiceEnvironment env;
   private final ServerInformationImpl srvInfoImpl;
   private final PluginUser.Factory pluginUserFactory;
@@ -107,6 +108,7 @@
       UniversalServerPluginProvider pluginFactory) {
     pluginsDir = sitePaths.plugins_dir;
     dataDir = sitePaths.data_dir;
+    tempDir = sitePaths.tmp_dir;
     env = pe;
     srvInfoImpl = sii;
     pluginUserFactory = puf;
@@ -325,8 +327,34 @@
     }
   }
 
+  private void removeStalePluginFiles() {
+    DirectoryStream.Filter<Path> filter =
+        new DirectoryStream.Filter<Path>() {
+          @Override
+          public boolean accept(Path entry) throws IOException {
+            return entry.getFileName().toString().startsWith("plugin_");
+          }
+        };
+    try (DirectoryStream<Path> files = Files.newDirectoryStream(tempDir, filter)) {
+      for (Path file : files) {
+        log.info("Removing stale plugin file: " + file.toFile().getName());
+        try {
+          Files.delete(file);
+        } catch (IOException e) {
+          log.error(
+              String.format(
+                  "Failed to remove stale plugin file %s: %s",
+                  file.toFile().getName(), e.getMessage()));
+        }
+      }
+    } catch (IOException e) {
+      log.warn("Unable to discover stale plugin files: " + e.getMessage());
+    }
+  }
+
   @Override
   public synchronized void start() {
+    removeStalePluginFiles();
     log.info("Loading plugins from " + pluginsDir.toAbsolutePath());
     srvInfoImpl.state = ServerInformation.State.STARTUP;
     rescan();