summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Halstrick <christian.halstrick@sap.com>2016-05-03 13:41:39 +0200
committerMatthias Sohn <matthias.sohn@sap.com>2016-09-20 10:06:13 +0200
commitb70f3a7457dd42b9bb2146bbe2eb3baf214bea28 (patch)
treefdbfaec9cb755a667612a00d81e19f039e6b1be6
parentd97248467a95d26934ddeb8617c3bbf3f673f69d (diff)
downloadjgit-b70f3a7457dd42b9bb2146bbe2eb3baf214bea28.tar.gz
jgit-b70f3a7457dd42b9bb2146bbe2eb3baf214bea28.zip
Add configuration parameter to enable built-in hooks/filters
If the configuration parameter filter.<filterDriverName>.useJGitBuiltin is set to true then for all corresponding filters JGit will try to execute the built-in filter instead of the filter-command which is defined in git configuration. It will fallback to the non-built-in filters if no built-in filters are registered or if constructing them leads to exceptions. If set to false JGit will not try to execute built-in filters for the specified filter driver. Example: The configuration contains the following lines [filter "lfs"] clean = git-lfs clean -- %f smudge = git-lfs smudge -- %f useJGitBuiltin = true Addtionally the .gitattributes file in the root of the working tree contains: *.bin filter=lfs In this case when new content is added similar to "git add 1.bin" then the following will happen: - jgit will check whether a built-in command factory was registered for the command "jgit://builtin/lfs/clean". If that is true the factory is used to create a built-in filter command and that command is used to filter the content - Otherwise jgit will call the external program "git lfs clean ..." to do the filtering Change-Id: Idadb1db06b1e89e7031d7ed6319904973c367d38
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/attributes/FilterCommandRegistry.java9
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/lib/Constants.java7
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/treewalk/TreeWalk.java18
3 files changed, 33 insertions, 1 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/attributes/FilterCommandRegistry.java b/org.eclipse.jgit/src/org/eclipse/jgit/attributes/FilterCommandRegistry.java
index 4729f347d9..3fbaedb051 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/attributes/FilterCommandRegistry.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/attributes/FilterCommandRegistry.java
@@ -45,6 +45,7 @@ package org.eclipse.jgit.attributes;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import org.eclipse.jgit.lib.Repository;
@@ -103,6 +104,14 @@ public class FilterCommandRegistry {
}
/**
+ * @return Set of commandNames for which a {@link FilterCommandFactory} is
+ * registered
+ */
+ public static Set<String> getRegisteredFilterCommands() {
+ return filterCommandRegistry.keySet();
+ }
+
+ /**
* Creates a new {@link FilterCommand} for the given name. A factory must be
* registered for the name in advance.
*
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Constants.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Constants.java
index ff80672f80..f9350a5742 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Constants.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Constants.java
@@ -392,6 +392,13 @@ public final class Constants {
public static final String ATTR_FILTER_TYPE_SMUDGE = "smudge";
/**
+ * Whether to use JGit's implementations of filters and hooks
+ *
+ * @since 4.6
+ */
+ public static final String ATTR_FILTER_USE_BUILTIN = "useJGitBuiltin";
+
+ /**
* Builtin filter commands start with this prefix
*
* @since 4.6
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/TreeWalk.java b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/TreeWalk.java
index 911b7ffa1a..21cd6b83a0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/TreeWalk.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/TreeWalk.java
@@ -55,6 +55,7 @@ import org.eclipse.jgit.attributes.Attribute;
import org.eclipse.jgit.attributes.Attributes;
import org.eclipse.jgit.attributes.AttributesNodeProvider;
import org.eclipse.jgit.attributes.AttributesProvider;
+import org.eclipse.jgit.attributes.FilterCommandRegistry;
import org.eclipse.jgit.dircache.DirCacheBuildIterator;
import org.eclipse.jgit.attributes.AttributesHandler;
import org.eclipse.jgit.dircache.DirCacheIterator;
@@ -313,6 +314,8 @@ public class TreeWalk implements AutoCloseable, AttributesProvider {
private Config config;
+ private Set<String> filterCommands;
+
/**
* Create a new tree walker for a given repository.
*
@@ -357,6 +360,8 @@ public class TreeWalk implements AutoCloseable, AttributesProvider {
if (repo != null) {
config = repo.getConfig();
attributesNodeProvider = repo.createAttributesNodeProvider();
+ filterCommands = FilterCommandRegistry
+ .getRegisteredFilterCommands();
} else {
config = null;
attributesNodeProvider = null;
@@ -1369,8 +1374,19 @@ public class TreeWalk implements AutoCloseable, AttributesProvider {
return filterCommand;
filterCommand = config.getString(Constants.ATTR_FILTER,
filterDriverName, filterCommandType);
- if (filterCommand != null)
+ boolean useBuiltin = config.getBoolean(Constants.ATTR_FILTER,
+ filterDriverName, Constants.ATTR_FILTER_USE_BUILTIN, false);
+ if (useBuiltin) {
+ String builtinFilterCommand = Constants.BUILTIN_FILTER_PREFIX
+ + filterDriverName + '/' + filterCommandType;
+ if (filterCommands != null
+ && filterCommands.contains(builtinFilterCommand)) {
+ filterCommand = builtinFilterCommand;
+ }
+ }
+ if (filterCommand != null) {
filterCommandsByNameDotType.put(key, filterCommand);
+ }
return filterCommand;
}
}