]> git.ipfire.org Git - thirdparty/git.git/commit - ref-filter.c
ref-filter: apply --ignore-case to all sorting keys
authorJeff King <peff@peff.net>
Sun, 3 May 2020 09:11:57 +0000 (05:11 -0400)
committerJunio C Hamano <gitster@pobox.com>
Mon, 4 May 2020 20:41:20 +0000 (13:41 -0700)
commit76f9e569adb540a1ca1a590c512d57fce4eea878
treef7014c05f22c2ae7870a694de613219ed32a8d75
parent041bc65923e13313ca1b77681c3b2950b5e0a163
ref-filter: apply --ignore-case to all sorting keys

All of the ref-filter users (for-each-ref, branch, and tag) take an
--ignore-case option which makes filtering and sorting case-insensitive.
However, this option was applied only to the first element of the
ref_sorting list. So:

  git for-each-ref --ignore-case --sort=refname

would do what you expect, but:

  git for-each-ref --ignore-case --sort=refname --sort=taggername

would sort the primary key (taggername) case-insensitively, but sort the
refname case-sensitively. We have two options here:

  - teach callers to set ignore_case on the whole list

  - replace the ref_sorting list with a struct that contains both the
    list of sorting keys, as well as options that apply to _all_
    keys

I went with the first one here, as it gives more flexibility if we later
want to let the users set the flag per-key (presumably through some
special syntax when defining the key; for now it's all or nothing
through --ignore-case).

The new test covers this by sorting on both tagger and subject
case-insensitively, which should compare "a" and "A" identically, but
still sort them before "b" and "B". We'll break ties by sorting on the
refname to give ourselves a stable output (this is actually supposed to
be done automatically, but there's another bug which will be fixed in
the next commit).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/branch.c
builtin/for-each-ref.c
builtin/tag.c
ref-filter.c
ref-filter.h
t/t6300-for-each-ref.sh