]> source.dussan.org Git - jgit.git/commitdiff
Add configuration parameter to enable built-in hooks/filters 84/71984/12
authorChristian Halstrick <christian.halstrick@sap.com>
Tue, 3 May 2016 11:41:39 +0000 (13:41 +0200)
committerMatthias Sohn <matthias.sohn@sap.com>
Tue, 20 Sep 2016 08:06:13 +0000 (10:06 +0200)
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

org.eclipse.jgit/src/org/eclipse/jgit/attributes/FilterCommandRegistry.java
org.eclipse.jgit/src/org/eclipse/jgit/lib/Constants.java
org.eclipse.jgit/src/org/eclipse/jgit/treewalk/TreeWalk.java

index 4729f347d99093ea85d44ff3a113040ddc4866a7..3fbaedb0517a4587405980730276c6f6fdfa6a63 100644 (file)
@@ -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<String> getRegisteredFilterCommands() {
+               return filterCommandRegistry.keySet();
+       }
+
        /**
         * Creates a new {@link FilterCommand} for the given name. A factory must be
         * registered for the name in advance.
index ff80672f80aaae053f0a21dfff827cb0defc9bd2..f9350a5742505a5acd4a6ea79623c291f8edb1d2 100644 (file)
@@ -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
         *
index 911b7ffa1a07f6c97ced6155039b73ed281940dc..21cd6b83a0ff8d7d0b6a9d98b165464f0354cc5b 100644 (file)
@@ -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;
        }
 }