Browse Source

branch: refactor width computation

Remove unnecessary variables from ref_list and ref_item which were
used for width computation. This is to make ref_item similar to
ref-filter's ref_array_item. This will ensure a smooth port of
branch.c to use ref-filter APIs in further patches.

Previously the maxwidth was computed when inserting the refs into the
ref_list. Now, we obtain the entire ref_list and then compute
maxwidth.

Based-on-patch-by: Jeff King <peff@peff.net>
Mentored-by: Christian Couder <christian.couder@gmail.com>
Mentored-by: Matthieu Moy <matthieu.moy@grenoble-inp.fr>
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Karthik Nayak 10 years ago committed by Junio C Hamano
parent
commit
1051e40dba
  1. 64
      builtin/branch.c

64
builtin/branch.c

@ -282,14 +282,14 @@ static int delete_branches(int argc, const char **argv, int force, int kinds, @@ -282,14 +282,14 @@ static int delete_branches(int argc, const char **argv, int force, int kinds,
struct ref_item {
char *name;
char *dest;
unsigned int kind, width;
unsigned int kind;
struct commit *commit;
int ignore;
};

struct ref_list {
struct rev_info revs;
int index, alloc, maxwidth, verbose, abbrev;
int index, alloc, verbose, abbrev;
struct ref_item *list;
struct commit_list *with_commit;
int kinds;
@ -386,15 +386,8 @@ static int append_ref(const char *refname, const struct object_id *oid, int flag @@ -386,15 +386,8 @@ static int append_ref(const char *refname, const struct object_id *oid, int flag
newitem->name = xstrdup(refname);
newitem->kind = kind;
newitem->commit = commit;
newitem->width = utf8_strwidth(refname);
newitem->dest = resolve_symref(orig_refname, prefix);
newitem->ignore = 0;
/* adjust for "remotes/" */
if (newitem->kind == REF_REMOTE_BRANCH &&
ref_list->kinds != REF_REMOTE_BRANCH)
newitem->width += 8;
if (newitem->width > ref_list->maxwidth)
ref_list->maxwidth = newitem->width;

return 0;
}
@ -505,11 +498,12 @@ static void add_verbose_info(struct strbuf *out, struct ref_item *item, @@ -505,11 +498,12 @@ static void add_verbose_info(struct strbuf *out, struct ref_item *item,
}

static void print_ref_item(struct ref_item *item, int maxwidth, int verbose,
int abbrev, int current, char *prefix)
int abbrev, int current, const char *remote_prefix)
{
char c;
int color;
struct strbuf out = STRBUF_INIT, name = STRBUF_INIT;
const char *prefix = "";

if (item->ignore)
return;
@ -520,6 +514,7 @@ static void print_ref_item(struct ref_item *item, int maxwidth, int verbose, @@ -520,6 +514,7 @@ static void print_ref_item(struct ref_item *item, int maxwidth, int verbose,
break;
case REF_REMOTE_BRANCH:
color = BRANCH_COLOR_REMOTE;
prefix = remote_prefix;
break;
default:
color = BRANCH_COLOR_PLAIN;
@ -557,16 +552,22 @@ static void print_ref_item(struct ref_item *item, int maxwidth, int verbose, @@ -557,16 +552,22 @@ static void print_ref_item(struct ref_item *item, int maxwidth, int verbose,
strbuf_release(&out);
}

static int calc_maxwidth(struct ref_list *refs)
static int calc_maxwidth(struct ref_list *refs, int remote_bonus)
{
int i, w = 0;
int i, max = 0;
for (i = 0; i < refs->index; i++) {
if (refs->list[i].ignore)
struct ref_item *it = &refs->list[i];
int w;

if (it->ignore)
continue;
if (refs->list[i].width > w)
w = refs->list[i].width;
w = utf8_strwidth(it->name);
if (it->kind == REF_REMOTE_BRANCH)
w += remote_bonus;
if (w > max)
max = w;
}
return w;
return max;
}

static char *get_head_description(void)
@ -600,21 +601,18 @@ static char *get_head_description(void) @@ -600,21 +601,18 @@ static char *get_head_description(void)
return strbuf_detach(&desc, NULL);
}

static void show_detached(struct ref_list *ref_list)
static void show_detached(struct ref_list *ref_list, int maxwidth)
{
struct commit *head_commit = lookup_commit_reference_gently(head_sha1, 1);

if (head_commit && is_descendant_of(head_commit, ref_list->with_commit)) {
struct ref_item item;
item.name = get_head_description();
item.width = utf8_strwidth(item.name);
item.kind = REF_LOCAL_BRANCH;
item.dest = NULL;
item.commit = head_commit;
item.ignore = 0;
if (item.width > ref_list->maxwidth)
ref_list->maxwidth = item.width;
print_ref_item(&item, ref_list->maxwidth, ref_list->verbose, ref_list->abbrev, 1, "");
print_ref_item(&item, maxwidth, ref_list->verbose, ref_list->abbrev, 1, "");
free(item.name);
}
}
@ -624,6 +622,16 @@ static int print_ref_list(int kinds, int detached, int verbose, int abbrev, stru @@ -624,6 +622,16 @@ static int print_ref_list(int kinds, int detached, int verbose, int abbrev, stru
int i;
struct append_ref_cb cb;
struct ref_list ref_list;
int maxwidth = 0;
const char *remote_prefix = "";

/*
* If we are listing more than just remote branches,
* then remote branches will have a "remotes/" prefix.
* We need to account for this in the width.
*/
if (kinds != REF_REMOTE_BRANCH)
remote_prefix = "remotes/";

memset(&ref_list, 0, sizeof(ref_list));
ref_list.kinds = kinds;
@ -667,26 +675,22 @@ static int print_ref_list(int kinds, int detached, int verbose, int abbrev, stru @@ -667,26 +675,22 @@ static int print_ref_list(int kinds, int detached, int verbose, int abbrev, stru
clear_commit_marks(item->commit, ALL_REV_FLAGS);
}
clear_commit_marks(filter, ALL_REV_FLAGS);

if (verbose)
ref_list.maxwidth = calc_maxwidth(&ref_list);
}
if (verbose)
maxwidth = calc_maxwidth(&ref_list, strlen(remote_prefix));

qsort(ref_list.list, ref_list.index, sizeof(struct ref_item), ref_cmp);

detached = (detached && (kinds & REF_LOCAL_BRANCH));
if (detached && match_patterns(pattern, "HEAD"))
show_detached(&ref_list);
show_detached(&ref_list, maxwidth);

for (i = 0; i < ref_list.index; i++) {
int current = !detached &&
(ref_list.list[i].kind == REF_LOCAL_BRANCH) &&
!strcmp(ref_list.list[i].name, head);
char *prefix = (kinds != REF_REMOTE_BRANCH &&
ref_list.list[i].kind == REF_REMOTE_BRANCH)
? "remotes/" : "";
print_ref_item(&ref_list.list[i], ref_list.maxwidth, verbose,
abbrev, current, prefix);
print_ref_item(&ref_list.list[i], maxwidth, verbose,
abbrev, current, remote_prefix);
}

free_ref_list(&ref_list);

Loading…
Cancel
Save