ref-filter: avoid backend filtering with --ignore-case

When for-each-ref is used with --ignore-case, we expect match_name_as_path() to do a case-insensitive match. But there's an extra layer of filtering that happens before we even get there. Since commit cfe004a5a9 (ref-filter: limit traversal to prefix, 2017-05-22), we feed the prefix to the ref backend so that it can optimize the ref iteration. There's no mechanism for us to tell the backend we're matching case-insensitively. Nor is there likely to be one anytime soon, since the packed backend relies on binary-searching the sorted list of refs. Let's just punt on this case. The extra filtering is an optimization that we simply can't do. We'll still give the correct answer via the filtering in match_name_as_path(). Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jeff King committed Jul 2, 2018 at 17:12 UTC e674eb2528229ac7f9c911369a39e7a979bfe75a
2 files changed +10 -1
ref-filter.c
+9
@@ -1769,6 +1769,15 @@ static int for_each_fullref_in_pattern(struct ref_filter *filter,
1769 return for_each_fullref_in("", cb, cb_data, broken);
1770 }
1771
1772 + if (filter->ignore_case) {
1773 + /*
1774 + * we can't handle case-insensitive comparisons,
1775 + * so just return everything and let the caller
1776 + * sort it out.
1777 + */
1778 + return for_each_fullref_in("", cb, cb_data, broken);
1779 + }
1780 +
1781 if (!filter->name_patterns[0]) {
1782 /* no patterns; we have to look at everything */
1783 return for_each_fullref_in("", cb, cb_data, broken);
t/t6300-for-each-ref.sh
+1 -1
@@ -795,7 +795,7 @@ test_expect_success ':remotename and :remoteref' '
795 )
796 '
797
798 -test_expect_failure 'for-each-ref --ignore-case ignores case' '
798 +test_expect_success 'for-each-ref --ignore-case ignores case' '
799 >expect &&
800 git for-each-ref --format="%(refname)" refs/heads/MASTER >actual &&
801 test_cmp expect actual &&