From: Jeff King <peff@peff.net>
To: git@vger.kernel.org
Cc: "Aleksandr Makarov" <aleksandr.o.makarov@gmail.com>,
"Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
Subject: [PATCH 3/3] ref-filter: avoid backend filtering with --ignore-case
Date: Mon, 2 Jul 2018 17:12:42 -0400 [thread overview]
Message-ID: <20180702211242.GC23324@sigill.intra.peff.net> (raw)
In-Reply-To: <20180702211100.GA20885@sigill.intra.peff.net>
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. And 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>
---
ref-filter.c | 9 +++++++++
t/t6300-for-each-ref.sh | 2 +-
2 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/ref-filter.c b/ref-filter.c
index 5c0cbde52b..52704c7be6 100644
--- a/ref-filter.c
+++ b/ref-filter.c
@@ -1868,6 +1868,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);
diff --git a/t/t6300-for-each-ref.sh b/t/t6300-for-each-ref.sh
index b2bc81103f..e0496da812 100755
--- a/t/t6300-for-each-ref.sh
+++ b/t/t6300-for-each-ref.sh
@@ -795,7 +795,7 @@ test_expect_success ':remotename and :remoteref' '
)
'
-test_expect_failure 'for-each-ref --ignore-case ignores case' '
+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 &&
--
2.18.0.359.ge51c883f96
next prev parent reply other threads:[~2018-07-02 21:12 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-07-02 21:11 [PATCH 0/3] un-break for-each-ref --ignore-case Jeff King
2018-07-02 21:11 ` [PATCH 1/3] t6300: add a test for --ignore-case Jeff King
2018-07-02 21:11 ` [PATCH 2/3] for-each-ref: consistently pass WM_IGNORECASE flag Jeff King
2018-07-02 21:12 ` Jeff King [this message]
2018-07-02 21:30 ` [PATCH 3/3] ref-filter: avoid backend filtering with --ignore-case Eric Sunshine
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180702211242.GC23324@sigill.intra.peff.net \
--to=peff@peff.net \
--cc=aleksandr.o.makarov@gmail.com \
--cc=git@vger.kernel.org \
--cc=pclouds@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).