Merge branch 'jk/for-each-ref-icase'
authorJunio C Hamano <gitster@pobox.com>
Tue, 24 Jul 2018 21:50:44 +0000 (14:50 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 24 Jul 2018 21:50:44 +0000 (14:50 -0700)
The "--ignore-case" option of "git for-each-ref" (and its friends)
did not work correctly, which has been fixed.

* jk/for-each-ref-icase:
ref-filter: avoid backend filtering with --ignore-case
for-each-ref: consistently pass WM_IGNORECASE flag
t6300: add a test for --ignore-case

ref-filter.c
t/t6300-for-each-ref.sh
index 0ab893a250f565ef8be1c449542d4e70e7bc10d5..492f2b770d909185dbeb65a0d42e62186981ab8a 100644 (file)
@@ -1814,7 +1814,7 @@ static int match_name_as_path(const struct ref_filter *filter, const char *refna
                     refname[plen] == '/' ||
                     p[plen-1] == '/'))
                        return 1;
-               if (!wildmatch(p, refname, WM_PATHNAME))
+               if (!wildmatch(p, refname, flags))
                        return 1;
        }
        return 0;
@@ -1869,6 +1869,15 @@ static int for_each_fullref_in_pattern(struct ref_filter *filter,
                return for_each_fullref_in("", cb, cb_data, broken);
        }
 
+       if (filter->ignore_case) {
+               /*
+                * we can't handle case-insensitive comparisons,
+                * so just return everything and let the caller
+                * sort it out.
+                */
+               return for_each_fullref_in("", cb, cb_data, broken);
+       }
+
        if (!filter->name_patterns[0]) {
                /* no patterns; we have to look at everything */
                return for_each_fullref_in("", cb, cb_data, broken);
index 48379aa0ee874b0250e2348d47eded09713a0a79..e0496da812f34df16ef7c3417788f9096ddc1e0f 100755 (executable)
@@ -795,4 +795,15 @@ test_expect_success ':remotename and :remoteref' '
        )
 '
 
+test_expect_success 'for-each-ref --ignore-case ignores case' '
+       >expect &&
+       git for-each-ref --format="%(refname)" refs/heads/MASTER >actual &&
+       test_cmp expect actual &&
+
+       echo refs/heads/master >expect &&
+       git for-each-ref --format="%(refname)" --ignore-case \
+               refs/heads/MASTER >actual &&
+       test_cmp expect actual
+'
+
 test_done