diff.c: emit_diff_symbol learns DIFF_SYMBOL_HEADER

The header is constructed lazily including line breaks, so just emit the raw string as is. Signed-off-by: Stefan Beller <sbeller@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Stefan Beller committed Jun 29, 2017 at 17:06 UTC a29b0a13bd9a3708918808e75ca368f91905d2fe
1 file changed +20 -8
diff.c
+20 -8
@@ -561,6 +561,7 @@ static void emit_line(struct diff_options *o, const char *set, const char *reset
561 }
562
563 enum diff_symbol {
564 + DIFF_SYMBOL_HEADER,
565 DIFF_SYMBOL_FILEPAIR_PLUS,
566 DIFF_SYMBOL_FILEPAIR_MINUS,
567 DIFF_SYMBOL_WORDS_PORCELAIN,
@@ -689,6 +690,9 @@ static void emit_diff_symbol(struct diff_options *o, enum diff_symbol s,
690 line, reset,
691 strchr(line, ' ') ? "\t" : "");
692 break;
693 + case DIFF_SYMBOL_HEADER:
694 + fprintf(o->file, "%s", line);
695 + break;
696 default:
697 die("BUG: unknown diff symbol");
698 }
@@ -1385,7 +1389,8 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)
1389 o->found_changes = 1;
1390
1391 if (ecbdata->header) {
1388 - fprintf(o->file, "%s", ecbdata->header->buf);
1392 + emit_diff_symbol(o, DIFF_SYMBOL_HEADER,
1393 + ecbdata->header->buf, ecbdata->header->len, 0);
1394 strbuf_reset(ecbdata->header);
1395 ecbdata->header = NULL;
1396 }
@@ -2519,7 +2524,8 @@ static void builtin_diff(const char *name_a,
2524 if (complete_rewrite &&
2525 (textconv_one || !diff_filespec_is_binary(one)) &&
2526 (textconv_two || !diff_filespec_is_binary(two))) {
2522 - fprintf(o->file, "%s", header.buf);
2527 + emit_diff_symbol(o, DIFF_SYMBOL_HEADER,
2528 + header.buf, header.len, 0);
2529 strbuf_reset(&header);
2530 emit_rewrite_diff(name_a, name_b, one, two,
2531 textconv_one, textconv_two, o);
@@ -2529,7 +2535,8 @@ static void builtin_diff(const char *name_a,
2535 }
2536
2537 if (o->irreversible_delete && lbl[1][0] == '/') {
2532 - fprintf(o->file, "%s", header.buf);
2538 + emit_diff_symbol(o, DIFF_SYMBOL_HEADER, header.buf,
2539 + header.len, 0);
2540 strbuf_reset(&header);
2541 goto free_ab_and_return;
2542 } else if (!DIFF_OPT_TST(o, TEXT) &&
@@ -2540,10 +2547,13 @@ static void builtin_diff(const char *name_a,
2547 !DIFF_OPT_TST(o, BINARY)) {
2548 if (!oidcmp(&one->oid, &two->oid)) {
2549 if (must_show_header)
2543 - fprintf(o->file, "%s", header.buf);
2550 + emit_diff_symbol(o, DIFF_SYMBOL_HEADER,
2551 + header.buf, header.len,
2552 + 0);
2553 goto free_ab_and_return;
2554 }
2546 - fprintf(o->file, "%s", header.buf);
2555 + emit_diff_symbol(o, DIFF_SYMBOL_HEADER,
2556 + header.buf, header.len, 0);
2557 fprintf(o->file, "%sBinary files %s and %s differ\n",
2558 line_prefix, lbl[0], lbl[1]);
2559 goto free_ab_and_return;
@@ -2554,10 +2564,11 @@ static void builtin_diff(const char *name_a,
2564 if (mf1.size == mf2.size &&
2565 !memcmp(mf1.ptr, mf2.ptr, mf1.size)) {
2566 if (must_show_header)
2557 - fprintf(o->file, "%s", header.buf);
2567 + emit_diff_symbol(o, DIFF_SYMBOL_HEADER,
2568 + header.buf, header.len, 0);
2569 goto free_ab_and_return;
2570 }
2560 - fprintf(o->file, "%s", header.buf);
2571 + emit_diff_symbol(o, DIFF_SYMBOL_HEADER, header.buf, header.len, 0);
2572 strbuf_reset(&header);
2573 if (DIFF_OPT_TST(o, BINARY))
2574 emit_binary_diff(o->file, &mf1, &mf2, line_prefix);
@@ -2575,7 +2586,8 @@ static void builtin_diff(const char *name_a,
2586 const struct userdiff_funcname *pe;
2587
2588 if (must_show_header) {
2578 - fprintf(o->file, "%s", header.buf);
2589 + emit_diff_symbol(o, DIFF_SYMBOL_HEADER,
2590 + header.buf, header.len, 0);
2591 strbuf_reset(&header);
2592 }
2593