]> git.ipfire.org Git - thirdparty/git.git/commitdiff
pickaxe: assert that we must have a needle under -G or -S
authorÆvar Arnfjörð Bjarmason <avarab@gmail.com>
Mon, 12 Apr 2021 17:15:20 +0000 (19:15 +0200)
committerJunio C Hamano <gitster@pobox.com>
Tue, 11 May 2021 03:47:31 +0000 (12:47 +0900)
Assert early in diffcore_pickaxe() that we've got a needle to work
with under -G and -S.

This code is redundant to the check -G and -S get from
parse-options.c's get_arg(), which I'm adding a test for.

This check dates back to e1b161161d (diffcore-pickaxe: fix infinite
loop on zero-length needle, 2007-01-25) when "git log -S" could send
this code into an infinite loop.

It was then later refactored in 8fa4b09fb1 (pickaxe: hoist empty
needle check, 2012-10-28) into its current form, but it seemingly
wasn't noticed that in the meantime a move to the parse-options.c API
in dea007fb4c (diff: parse separate options like -S foo, 2010-08-05)
had made it redundant.

Let's retain some of the paranoia here with a BUG(), but there's no
need to be checking this in the pickaxe_match() inner loop.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
diffcore-pickaxe.c
t/t4209-log-pickaxe.sh

index 953b6ec1b4aff8450ca7556390fd314805063d42..88b6ca840f64f4a66bc263c25baf2412df7a97a2 100644 (file)
@@ -132,9 +132,6 @@ static int pickaxe_match(struct diff_filepair *p, struct diff_options *o,
                         oidset_contains(o->objfind, &p->two->oid));
        }
 
-       if (!o->pickaxe[0])
-               return 0;
-
        if (o->flags.allow_textconv) {
                textconv_one = get_textconv(o->repo, p->one);
                textconv_two = get_textconv(o->repo, p->two);
@@ -230,6 +227,9 @@ void diffcore_pickaxe(struct diff_options *o)
        kwset_t kws = NULL;
        pickaxe_fn fn;
 
+       if (opts & ~DIFF_PICKAXE_KIND_OBJFIND &&
+           (!needle || !*needle))
+               BUG("should have needle under -G or -S");
        if (opts & (DIFF_PICKAXE_REGEX | DIFF_PICKAXE_KIND_G)) {
                int cflags = REG_EXTENDED | REG_NEWLINE;
                if (o->pickaxe_opts & DIFF_PICKAXE_IGNORE_CASE)
index 16166ffd3e6e7118e6cb5820fdc09ee8ae28d378..3f9aad0fdb060dc97029fe06a54a0cce87797837 100755 (executable)
@@ -56,6 +56,12 @@ test_expect_success setup '
 '
 
 test_expect_success 'usage' '
+       test_expect_code 129 git log -S 2>err &&
+       test_i18ngrep "switch.*requires a value" err &&
+
+       test_expect_code 129 git log -G 2>err &&
+       test_i18ngrep "switch.*requires a value" err &&
+
        test_expect_code 128 git log -Gregex -Sstring 2>err &&
        grep "mutually exclusive" err &&