Signed-off-by: Nguyễn Thái Ngọc Duy <[email protected]>
---
Documentation/pretty-formats.txt | 1 +
pretty.c | 28 +++++++++++++++++++++++++++-
2 files changed, 28 insertions(+), 1 deletion(-)
diff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.txt
index e3d8a83..8304325 100644
--- a/Documentation/pretty-formats.txt
+++ b/Documentation/pretty-formats.txt
@@ -142,6 +142,7 @@ The placeholders are:
- '%Cblue': switch color to blue
- '%Creset': reset color
- '%C(...)': color specification, as described in color.branch.* config option
+- '%C(auto[,<N>])': turn on coloring on the next placeholder (or the next N
placeholders) if supported
- '%m': left, right or boundary mark
- '%n': newline
- '%%': a raw '%'
diff --git a/pretty.c b/pretty.c
index 93c96c2..45fe878 100644
--- a/pretty.c
+++ b/pretty.c
@@ -630,6 +630,7 @@ struct format_commit_context {
} signature;
char *message;
size_t width, indent1, indent2;
+ unsigned use_color;
/* These offsets are relative to the start of the commit message. */
struct chunk author;
@@ -872,6 +873,24 @@ static size_t parse_color_placeholder(struct strbuf *sb,
char color[COLOR_MAXLEN];
if (!end)
return 0;
+ if (!prefixcmp(placeholder + 1, "(auto")) {
+ /*
+ * use_color decreased after every
+ * format_commit_one() so we lose one right
+ * after parsing "%C". Which is why we add an
+ * extra one to use_color here.
+ */
+ if (placeholder[6] == ',') {
+ char *next;
+ int v = strtoul(placeholder + 7, &next, 10);
+ if (next == end)
+ c->use_color = v + 1;
+ else
+ return 0;
+ } else
+ c->use_color = 2;
+ return end - placeholder + 1;
+ }
color_parse_mem(placeholder + 2,
end - (placeholder + 2),
"--pretty format", color);
@@ -955,13 +974,17 @@ static size_t format_commit_one(struct strbuf *sb, const
char *placeholder,
switch (placeholder[0]) {
case 'H': /* commit hash */
+ strbuf_addstr(sb, diff_get_color(c->use_color, DIFF_COMMIT));
strbuf_addstr(sb, sha1_to_hex(commit->object.sha1));
+ strbuf_addstr(sb, diff_get_color(c->use_color, DIFF_RESET));
return 1;
case 'h': /* abbreviated commit hash */
+ strbuf_addstr(sb, diff_get_color(c->use_color, DIFF_COMMIT));
if (add_again(sb, &c->abbrev_commit_hash))
return 1;
strbuf_addstr(sb, find_unique_abbrev(commit->object.sha1,
c->pretty_ctx->abbrev));
+ strbuf_addstr(sb, diff_get_color(c->use_color, DIFF_RESET));
c->abbrev_commit_hash.len = sb->len - c->abbrev_commit_hash.off;
return 1;
case 'T': /* tree hash */
@@ -998,7 +1021,7 @@ 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, 0);
+ format_decoration(sb, commit, c->use_color);
return 1;
case 'g': /* reflog info */
switch(placeholder[1]) {
@@ -1101,6 +1124,7 @@ static size_t format_commit_one(struct strbuf *sb, const
char *placeholder,
static size_t format_commit_item(struct strbuf *sb, const char *placeholder,
void *context)
{
+ struct format_commit_context *c = context;
int consumed;
size_t orig_len;
enum {
@@ -1128,6 +1152,8 @@ static size_t format_commit_item(struct strbuf *sb, const
char *placeholder,
orig_len = sb->len;
consumed = format_commit_one(sb, placeholder, context);
+ if (c->use_color)
+ c->use_color--;
if (magic == NO_MAGIC)
return consumed;
--
1.7.12.1.384.g7b808e7
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html