Add Git#shutdown for releasing resources held by JGit process

The shutdown method releases
- ThreadLocal held by NLS
- GlobalBundleCache used by NLS
- Executor held by WorkQueue

Bug: 437855
Bug: 550529
Change-Id: Icfdccd63668ca90c730ee47a52a17dbd58695ada
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/Git.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/Git.java
index 01306f4..6431477 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/Git.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/Git.java
@@ -18,6 +18,8 @@
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.lib.RepositoryBuilder;
 import org.eclipse.jgit.lib.RepositoryCache;
+import org.eclipse.jgit.lib.internal.WorkQueue;
+import org.eclipse.jgit.nls.NLS;
 import org.eclipse.jgit.util.FS;
 
 /**
@@ -171,6 +173,15 @@ public static InitCommand init() {
 	}
 
 	/**
+	 * Shutdown JGit and release resources it holds like NLS and thread pools
+	 * @since 5.8
+	 */
+	public static void shutdown() {
+		WorkQueue.getExecutor().shutdownNow();
+		NLS.clear();
+	}
+
+	/**
 	 * Construct a new {@link org.eclipse.jgit.api.Git} object which can
 	 * interact with the specified git repository.
 	 * <p>
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/nls/GlobalBundleCache.java b/org.eclipse.jgit/src/org/eclipse/jgit/nls/GlobalBundleCache.java
index 6d4437f..9b55639 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/nls/GlobalBundleCache.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/nls/GlobalBundleCache.java
@@ -70,4 +70,8 @@ static synchronized <T extends TranslationBundle> T lookupBundle(Locale locale,
 			throw new Error(e);
 		}
 	}
+
+	static void clear() {
+		cachedBundles.clear();
+	}
 }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/nls/NLS.java b/org.eclipse.jgit/src/org/eclipse/jgit/nls/NLS.java
index daa039d..d7dd3be 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/nls/NLS.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/nls/NLS.java
@@ -100,6 +100,15 @@ public static <T extends TranslationBundle> T getBundleFor(Class<T> type) {
 		return b.get(type);
 	}
 
+	/**
+	 * Release resources held by NLS
+	 * @since 5.8
+	 */
+	public static void clear() {
+		local.remove();
+		GlobalBundleCache.clear();
+	}
+
 	private final Locale locale;
 	private final ConcurrentHashMap<Class, TranslationBundle> map = new ConcurrentHashMap<>();