When in a script or porcelain one wants to identify what refs point to which commits in a series, the functionality of 'git log --decorate' is extremely useful. This is available with the %d format code in a form optimized for humans, but for scripts a more raw format is better. Make such a format available through a new format code %D. Signed-off-by: Greg Price <price@xxxxxxx> --- Documentation/pretty-formats.txt | 1 + pretty.c | 33 +++++++++++++++++++++++++-------- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.txt index 561cc9f..217f11b 100644 --- a/Documentation/pretty-formats.txt +++ b/Documentation/pretty-formats.txt @@ -124,6 +124,7 @@ The placeholders are: - '%ct': committer date, UNIX timestamp - '%ci': committer date, ISO 8601 format - '%d': ref names, like the --decorate option of linkgit:git-log[1] +- '%D': full ref names, like the --decorate=full option of linkgit:git-log[1] - '%e': encoding - '%s': subject - '%f': sanitized subject line, suitable for a filename diff --git a/pretty.c b/pretty.c index f45eb54..0c7e723 100644 --- a/pretty.c +++ b/pretty.c @@ -776,21 +776,35 @@ static void parse_commit_message(struct format_commit_context *c) c->commit_message_parsed = 1; } -static void format_decoration(struct strbuf *sb, const struct commit *commit) + +static void format_decoration(struct strbuf *sb, const struct commit *commit, + int decoration_style, const char *affixes[3]) { struct name_decoration *d; - const char *prefix = " ("; + const char *affix = affixes[0]; - load_ref_decorations(DECORATE_SHORT_REFS); + load_ref_decorations(decoration_style); d = lookup_decoration(&name_decoration, &commit->object); while (d) { - strbuf_addstr(sb, prefix); - prefix = ", "; + strbuf_addstr(sb, affix); + affix = affixes[1]; strbuf_addstr(sb, d->name); d = d->next; } - if (prefix[0] == ',') - strbuf_addch(sb, ')'); + if (affix == affixes[1]) + strbuf_addstr(sb, affixes[2]); +} + +static void format_decoration_short(struct strbuf *sb, const struct commit *commit) +{ + const char *affixes[3] = {" (", ", ", ")"}; + format_decoration(sb, commit, DECORATE_SHORT_REFS, affixes); +} + +static void format_decoration_full(struct strbuf *sb, const struct commit *commit) +{ + const char *affixes[3] = {"", " ", ""}; + format_decoration(sb, commit, DECORATE_FULL_REFS, affixes); } static void strbuf_wrap(struct strbuf *sb, size_t pos, @@ -947,7 +961,10 @@ static size_t format_commit_one(struct strbuf *sb, const char *placeholder, strbuf_addstr(sb, get_revision_mark(NULL, commit)); return 1; case 'd': - format_decoration(sb, commit); + format_decoration_short(sb, commit); + return 1; + case 'D': + format_decoration_full(sb, commit); return 1; case 'g': /* reflog info */ switch(placeholder[1]) { -- 1.7.5.4 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html