From b70f3a7457dd42b9bb2146bbe2eb3baf214bea28 Mon Sep 17 00:00:00 2001 From: Christian Halstrick Date: Tue, 3 May 2016 13:41:39 +0200 Subject: [PATCH] Add configuration parameter to enable built-in hooks/filters If the configuration parameter filter..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 --- .../jgit/attributes/FilterCommandRegistry.java | 9 +++++++++ .../src/org/eclipse/jgit/lib/Constants.java | 7 +++++++ .../org/eclipse/jgit/treewalk/TreeWalk.java | 18 +++++++++++++++++- 3 files changed, 33 insertions(+), 1 deletion(-) 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 4729f347d..3fbaedb05 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; @@ -102,6 +103,14 @@ public class FilterCommandRegistry { return filterCommandRegistry.containsKey(filterCommandName); } + /** + * @return Set of commandNames for which a {@link FilterCommandFactory} is + * registered + */ + public static Set 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 ff80672f8..f9350a574 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Constants.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Constants.java @@ -391,6 +391,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 * 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 911b7ffa1..21cd6b83a 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 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; } }