[PATCH 2/6] pretty: Add %D for script-friendly decoration
- From
Greg Price <price@mit.edu>
- Date
- Nov 18, 2009, 23:22 UTC
- Message-ID
- <9d9e18b8c062380025f52a6ff992fae51a17f5d1.1309133817.git.greg@quora.com>
- In-Reply-To
- <cover.1309133817.git.greg@quora.com>
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@mit.edu> --- 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