]> git.ipfire.org Git - thirdparty/git.git/commitdiff
rev-list: move --filter parsing into revision.c
authorDerrick Stolee <derrickstolee@github.com>
Wed, 9 Mar 2022 16:01:40 +0000 (16:01 +0000)
committerJunio C Hamano <gitster@pobox.com>
Wed, 9 Mar 2022 18:25:27 +0000 (10:25 -0800)
Now that 'struct rev_info' has a 'filter' member and most consumers of
object filtering are using that member instead of an external struct,
move the parsing of the '--filter' option out of builtin/rev-list.c and
into revision.c.

This use within handle_revision_pseudo_opt() allows us to find the
option within setup_revisions() if the arguments are passed directly. In
the case of a command such as 'git blame', the arguments are first
scanned and checked with parse_revision_opt(), which complains about the
option, so 'git blame --filter=blob:none <file>' does not become valid
with this change.

Some commands, such as 'git diff' gain this option without having it
make an effect. And 'git diff --objects' was already possible, but does
not actually make sense in that builtin.

The key addition that is coming is 'git bundle create --filter=<X>' so
we can create bundles containing promisor packs. More work is required
to make them fully functional, but that will follow.

Signed-off-by: Derrick Stolee <derrickstolee@github.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/rev-list.c
revision.c

index ec433cb6d373a705ac3346ed54a05b65b233e538..640828149c576592eb1e83707a403ae57d439a88 100644 (file)
@@ -591,17 +591,6 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)
                        show_progress = arg;
                        continue;
                }
-
-               if (skip_prefix(arg, ("--" CL_ARG__FILTER "="), &arg)) {
-                       parse_list_objects_filter(&revs.filter, arg);
-                       if (revs.filter.choice && !revs.blob_objects)
-                               die(_("object filtering requires --objects"));
-                       continue;
-               }
-               if (!strcmp(arg, ("--no-" CL_ARG__FILTER))) {
-                       list_objects_filter_set_no_filter(&revs.filter);
-                       continue;
-               }
                if (!strcmp(arg, "--filter-provided-objects")) {
                        filter_provided_objects = 1;
                        continue;
index 4c55c55880a8313e2b003072d74528f89ff048d9..58b87172623dcbef08e160a8ce0d626a48b062a4 100644 (file)
@@ -32,6 +32,7 @@
 #include "utf8.h"
 #include "bloom.h"
 #include "json-writer.h"
+#include "list-objects-filter-options.h"
 
 volatile show_early_output_fn_t show_early_output;
 
@@ -2690,6 +2691,10 @@ static int handle_revision_pseudo_opt(struct rev_info *revs,
                revs->no_walk = 0;
        } else if (!strcmp(arg, "--single-worktree")) {
                revs->single_worktree = 1;
+       } else if (skip_prefix(arg, ("--" CL_ARG__FILTER "="), &arg)) {
+               parse_list_objects_filter(&revs->filter, arg);
+       } else if (!strcmp(arg, ("--no-" CL_ARG__FILTER))) {
+               list_objects_filter_set_no_filter(&revs->filter);
        } else {
                return 0;
        }
@@ -2894,6 +2899,8 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct s
                die("cannot combine --walk-reflogs with history-limiting options");
        if (revs->rewrite_parents && revs->children.name)
                die(_("options '%s' and '%s' cannot be used together"), "--parents", "--children");
+       if (revs->filter.choice && !revs->blob_objects)
+               die(_("object filtering requires --objects"));
 
        /*
         * Limitations on the graph functionality