Skip to content

Commit

Permalink
log: do not shorten decoration names too early
Browse files Browse the repository at this point in the history
The DECORATE_SHORT_REFS option given to load_ref_decorations()
affects the way a copy of the refname is stored for each decorated
commit, and this forces later steps like current_pointed_by_HEAD()
to adjust their behaviour based on this initial settings.

Instead, we can always store the full refname and then shorten them
when producing the output.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Junio C Hamano committed May 13, 2015
1 parent 76c61fb commit 429ad20
Showing 1 changed file with 16 additions and 18 deletions.
34 changes: 16 additions & 18 deletions log-tree.c
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,8 @@ static int add_ref_decoration(const char *refname, const unsigned char *sha1, in
struct object *obj;
enum decoration_type type = DECORATION_NONE;

assert(cb_data == NULL);

if (starts_with(refname, "refs/replace/")) {
unsigned char original_sha1[20];
if (!check_replace_refs)
Expand Down Expand Up @@ -123,8 +125,6 @@ static int add_ref_decoration(const char *refname, const unsigned char *sha1, in
else if (!strcmp(refname, "HEAD"))
type = DECORATION_REF_HEAD;

if (!cb_data || *(int *)cb_data == DECORATE_SHORT_REFS)
refname = prettify_refname(refname);
add_name_decoration(type, refname, obj);
while (obj->type == OBJ_TAG) {
obj = ((struct tag *)obj)->tagged;
Expand All @@ -151,8 +151,8 @@ void load_ref_decorations(int flags)
if (!decoration_loaded) {
decoration_loaded = 1;
decoration_flags = flags;
for_each_ref(add_ref_decoration, &flags);
head_ref(add_ref_decoration, &flags);
for_each_ref(add_ref_decoration, NULL);
head_ref(add_ref_decoration, NULL);
for_each_commit_graft(add_graft_decoration, NULL);
}
}
Expand Down Expand Up @@ -199,18 +199,8 @@ static const struct name_decoration *current_pointed_by_HEAD(const struct name_d
if (!(rru_flags & REF_ISSYMREF))
return NULL;

if ((decoration_flags == DECORATE_SHORT_REFS)) {
if (!skip_prefix(branch_name, "refs/heads/", &branch_name))
return NULL;
} else {
/*
* Each decoration has a refname in full; keep
* branch_name also in full, but still make sure
* HEAD is a reasonable ref.
*/
if (!starts_with(branch_name, "refs/"))
return NULL;
}
if (!starts_with(branch_name, "refs/"))
return NULL;

/* OK, do we have that ref in the list? */
for (list = decoration; list; list = list->next)
Expand All @@ -222,6 +212,14 @@ static const struct name_decoration *current_pointed_by_HEAD(const struct name_d
return NULL;
}

static void show_name(struct strbuf *sb, const struct name_decoration *decoration)
{
if (decoration_flags == DECORATE_SHORT_REFS)
strbuf_addstr(sb, prettify_refname(decoration->name));
else
strbuf_addstr(sb, decoration->name);
}

/*
* The caller makes sure there is no funny color before calling.
* format_decorations_extended makes sure the same after return.
Expand Down Expand Up @@ -259,7 +257,7 @@ void format_decorations_extended(struct strbuf *sb,
if (decoration->type == DECORATION_REF_TAG)
strbuf_addstr(sb, "tag: ");

strbuf_addstr(sb, decoration->name);
show_name(sb, decoration);

if (current_and_HEAD &&
decoration->type == DECORATION_REF_HEAD) {
Expand All @@ -268,7 +266,7 @@ void format_decorations_extended(struct strbuf *sb,
strbuf_addstr(sb, " -> ");
strbuf_addstr(sb, color_reset);
strbuf_addstr(sb, decorate_get_color(use_color, current_and_HEAD->type));
strbuf_addstr(sb, current_and_HEAD->name);
show_name(sb, current_and_HEAD);
}
strbuf_addstr(sb, color_reset);

Expand Down

0 comments on commit 429ad20

Please sign in to comment.