diff options
author | Christian Halstrick <christian.halstrick@sap.com> | 2016-05-03 13:41:39 +0200 |
---|---|---|
committer | Matthias Sohn <matthias.sohn@sap.com> | 2016-09-20 10:06:13 +0200 |
commit | b70f3a7457dd42b9bb2146bbe2eb3baf214bea28 (patch) | |
tree | fdbfaec9cb755a667612a00d81e19f039e6b1be6 | |
parent | d97248467a95d26934ddeb8617c3bbf3f673f69d (diff) | |
download | jgit-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
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; } } |