Arguably the most important part of branch-diff's output is the list of commits in the two branches, together with their relationships. For that reason, tbdiff introduced color-coding that is pretty intuitive, especially for unchanged patches (all dim yellow, like the first line in `git show`'s output) vs modified patches (old commit is red, new commit is green). Let's imitate that color scheme. While at it, also copy tbdiff's change of the fragment color to magenta. Signed-off-by: Johannes Schindelin <johannes.schindelin@xxxxxx> --- builtin/branch-diff.c | 49 +++++++++++++++++++++++++++++++------------ 1 file changed, 36 insertions(+), 13 deletions(-) diff --git a/builtin/branch-diff.c b/builtin/branch-diff.c index 7625da09e6f..e505b696d11 100644 --- a/builtin/branch-diff.c +++ b/builtin/branch-diff.c @@ -270,13 +270,19 @@ static int get_correspondences(struct string_list *a, struct string_list *b, return res; } -static void output_pair_header(struct strbuf *buf, +static void output_pair_header(struct diff_options *diffopt, struct strbuf *buf, int i, struct patch_util *a_util, int j, struct patch_util *b_util) { static char *dashes; struct object_id *oid = a_util ? &a_util->oid : &b_util->oid; struct commit *commit; + char status; + const char *color_reset = diff_get_color_opt(diffopt, DIFF_RESET); + const char *color_old = diff_get_color_opt(diffopt, DIFF_FILE_OLD); + const char *color_new = diff_get_color_opt(diffopt, DIFF_FILE_NEW); + const char *color_commit = diff_get_color_opt(diffopt, DIFF_COMMIT); + const char *color; if (!dashes) { char *p; @@ -286,21 +292,33 @@ static void output_pair_header(struct strbuf *buf, *p = '-'; } + if (j < 0) { + color = color_old; + status = '<'; + } else if (i < 0) { + color = color_new; + status = '>'; + } else if (strcmp(a_util->patch, b_util->patch)) { + color = color_commit; + status = '!'; + } else { + color = color_commit; + status = '='; + } + strbuf_reset(buf); + strbuf_addstr(buf, status == '!' ? color_old : color); if (i < 0) strbuf_addf(buf, "-: %s ", dashes); else strbuf_addf(buf, "%d: %s ", i + 1, find_unique_abbrev(&a_util->oid, DEFAULT_ABBREV)); - if (i < 0) - strbuf_addch(buf, '>'); - else if (j < 0) - strbuf_addch(buf, '<'); - else if (strcmp(a_util->patch, b_util->patch)) - strbuf_addch(buf, '!'); - else - strbuf_addch(buf, '='); + if (status == '!') + strbuf_addf(buf, "%s%s", color_reset, color); + strbuf_addch(buf, status); + if (status == '!') + strbuf_addf(buf, "%s%s", color_reset, color_new); if (j < 0) strbuf_addf(buf, " -: %s", dashes); @@ -313,12 +331,15 @@ static void output_pair_header(struct strbuf *buf, const char *commit_buffer = get_commit_buffer(commit, NULL); const char *subject; + if (status == '!') + strbuf_addf(buf, "%s%s", color_reset, color); + find_commit_subject(commit_buffer, &subject); strbuf_addch(buf, ' '); format_subject(buf, subject, " "); unuse_commit_buffer(commit, commit_buffer); } - strbuf_addch(buf, '\n'); + strbuf_addf(buf, "%s\n", color_reset); fwrite(buf->buf, buf->len, 1, stdout); } @@ -381,21 +402,21 @@ static void output(struct string_list *a, struct string_list *b, /* Show unmatched LHS commit whose predecessors were shown. */ if (i < a->nr && a_util->matching < 0) { - output_pair_header(&buf, i, a_util, -1, NULL); + output_pair_header(diffopt, &buf, i, a_util, -1, NULL); i++; continue; } /* Show unmatched RHS commits. */ while (j < b->nr && b_util->matching < 0) { - output_pair_header(&buf, -1, NULL, j, b_util); + output_pair_header(diffopt, &buf, -1, NULL, j, b_util); b_util = ++j < b->nr ? b->items[j].util : NULL; } /* Show matching LHS/RHS pair. */ if (j < b->nr) { a_util = a->items[b_util->matching].util; - output_pair_header(&buf, + output_pair_header(diffopt, &buf, b_util->matching, a_util, j, b_util); if (!(diffopt->output_format & DIFF_FORMAT_NO_OUTPUT)) patch_diff(a->items[b_util->matching].string, @@ -427,6 +448,8 @@ int cmd_branch_diff(int argc, const char **argv, const char *prefix) struct string_list branch1 = STRING_LIST_INIT_DUP; struct string_list branch2 = STRING_LIST_INIT_DUP; + git_diff_basic_config("diff.color.frag", "magenta", NULL); + diff_setup(&diffopt); diffopt.output_format = DIFF_FORMAT_PATCH; diffopt.flags.suppress_diff_headers = 1; -- 2.17.0.395.g6a618d6010f.dirty