Skip to content

Commit 448598b

Browse files
committed
Merge branch 'bw/diff-metainfo-color'
* bw/diff-metainfo-color: diff: fix coloring of extended diff headers
2 parents 44e08b0 + 3746644 commit 448598b

File tree

1 file changed

+35
-26
lines changed

1 file changed

+35
-26
lines changed

diff.c

Lines changed: 35 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1706,21 +1706,21 @@ static void builtin_diff(const char *name_a,
17061706
if (lbl[0][0] == '/') {
17071707
/* /dev/null */
17081708
strbuf_addf(&header, "%snew file mode %06o%s\n", set, two->mode, reset);
1709-
if (xfrm_msg && xfrm_msg[0])
1710-
strbuf_addf(&header, "%s%s%s\n", set, xfrm_msg, reset);
1709+
if (xfrm_msg)
1710+
strbuf_addstr(&header, xfrm_msg);
17111711
}
17121712
else if (lbl[1][0] == '/') {
17131713
strbuf_addf(&header, "%sdeleted file mode %06o%s\n", set, one->mode, reset);
1714-
if (xfrm_msg && xfrm_msg[0])
1715-
strbuf_addf(&header, "%s%s%s\n", set, xfrm_msg, reset);
1714+
if (xfrm_msg)
1715+
strbuf_addstr(&header, xfrm_msg);
17161716
}
17171717
else {
17181718
if (one->mode != two->mode) {
17191719
strbuf_addf(&header, "%sold mode %06o%s\n", set, one->mode, reset);
17201720
strbuf_addf(&header, "%snew mode %06o%s\n", set, two->mode, reset);
17211721
}
1722-
if (xfrm_msg && xfrm_msg[0])
1723-
strbuf_addf(&header, "%s%s%s\n", set, xfrm_msg, reset);
1722+
if (xfrm_msg)
1723+
strbuf_addstr(&header, xfrm_msg);
17241724

17251725
/*
17261726
* we do not run diff between different kind
@@ -2379,30 +2379,36 @@ static void fill_metainfo(struct strbuf *msg,
23792379
struct diff_filespec *one,
23802380
struct diff_filespec *two,
23812381
struct diff_options *o,
2382-
struct diff_filepair *p)
2382+
struct diff_filepair *p,
2383+
int use_color)
23832384
{
2385+
const char *set = diff_get_color(use_color, DIFF_METAINFO);
2386+
const char *reset = diff_get_color(use_color, DIFF_RESET);
2387+
23842388
strbuf_init(msg, PATH_MAX * 2 + 300);
23852389
switch (p->status) {
23862390
case DIFF_STATUS_COPIED:
2387-
strbuf_addf(msg, "similarity index %d%%", similarity_index(p));
2388-
strbuf_addstr(msg, "\ncopy from ");
2391+
strbuf_addf(msg, "%ssimilarity index %d%%",
2392+
set, similarity_index(p));
2393+
strbuf_addf(msg, "%s\n%scopy from ", reset, set);
23892394
quote_c_style(name, msg, NULL, 0);
2390-
strbuf_addstr(msg, "\ncopy to ");
2395+
strbuf_addf(msg, "%s\n%scopy to ", reset, set);
23912396
quote_c_style(other, msg, NULL, 0);
2392-
strbuf_addch(msg, '\n');
2397+
strbuf_addf(msg, "%s\n", reset);
23932398
break;
23942399
case DIFF_STATUS_RENAMED:
2395-
strbuf_addf(msg, "similarity index %d%%", similarity_index(p));
2396-
strbuf_addstr(msg, "\nrename from ");
2400+
strbuf_addf(msg, "%ssimilarity index %d%%",
2401+
set, similarity_index(p));
2402+
strbuf_addf(msg, "%s\n%srename from ", reset, set);
23972403
quote_c_style(name, msg, NULL, 0);
2398-
strbuf_addstr(msg, "\nrename to ");
2404+
strbuf_addf(msg, "%s\n%srename to ", reset, set);
23992405
quote_c_style(other, msg, NULL, 0);
2400-
strbuf_addch(msg, '\n');
2406+
strbuf_addf(msg, "%s\n", reset);
24012407
break;
24022408
case DIFF_STATUS_MODIFIED:
24032409
if (p->score) {
2404-
strbuf_addf(msg, "dissimilarity index %d%%\n",
2405-
similarity_index(p));
2410+
strbuf_addf(msg, "%sdissimilarity index %d%%%s\n",
2411+
set, similarity_index(p), reset);
24062412
break;
24072413
}
24082414
/* fallthru */
@@ -2419,15 +2425,13 @@ static void fill_metainfo(struct strbuf *msg,
24192425
(!fill_mmfile(&mf, two) && diff_filespec_is_binary(two)))
24202426
abbrev = 40;
24212427
}
2422-
strbuf_addf(msg, "index %.*s..%.*s",
2428+
strbuf_addf(msg, "%sindex %.*s..%.*s", set,
24232429
abbrev, sha1_to_hex(one->sha1),
24242430
abbrev, sha1_to_hex(two->sha1));
24252431
if (one->mode == two->mode)
24262432
strbuf_addf(msg, " %06o", one->mode);
2427-
strbuf_addch(msg, '\n');
2433+
strbuf_addf(msg, "%s\n", reset);
24282434
}
2429-
if (msg->len)
2430-
strbuf_setlen(msg, msg->len - 1);
24312435
}
24322436

24332437
static void run_diff_cmd(const char *pgm,
@@ -2443,11 +2447,6 @@ static void run_diff_cmd(const char *pgm,
24432447
const char *xfrm_msg = NULL;
24442448
int complete_rewrite = (p->status == DIFF_STATUS_MODIFIED) && p->score;
24452449

2446-
if (msg) {
2447-
fill_metainfo(msg, name, other, one, two, o, p);
2448-
xfrm_msg = msg->len ? msg->buf : NULL;
2449-
}
2450-
24512450
if (!DIFF_OPT_TST(o, ALLOW_EXTERNAL))
24522451
pgm = NULL;
24532452
else {
@@ -2456,6 +2455,16 @@ static void run_diff_cmd(const char *pgm,
24562455
pgm = drv->external;
24572456
}
24582457

2458+
if (msg) {
2459+
/*
2460+
* don't use colors when the header is intended for an
2461+
* external diff driver
2462+
*/
2463+
fill_metainfo(msg, name, other, one, two, o, p,
2464+
DIFF_OPT_TST(o, COLOR_DIFF) && !pgm);
2465+
xfrm_msg = msg->len ? msg->buf : NULL;
2466+
}
2467+
24592468
if (pgm) {
24602469
run_external_diff(pgm, name, other, one, two, xfrm_msg,
24612470
complete_rewrite);

0 commit comments

Comments
 (0)