branch: sort detached HEAD based on a flag
Change the ref-filter sorting of detached HEAD to check the FILTER_REFS_DETACHED_HEAD flag, instead of relying on the ref description filled-in by get_head_description() to start with "(", which in turn we expect to ASCII-sort before any other reference. For context, we'd like the detached line to appear first at the start of "git branch -l", e.g.: $ git branch -l * (HEAD detached at <hash>) master This doesn't change that, but improves on a fix made in28438e84e0
(ref-filter: sort detached HEAD lines firstly, 2019-06-18) and gives the Chinese translation the ability to use its preferred punctuation marks again. In Chinese the fullwidth versions of punctuation like "()" are typically written as (U+FF08 fullwidth left parenthesis), (U+FF09 fullwidth right parenthesis) instead[1]. This form is used in both po/zh_{CN,TW}.po in most cases where "()" is translated in a string. Aside from that improvement to the Chinese translation, it also just makes for cleaner code that we mark any special cases in the ref_array we're sorting with flags and make the sort function aware of them, instead of piggy-backing on the general-case of strcmp() doing the right thing. As seen in the amended tests this made reverse sorting a bit more consistent. Before this we'd sometimes sort this message in the middle, now it's consistently at the beginning or end, depending on whether we're doing a normal or reverse sort. Having it at the end doesn't make much sense either, but at least it behaves consistently now. A follow-up commit will make this behavior under reverse sorting even better. I'm removing the "TRANSLATORS" comments that were in the old code while I'm at it. Those were added ind4919bb288
(ref-filter: move get_head_description() from branch.c, 2017-01-10). I think it's obvious from context, string and translation memory in typical translation tools that these are the same or similar string. 1. https://en.wikipedia.org/wiki/Chinese_punctuation#Marks_similar_to_European_punctuation Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
7c269a7b16
commit
2708ce62d2
@ -740,6 +740,8 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
|
|||||||
if (!sorting)
|
if (!sorting)
|
||||||
sorting = ref_default_sorting();
|
sorting = ref_default_sorting();
|
||||||
ref_sorting_set_sort_flags_all(sorting, REF_SORTING_ICASE, icase);
|
ref_sorting_set_sort_flags_all(sorting, REF_SORTING_ICASE, icase);
|
||||||
|
ref_sorting_set_sort_flags_all(
|
||||||
|
sorting, REF_SORTING_DETACHED_HEAD_FIRST, 1);
|
||||||
print_ref_list(&filter, sorting, &format);
|
print_ref_list(&filter, sorting, &format);
|
||||||
print_columns(&output, colopts, NULL);
|
print_columns(&output, colopts, NULL);
|
||||||
string_list_clear(&output, 0);
|
string_list_clear(&output, 0);
|
||||||
|
44
ref-filter.c
44
ref-filter.c
@ -1536,36 +1536,27 @@ char *get_head_description(void)
|
|||||||
struct wt_status_state state;
|
struct wt_status_state state;
|
||||||
memset(&state, 0, sizeof(state));
|
memset(&state, 0, sizeof(state));
|
||||||
wt_status_get_state(the_repository, &state, 1);
|
wt_status_get_state(the_repository, &state, 1);
|
||||||
|
|
||||||
/*
|
|
||||||
* The ( character must be hard-coded and not part of a localizable
|
|
||||||
* string, since the description is used as a sort key and compared
|
|
||||||
* with ref names.
|
|
||||||
*/
|
|
||||||
strbuf_addch(&desc, '(');
|
|
||||||
if (state.rebase_in_progress ||
|
if (state.rebase_in_progress ||
|
||||||
state.rebase_interactive_in_progress) {
|
state.rebase_interactive_in_progress) {
|
||||||
if (state.branch)
|
if (state.branch)
|
||||||
strbuf_addf(&desc, _("no branch, rebasing %s"),
|
strbuf_addf(&desc, _("(no branch, rebasing %s)"),
|
||||||
state.branch);
|
state.branch);
|
||||||
else
|
else
|
||||||
strbuf_addf(&desc, _("no branch, rebasing detached HEAD %s"),
|
strbuf_addf(&desc, _("(no branch, rebasing detached HEAD %s)"),
|
||||||
state.detached_from);
|
state.detached_from);
|
||||||
} else if (state.bisect_in_progress)
|
} else if (state.bisect_in_progress)
|
||||||
strbuf_addf(&desc, _("no branch, bisect started on %s"),
|
strbuf_addf(&desc, _("(no branch, bisect started on %s)"),
|
||||||
state.branch);
|
state.branch);
|
||||||
else if (state.detached_from) {
|
else if (state.detached_from) {
|
||||||
if (state.detached_at)
|
if (state.detached_at)
|
||||||
strbuf_addstr(&desc, HEAD_DETACHED_AT);
|
strbuf_addf(&desc, _("(HEAD detached at %s)"),
|
||||||
|
state.detached_from);
|
||||||
else
|
else
|
||||||
strbuf_addstr(&desc, HEAD_DETACHED_FROM);
|
strbuf_addf(&desc, _("(HEAD detached from %s)"),
|
||||||
strbuf_addstr(&desc, state.detached_from);
|
state.detached_from);
|
||||||
}
|
} else
|
||||||
else
|
strbuf_addstr(&desc, _("(no branch)"));
|
||||||
strbuf_addstr(&desc, _("no branch"));
|
|
||||||
strbuf_addch(&desc, ')');
|
|
||||||
|
|
||||||
wt_status_state_free_buffers(&state);
|
|
||||||
return strbuf_detach(&desc, NULL);
|
return strbuf_detach(&desc, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2350,6 +2341,18 @@ int filter_refs(struct ref_array *array, struct ref_filter *filter, unsigned int
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int compare_detached_head(struct ref_array_item *a, struct ref_array_item *b)
|
||||||
|
{
|
||||||
|
if (!(a->kind ^ b->kind))
|
||||||
|
BUG("ref_kind_from_refname() should only mark one ref as HEAD");
|
||||||
|
if (a->kind & FILTER_REFS_DETACHED_HEAD)
|
||||||
|
return -1;
|
||||||
|
else if (b->kind & FILTER_REFS_DETACHED_HEAD)
|
||||||
|
return 1;
|
||||||
|
BUG("should have died in the xor check above");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int cmp_ref_sorting(struct ref_sorting *s, struct ref_array_item *a, struct ref_array_item *b)
|
static int cmp_ref_sorting(struct ref_sorting *s, struct ref_array_item *a, struct ref_array_item *b)
|
||||||
{
|
{
|
||||||
struct atom_value *va, *vb;
|
struct atom_value *va, *vb;
|
||||||
@ -2362,7 +2365,10 @@ static int cmp_ref_sorting(struct ref_sorting *s, struct ref_array_item *a, stru
|
|||||||
if (get_ref_atom_value(b, s->atom, &vb, &err))
|
if (get_ref_atom_value(b, s->atom, &vb, &err))
|
||||||
die("%s", err.buf);
|
die("%s", err.buf);
|
||||||
strbuf_release(&err);
|
strbuf_release(&err);
|
||||||
if (s->sort_flags & REF_SORTING_VERSION) {
|
if (s->sort_flags & REF_SORTING_DETACHED_HEAD_FIRST &&
|
||||||
|
((a->kind | b->kind) & FILTER_REFS_DETACHED_HEAD)) {
|
||||||
|
cmp = compare_detached_head(a, b);
|
||||||
|
} else if (s->sort_flags & REF_SORTING_VERSION) {
|
||||||
cmp = versioncmp(va->s, vb->s);
|
cmp = versioncmp(va->s, vb->s);
|
||||||
} else if (cmp_type == FIELD_STR) {
|
} else if (cmp_type == FIELD_STR) {
|
||||||
int (*cmp_fn)(const char *, const char *);
|
int (*cmp_fn)(const char *, const char *);
|
||||||
|
@ -32,6 +32,7 @@ struct ref_sorting {
|
|||||||
REF_SORTING_REVERSE = 1<<0,
|
REF_SORTING_REVERSE = 1<<0,
|
||||||
REF_SORTING_ICASE = 1<<1,
|
REF_SORTING_ICASE = 1<<1,
|
||||||
REF_SORTING_VERSION = 1<<2,
|
REF_SORTING_VERSION = 1<<2,
|
||||||
|
REF_SORTING_DETACHED_HEAD_FIRST = 1<<3,
|
||||||
} sort_flags;
|
} sort_flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -223,8 +223,8 @@ test_expect_success 'git branch `--sort=[-]objectsize` option' '
|
|||||||
cat >expect <<-\EOF &&
|
cat >expect <<-\EOF &&
|
||||||
branch-one
|
branch-one
|
||||||
main
|
main
|
||||||
* (HEAD detached from fromtag)
|
|
||||||
branch-two
|
branch-two
|
||||||
|
* (HEAD detached from fromtag)
|
||||||
EOF
|
EOF
|
||||||
git branch --sort=-objectsize >actual &&
|
git branch --sort=-objectsize >actual &&
|
||||||
test_i18ncmp expect actual
|
test_i18ncmp expect actual
|
||||||
@ -241,10 +241,10 @@ test_expect_success 'git branch `--sort=[-]type` option' '
|
|||||||
test_i18ncmp expect actual &&
|
test_i18ncmp expect actual &&
|
||||||
|
|
||||||
cat >expect <<-\EOF &&
|
cat >expect <<-\EOF &&
|
||||||
* (HEAD detached from fromtag)
|
|
||||||
branch-one
|
branch-one
|
||||||
branch-two
|
branch-two
|
||||||
main
|
main
|
||||||
|
* (HEAD detached from fromtag)
|
||||||
EOF
|
EOF
|
||||||
git branch --sort=-type >actual &&
|
git branch --sort=-type >actual &&
|
||||||
test_i18ncmp expect actual
|
test_i18ncmp expect actual
|
||||||
|
@ -1742,9 +1742,9 @@ static void wt_longstatus_print(struct wt_status *s)
|
|||||||
} else if (s->state.detached_from) {
|
} else if (s->state.detached_from) {
|
||||||
branch_name = s->state.detached_from;
|
branch_name = s->state.detached_from;
|
||||||
if (s->state.detached_at)
|
if (s->state.detached_at)
|
||||||
on_what = HEAD_DETACHED_AT;
|
on_what = _("HEAD detached at ");
|
||||||
else
|
else
|
||||||
on_what = HEAD_DETACHED_FROM;
|
on_what = _("HEAD detached from ");
|
||||||
} else {
|
} else {
|
||||||
branch_name = "";
|
branch_name = "";
|
||||||
on_what = _("Not currently on any branch.");
|
on_what = _("Not currently on any branch.");
|
||||||
|
@ -77,8 +77,6 @@ enum wt_status_format {
|
|||||||
STATUS_FORMAT_UNSPECIFIED
|
STATUS_FORMAT_UNSPECIFIED
|
||||||
};
|
};
|
||||||
|
|
||||||
#define HEAD_DETACHED_AT _("HEAD detached at ")
|
|
||||||
#define HEAD_DETACHED_FROM _("HEAD detached from ")
|
|
||||||
#define SPARSE_CHECKOUT_DISABLED -1
|
#define SPARSE_CHECKOUT_DISABLED -1
|
||||||
|
|
||||||
struct wt_status_state {
|
struct wt_status_state {
|
||||||
|
Loading…
Reference in New Issue
Block a user