Browse Source

Merge branch 'bw/diff-color-hunk-header'

maint
Junio C Hamano 15 years ago
parent
commit
b918eb6c2a
  1. 8
      Documentation/config.txt
  2. 5
      combine-diff.c
  3. 56
      diff.c
  4. 1
      diff.h
  5. 12
      t/t4034-diff-words.sh

8
Documentation/config.txt

@ -635,10 +635,10 @@ color.diff.<slot>:: @@ -635,10 +635,10 @@ color.diff.<slot>::
Use customized color for diff colorization. `<slot>` specifies
which part of the patch to use the specified color, and is one
of `plain` (context text), `meta` (metainformation), `frag`
(hunk header), `old` (removed lines), `new` (added lines),
`commit` (commit headers), or `whitespace` (highlighting
whitespace errors). The values of these variables may be specified as
in color.branch.<slot>.
(hunk header), 'func' (function in hunk header), `old` (removed lines),
`new` (added lines), `commit` (commit headers), or `whitespace`
(highlighting whitespace errors). The values of these variables may be
specified as in color.branch.<slot>.

color.grep::
When set to `always`, always highlight matches. When `false` (or

5
combine-diff.c

@ -524,6 +524,7 @@ static void dump_sline(struct sline *sline, unsigned long cnt, int num_parent, @@ -524,6 +524,7 @@ static void dump_sline(struct sline *sline, unsigned long cnt, int num_parent,
int i;
unsigned long lno = 0;
const char *c_frag = diff_get_color(use_color, DIFF_FRAGINFO);
const char *c_func = diff_get_color(use_color, DIFF_FUNCINFO);
const char *c_new = diff_get_color(use_color, DIFF_FILE_NEW);
const char *c_old = diff_get_color(use_color, DIFF_FILE_OLD);
const char *c_plain = diff_get_color(use_color, DIFF_PLAIN);
@ -588,7 +589,9 @@ static void dump_sline(struct sline *sline, unsigned long cnt, int num_parent, @@ -588,7 +589,9 @@ static void dump_sline(struct sline *sline, unsigned long cnt, int num_parent,
comment_end = i;
}
if (comment_end)
putchar(' ');
printf("%s%s %s%s", c_reset,
c_plain, c_reset,
c_func);
for (i = 0; i < comment_end; i++)
putchar(hunk_comment[i]);
}

56
diff.c

@ -39,6 +39,7 @@ static char diff_colors[][COLOR_MAXLEN] = { @@ -39,6 +39,7 @@ static char diff_colors[][COLOR_MAXLEN] = {
GIT_COLOR_GREEN, /* NEW */
GIT_COLOR_YELLOW, /* COMMIT */
GIT_COLOR_BG_RED, /* WHITESPACE */
GIT_COLOR_NORMAL, /* FUNCINFO */
};

static void diff_filespec_load_driver(struct diff_filespec *one);
@ -60,6 +61,8 @@ static int parse_diff_color_slot(const char *var, int ofs) @@ -60,6 +61,8 @@ static int parse_diff_color_slot(const char *var, int ofs)
return DIFF_COMMIT;
if (!strcasecmp(var+ofs, "whitespace"))
return DIFF_WHITESPACE;
if (!strcasecmp(var+ofs, "func"))
return DIFF_FUNCINFO;
die("bad config variable '%s'", var);
}

@ -295,12 +298,13 @@ static void emit_line_0(FILE *file, const char *set, const char *reset, @@ -295,12 +298,13 @@ static void emit_line_0(FILE *file, const char *set, const char *reset,
nofirst = 0;
}

fputs(set, file);

if (!nofirst)
fputc(first, file);
fwrite(line, len, 1, file);
fputs(reset, file);
if (len || !nofirst) {
fputs(set, file);
if (!nofirst)
fputc(first, file);
fwrite(line, len, 1, file);
fputs(reset, file);
}
if (has_trailing_carriage_return)
fputc('\r', file);
if (has_trailing_newline)
@ -344,6 +348,42 @@ static void emit_add_line(const char *reset, @@ -344,6 +348,42 @@ static void emit_add_line(const char *reset,
}
}

static void emit_hunk_header(struct emit_callback *ecbdata,
const char *line, int len)
{
const char *plain = diff_get_color(ecbdata->color_diff, DIFF_PLAIN);
const char *frag = diff_get_color(ecbdata->color_diff, DIFF_FRAGINFO);
const char *func = diff_get_color(ecbdata->color_diff, DIFF_FUNCINFO);
const char *reset = diff_get_color(ecbdata->color_diff, DIFF_RESET);
static const char atat[2] = { '@', '@' };
const char *cp, *ep;

/*
* As a hunk header must begin with "@@ -<old>, +<new> @@",
* it always is at least 10 bytes long.
*/
if (len < 10 ||
memcmp(line, atat, 2) ||
!(ep = memmem(line + 2, len - 2, atat, 2))) {
emit_line(ecbdata->file, plain, reset, line, len);
return;
}
ep += 2; /* skip over @@ */

/* The hunk header in fraginfo color */
emit_line(ecbdata->file, frag, reset, line, ep - line);

/* blank before the func header */
for (cp = ep; ep - line < len; ep++)
if (*ep != ' ' && *ep != '\t')
break;
if (ep != cp)
emit_line(ecbdata->file, plain, reset, cp, ep - cp);

if (ep < line + len)
emit_line(ecbdata->file, func, reset, ep, line + len - ep);
}

static struct diff_tempfile *claim_diff_tempfile(void) {
int i;
for (i = 0; i < ARRAY_SIZE(diff_temp); i++)
@ -781,9 +821,7 @@ static void fn_out_consume(void *priv, char *line, unsigned long len) @@ -781,9 +821,7 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)
diff_words_flush(ecbdata);
len = sane_truncate_line(ecbdata, line, len);
find_lno(line, ecbdata);
emit_line(ecbdata->file,
diff_get_color(ecbdata->color_diff, DIFF_FRAGINFO),
reset, line, len);
emit_hunk_header(ecbdata, line, len);
if (line[len-1] != '\n')
putc('\n', ecbdata->file);
return;

1
diff.h

@ -130,6 +130,7 @@ enum color_diff { @@ -130,6 +130,7 @@ enum color_diff {
DIFF_FILE_NEW = 5,
DIFF_COMMIT = 6,
DIFF_WHITESPACE = 7,
DIFF_FUNCINFO = 8,
};
const char *diff_get_color(int diff_use_color, enum color_diff ix);
#define diff_get_color_opt(o, ix) \

12
t/t4034-diff-words.sh

@ -8,6 +8,7 @@ test_expect_success setup ' @@ -8,6 +8,7 @@ test_expect_success setup '

git config diff.color.old red
git config diff.color.new green
git config diff.color.func magenta

'

@ -16,6 +17,7 @@ decrypt_color () { @@ -16,6 +17,7 @@ decrypt_color () {
-e 's/.\[1m/<WHITE>/g' \
-e 's/.\[31m/<RED>/g' \
-e 's/.\[32m/<GREEN>/g' \
-e 's/.\[35m/<MAGENTA>/g' \
-e 's/.\[36m/<BROWN>/g' \
-e 's/.\[m/<RESET>/g'
}
@ -49,7 +51,7 @@ cat > expect <<\EOF @@ -49,7 +51,7 @@ cat > expect <<\EOF
<WHITE>+++ b/post<RESET>
<BROWN>@@ -1,3 +1,7 @@<RESET>
<RED>h(4)<RESET><GREEN>h(4),hh[44]<RESET>
<RESET>

a = b + c<RESET>

<GREEN>aa = a<RESET>
@ -70,7 +72,7 @@ cat > expect <<\EOF @@ -70,7 +72,7 @@ cat > expect <<\EOF
<WHITE>+++ b/post<RESET>
<BROWN>@@ -1 +1 @@<RESET>
<RED>h(4)<RESET><GREEN>h(4),hh[44]<RESET>
<BROWN>@@ -3,0 +4,4 @@ a = b + c<RESET>
<BROWN>@@ -3,0 +4,4 @@<RESET> <RESET><MAGENTA>a = b + c<RESET>

<GREEN>aa = a<RESET>

@ -90,7 +92,7 @@ cat > expect <<\EOF @@ -90,7 +92,7 @@ cat > expect <<\EOF
<WHITE>+++ b/post<RESET>
<BROWN>@@ -1,3 +1,7 @@<RESET>
h(4),<GREEN>hh<RESET>[44]
<RESET>

a = b + c<RESET>

<GREEN>aa = a<RESET>
@ -126,7 +128,7 @@ cat > expect <<\EOF @@ -126,7 +128,7 @@ cat > expect <<\EOF
<WHITE>+++ b/post<RESET>
<BROWN>@@ -1,3 +1,7 @@<RESET>
h(4)<GREEN>,hh[44]<RESET>
<RESET>

a = b + c<RESET>

<GREEN>aa = a<RESET>
@ -168,7 +170,7 @@ cat > expect <<\EOF @@ -168,7 +170,7 @@ cat > expect <<\EOF
<WHITE>+++ b/post<RESET>
<BROWN>@@ -1,3 +1,7 @@<RESET>
h(4),<GREEN>hh[44<RESET>]
<RESET>

a = b + c<RESET>

<GREEN>aa = a<RESET>

Loading…
Cancel
Save