diff options
author | Junio C Hamano <gitster@pobox.com> | 2015-05-13 10:25:18 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2015-05-13 10:25:18 -0700 |
commit | 76c61fbdbab6241af5b229a314946714fdc45908 (patch) | |
tree | e2340897172eff35cb6e49f58d110bab5609ca69 /log-tree.c | |
parent | log: decorate HEAD with branch name (diff) | |
download | tgif-76c61fbdbab6241af5b229a314946714fdc45908.tar.xz |
log: decorate HEAD with branch name under --decorate=full, too
The previous step to teach "log --decorate" to show "HEAD -> master"
instead of "HEAD, master" when showing the commit at the tip of the
'master' branch, when the 'master' branch is checked out, did not
work for "log --decorate=full".
The commands in the "log" family prepare commit decorations for all
refs upfront, and the actual string used in a decoration depends on
how load_ref_decorations() is called very early in the process. By
default, "git log --decorate" stores names with common prefixes such
as "refs/heads" stripped; "git log --decorate=full" stores the full
refnames.
When the current_pointed_by_HEAD() function has to decide if "HEAD"
points at the branch a decoration describes, however, what was
passed to load_ref_decorations() to decide to strip (or keep) such a
common prefix is long lost. This makes it impossible to reliably
tell if a decoration that stores "refs/heads/master", for example,
is the 'master' branch (under "--decorate" with prefix omitted) or
'refs/heads/master' branch (under "--decorate=full").
Keep what was passed to load_ref_decorations() in a global next to
the global variable name_decoration, and use that to decide how to
match what was read from "HEAD" and what is in a decoration.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'log-tree.c')
-rw-r--r-- | log-tree.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/log-tree.c b/log-tree.c index 2c1ed0fa90..92259bcb0a 100644 --- a/log-tree.c +++ b/log-tree.c @@ -13,6 +13,8 @@ #include "line-log.h" static struct decoration name_decoration = { "object names" }; +static int decoration_loaded; +static int decoration_flags; static char decoration_colors[][COLOR_MAXLEN] = { GIT_COLOR_RESET, @@ -146,9 +148,9 @@ static int add_graft_decoration(const struct commit_graft *graft, void *cb_data) void load_ref_decorations(int flags) { - static int loaded; - if (!loaded) { - loaded = 1; + if (!decoration_loaded) { + decoration_loaded = 1; + decoration_flags = flags; for_each_ref(add_ref_decoration, &flags); head_ref(add_ref_decoration, &flags); for_each_commit_graft(add_graft_decoration, NULL); @@ -196,8 +198,19 @@ static const struct name_decoration *current_pointed_by_HEAD(const struct name_d branch_name = resolve_ref_unsafe("HEAD", 0, unused, &rru_flags); if (!(rru_flags & REF_ISSYMREF)) return NULL; - if (!skip_prefix(branch_name, "refs/heads/", &branch_name)) - 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; + } /* OK, do we have that ref in the list? */ for (list = decoration; list; list = list->next) |