Skip to content

Commit e129a23

Browse files
committed
Merge branch 'sb/range-diff-colors' into pu
* sb/range-diff-colors: fixup! t3206: add color test for range-diff --dual-color diff.c: rewrite emit_line_0 more understandably diff.c: compute reverse locally in emit_line_0 diff: use emit_line_0 once per line diff.c: add set_sign to emit_line_0 diff.c: reorder arguments for emit_line_ws_markup diff.c: simplify caller of emit_line_0 t3206: add color test for range-diff --dual-color test_decode_color: understand FAINT and ITALIC
2 parents bcb11b4 + c1b144e commit e129a23

File tree

3 files changed

+93
-42
lines changed

3 files changed

+93
-42
lines changed

diff.c

Lines changed: 52 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -624,42 +624,56 @@ static void check_blank_at_eof(mmfile_t *mf1, mmfile_t *mf2,
624624
}
625625

626626
static void emit_line_0(struct diff_options *o,
627-
const char *set, unsigned reverse, const char *reset,
627+
const char *set_sign, const char *set, const char *reset,
628628
int first, const char *line, int len)
629629
{
630630
int has_trailing_newline, has_trailing_carriage_return;
631-
int nofirst;
631+
int reverse = !!set && !!set_sign;
632+
int needs_reset = 0;
633+
632634
FILE *file = o->file;
633635

634-
if (first)
635-
fputs(diff_line_prefix(o), file);
636-
else if (!len)
637-
return;
636+
fputs(diff_line_prefix(o), file);
638637

639-
if (len == 0) {
640-
has_trailing_newline = (first == '\n');
641-
has_trailing_carriage_return = (!has_trailing_newline &&
642-
(first == '\r'));
643-
nofirst = has_trailing_newline || has_trailing_carriage_return;
644-
} else {
645-
has_trailing_newline = (len > 0 && line[len-1] == '\n');
646-
if (has_trailing_newline)
647-
len--;
648-
has_trailing_carriage_return = (len > 0 && line[len-1] == '\r');
649-
if (has_trailing_carriage_return)
650-
len--;
651-
nofirst = 0;
638+
has_trailing_newline = (len > 0 && line[len-1] == '\n');
639+
if (has_trailing_newline)
640+
len--;
641+
642+
has_trailing_carriage_return = (len > 0 && line[len-1] == '\r');
643+
if (has_trailing_carriage_return)
644+
len--;
645+
646+
if (!len && !first)
647+
goto end_of_line;
648+
649+
if (reverse && want_color(o->use_color)) {
650+
fputs(GIT_COLOR_REVERSE, file);
651+
needs_reset = 1;
652+
}
653+
654+
if (set_sign || set) {
655+
fputs(set_sign ? set_sign : set, file);
656+
needs_reset = 1;
652657
}
653658

654-
if (len || !nofirst) {
655-
if (reverse && want_color(o->use_color))
656-
fputs(GIT_COLOR_REVERSE, file);
659+
if (first)
660+
fputc(first, file);
661+
662+
if (!len)
663+
goto end_of_line;
664+
665+
if (set) {
666+
if (set_sign && set != set_sign)
667+
fputs(reset, file);
657668
fputs(set, file);
658-
if (first && !nofirst)
659-
fputc(first, file);
660-
fwrite(line, len, 1, file);
661-
fputs(reset, file);
669+
needs_reset = 1;
662670
}
671+
fwrite(line, len, 1, file);
672+
needs_reset |= len > 0;
673+
674+
end_of_line:
675+
if (needs_reset)
676+
fputs(reset, file);
663677
if (has_trailing_carriage_return)
664678
fputc('\r', file);
665679
if (has_trailing_newline)
@@ -669,7 +683,7 @@ static void emit_line_0(struct diff_options *o,
669683
static void emit_line(struct diff_options *o, const char *set, const char *reset,
670684
const char *line, int len)
671685
{
672-
emit_line_0(o, set, 0, reset, line[0], line+1, len-1);
686+
emit_line_0(o, set, NULL, reset, 0, line, len);
673687
}
674688

675689
enum diff_symbol {
@@ -1187,9 +1201,9 @@ static void dim_moved_lines(struct diff_options *o)
11871201
}
11881202

11891203
static void emit_line_ws_markup(struct diff_options *o,
1190-
const char *set, const char *reset,
1191-
const char *line, int len,
1192-
const char *set_sign, char sign,
1204+
const char *set_sign, const char *set,
1205+
const char *reset,
1206+
char sign, const char *line, int len,
11931207
unsigned ws_rule, int blank_at_eof)
11941208
{
11951209
const char *ws = NULL;
@@ -1201,19 +1215,15 @@ static void emit_line_ws_markup(struct diff_options *o,
12011215
}
12021216

12031217
if (!ws && !set_sign)
1204-
emit_line_0(o, set, 0, reset, sign, line, len);
1218+
emit_line_0(o, set, NULL, reset, sign, line, len);
12051219
else if (!ws) {
1206-
/* Emit just the prefix, then the rest. */
1207-
emit_line_0(o, set_sign ? set_sign : set, !!set_sign, reset,
1208-
sign, "", 0);
1209-
emit_line_0(o, set, 0, reset, 0, line, len);
1220+
emit_line_0(o, set_sign, set, reset, sign, line, len);
12101221
} else if (blank_at_eof)
12111222
/* Blank line at EOF - paint '+' as well */
1212-
emit_line_0(o, ws, 0, reset, sign, line, len);
1223+
emit_line_0(o, ws, NULL, reset, sign, line, len);
12131224
else {
12141225
/* Emit just the prefix, then the rest. */
1215-
emit_line_0(o, set_sign ? set_sign : set, !!set_sign, reset,
1216-
sign, "", 0);
1226+
emit_line_0(o, set_sign, set, reset, sign, "", 0);
12171227
ws_check_emit(line, len, ws_rule,
12181228
o->file, set, reset, ws);
12191229
}
@@ -1236,7 +1246,7 @@ static void emit_diff_symbol_from_struct(struct diff_options *o,
12361246
context = diff_get_color_opt(o, DIFF_CONTEXT);
12371247
reset = diff_get_color_opt(o, DIFF_RESET);
12381248
putc('\n', o->file);
1239-
emit_line_0(o, context, 0, reset, '\\',
1249+
emit_line_0(o, context, NULL, reset, '\\',
12401250
nneof, strlen(nneof));
12411251
break;
12421252
case DIFF_SYMBOL_SUBMODULE_HEADER:
@@ -1274,7 +1284,7 @@ static void emit_diff_symbol_from_struct(struct diff_options *o,
12741284
else if (c == '-')
12751285
set = diff_get_color_opt(o, DIFF_FILE_OLD);
12761286
}
1277-
emit_line_ws_markup(o, set, reset, line, len, set_sign, ' ',
1287+
emit_line_ws_markup(o, set_sign, set, reset, ' ', line, len,
12781288
flags & (DIFF_SYMBOL_CONTENT_WS_MASK), 0);
12791289
break;
12801290
case DIFF_SYMBOL_PLUS:
@@ -1317,7 +1327,7 @@ static void emit_diff_symbol_from_struct(struct diff_options *o,
13171327
set = diff_get_color_opt(o, DIFF_CONTEXT_BOLD);
13181328
flags |= WS_IGNORE_FIRST_SPACE;
13191329
}
1320-
emit_line_ws_markup(o, set, reset, line, len, set_sign, '+',
1330+
emit_line_ws_markup(o, set_sign, set, reset, '+', line, len,
13211331
flags & DIFF_SYMBOL_CONTENT_WS_MASK,
13221332
flags & DIFF_SYMBOL_CONTENT_BLANK_LINE_EOF);
13231333
break;
@@ -1360,7 +1370,7 @@ static void emit_diff_symbol_from_struct(struct diff_options *o,
13601370
else
13611371
set = diff_get_color_opt(o, DIFF_CONTEXT_DIM);
13621372
}
1363-
emit_line_ws_markup(o, set, reset, line, len, set_sign, '-',
1373+
emit_line_ws_markup(o, set_sign, set, reset, '-', line, len,
13641374
flags & DIFF_SYMBOL_CONTENT_WS_MASK, 0);
13651375
break;
13661376
case DIFF_SYMBOL_WORDS_PORCELAIN:

t/t3206-range-diff.sh

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,4 +154,43 @@ do
154154
'
155155
done
156156

157+
test_expect_success 'dual-coloring' '
158+
sed -e "s|^:||" >expect <<-\EOF &&
159+
:<YELLOW>1: a4b3333 = 1: f686024 s/5/A/<RESET>
160+
:<RED>2: f51d370 <RESET><YELLOW>!<RESET><GREEN> 2: 4ab067d<RESET><YELLOW> s/4/A/<RESET>
161+
: <REVERSE><CYAN>@@ -2,6 +2,8 @@<RESET>
162+
: <RESET>
163+
: s/4/A/<RESET>
164+
: <RESET>
165+
: <REVERSE><GREEN>+<RESET> <BOLD> Also a silly comment here!<RESET>
166+
: <REVERSE><GREEN>+<RESET>
167+
: diff --git a/file b/file<RESET>
168+
: <RED> --- a/file<RESET>
169+
: <GREEN> +++ b/file<RESET>
170+
:<RED>3: 0559556 <RESET><YELLOW>!<RESET><GREEN> 3: b9cb956<RESET><YELLOW> s/11/B/<RESET>
171+
: <REVERSE><CYAN>@@ -10,7 +10,7 @@<RESET>
172+
: 9<RESET>
173+
: 10<RESET>
174+
: <RED> -11<RESET>
175+
: <REVERSE><RED>-<RESET><FAINT;GREEN>+BB<RESET>
176+
: <REVERSE><GREEN>+<RESET><BOLD;GREEN>+B<RESET>
177+
: 12<RESET>
178+
: 13<RESET>
179+
: 14<RESET>
180+
:<RED>4: d966c5c <RESET><YELLOW>!<RESET><GREEN> 4: 8add5f1<RESET><YELLOW> s/12/B/<RESET>
181+
: <REVERSE><CYAN>@@ -8,7 +8,7 @@<RESET>
182+
: <CYAN> @@<RESET>
183+
: 9<RESET>
184+
: 10<RESET>
185+
: <REVERSE><RED>-<RESET><FAINT> BB<RESET>
186+
: <REVERSE><GREEN>+<RESET> <BOLD>B<RESET>
187+
: <RED> -12<RESET>
188+
: <GREEN> +B<RESET>
189+
: 13<RESET>
190+
EOF
191+
git range-diff changed...changed-message --color --dual-color >actual.raw &&
192+
test_decode_color >actual <actual.raw &&
193+
test_cmp expect actual
194+
'
195+
157196
test_done

t/test-lib-functions.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ test_decode_color () {
4242
function name(n) {
4343
if (n == 0) return "RESET";
4444
if (n == 1) return "BOLD";
45+
if (n == 2) return "FAINT";
46+
if (n == 3) return "ITALIC";
4547
if (n == 7) return "REVERSE";
4648
if (n == 30) return "BLACK";
4749
if (n == 31) return "RED";

0 commit comments

Comments
 (0)