struct wt_status_state state;
memset(&state, 0, sizeof(state));
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 ||
state.rebase_interactive_in_progress) {
if (state.branch)
- strbuf_addf(&desc, _("no branch, rebasing %s"),
+ strbuf_addf(&desc, _("(no branch, rebasing %s)"),
state.branch);
else
- strbuf_addf(&desc, _("no branch, rebasing detached HEAD %s"),
+ strbuf_addf(&desc, _("(no branch, rebasing detached HEAD %s)"),
state.detached_from);
} 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);
else if (state.detached_from) {
if (state.detached_at)
- strbuf_addstr(&desc, HEAD_DETACHED_AT);
+ strbuf_addf(&desc, _("(HEAD detached at %s)"),
+ state.detached_from);
else
- strbuf_addstr(&desc, HEAD_DETACHED_FROM);
- strbuf_addstr(&desc, state.detached_from);
- }
- else
- strbuf_addstr(&desc, _("no branch"));
- strbuf_addch(&desc, ')');
+ strbuf_addf(&desc, _("(HEAD detached from %s)"),
+ state.detached_from);
+ } else
+ strbuf_addstr(&desc, _("(no branch)"));
- wt_status_state_free_buffers(&state);
return strbuf_detach(&desc, NULL);
}
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)
{
struct atom_value *va, *vb;
if (get_ref_atom_value(b, s->atom, &vb, &err))
die("%s", err.buf);
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);
} else if (cmp_type == FIELD_STR) {
int (*cmp_fn)(const char *, const char *);