From: Stefan Beller <sbeller@google.com>
To: gitster@pobox.com
Cc: git@vger.kernel.org, bmwill@google.com, jrnieder@gmail.com,
peff@peff.net, mhagger@alum.mit.edu, jonathantanmy@google.com,
Stefan Beller <sbeller@google.com>
Subject: [PATCH 0/1] Diff machine: highlight moved lines.
Date: Fri, 26 May 2017 17:18:19 -0700 [thread overview]
Message-ID: <20170527001820.25214-1-sbeller@google.com> (raw)
In-Reply-To: <CAGZ79kbD6QggYH9+M8FM0Khg7Cs0egJR6Jm+kMJkscaANV6UXA@mail.gmail.com>
This is a new version of the latest patch of sb/diff-color-move.
It seems as if different people prefer different settings for the
boundary/alternate coloring, so let's have all of them. (As the
block detection is rather simple we do not need a lot of overhead
to support multiple modes).
With more tests:
* for each mode;
* check that diff.colorMoved is respected
And it is documented as well.
Thanks,
Stefan
Stefan Beller (1):
diff.c: color moved lines differently
Documentation/config.txt | 10 +-
Documentation/diff-options.txt | 32 ++++
color.h | 2 +
diff.c | 342 +++++++++++++++++++++++++++++++++++--
diff.h | 15 +-
t/t4015-diff-whitespace.sh | 373 +++++++++++++++++++++++++++++++++++++++++
6 files changed, 760 insertions(+), 14 deletions(-)
Interdiff to what Junio has queued:
diff --git a/Documentation/config.txt b/Documentation/config.txt
index 902d017c3b..73511a4603 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -1051,12 +1051,9 @@ This does not affect linkgit:git-format-patch[1] or the
'git-diff-{asterisk}' plumbing commands. Can be overridden on the
command line with the `--color[=<when>]` option.
-color.moved::
- A boolean value, whether a diff should color moved lines
- differently. The moved lines are searched for in the diff only.
- Duplicated lines from somewhere in the project that are not
- part of the diff are not colored as moved.
- Defaults to false.
+diff.colorMoved::
+ If set moved lines in a diff are colored differently,
+ for details see '--color-moved' in linkgit:git-diff[1].
color.diff.<slot>::
Use customized color for diff colorization. `<slot>` specifies
@@ -1065,10 +1062,9 @@ color.diff.<slot>::
`meta` (metainformation), `frag`
(hunk header), 'func' (function in hunk header), `old` (removed lines),
`new` (added lines), `commit` (commit headers), `whitespace`
- (highlighting whitespace errors), `oldMoved` (removed lines that
- reappear), `newMoved` (added lines that were removed elsewhere),
- `oldMovedAlternative` and `newMovedAlternative` (as a fallback to
- cover adjacent blocks of moved code)
+ (highlighting whitespace errors), `oldMoved`, `newMoved`,
+ `oldMovedAlternative` and `newMovedAlternative` (See the '<mode>'
+ setting of '--color-moved' in linkgit:git-diff[1] for details).
color.decorate.<slot>::
Use customized color for 'git log --decorate' output. `<slot>` is one
diff --git a/Documentation/diff-options.txt b/Documentation/diff-options.txt
index 89cc0f48de..25259dbbc3 100644
--- a/Documentation/diff-options.txt
+++ b/Documentation/diff-options.txt
@@ -231,6 +231,38 @@ ifdef::git-diff[]
endif::git-diff[]
It is the same as `--color=never`.
+--color-moved[=<mode>]::
+ Moved lines of code are colored differently.
+ifdef::git-diff[]
+ It can be changed by the `diff.colorMoved` configuration setting.
+endif::git-diff[]
+ The <mode> defaults to 'no' if the option is not given
+ and to 'adjacentbounds' if the option with no mode is given.
+ The mode must be one of:
++
+--
+no::
+ Moved lines are not highlighted.
+nobounds::
+ Any line that is added in on location and was removed
+ in another location will be colored with 'color.diff.newmoved'.
+ Any line that is removed in on location and was added
+ in another location will be colored with 'color.diff.oldmoved'.
+allbounds::
+ Based on 'nobounds'. Additionally blocks of moved code are
+ detected and the first and last line of a block will be highlighted
+ using 'color.diff.newMovedAlternate' or
+ 'color.diff.oldMovedAlternate'.
+adjacentbounds::
+ The same as 'allbounds' except that highlighting is only performed
+ at adjacent block boundaries of blocks that have the same sign.
+alternate::
+ Based on 'nobounds'. Additionally blocks of moved code are
+ detected. If moved blocks are adjacent mark one of them with the
+ alternative move color using 'color.diff.newMovedAlternate' or
+ 'color.diff.oldMovedAlternate'.
+--
+
--word-diff[=<mode>]::
Show a word diff, using the <mode> to delimit changed words.
By default, words are delimited by whitespace; see
diff --git a/color.h b/color.h
index 90627650fc..04b3b87929 100644
--- a/color.h
+++ b/color.h
@@ -42,6 +42,8 @@ struct strbuf;
#define GIT_COLOR_BG_BLUE "\033[44m"
#define GIT_COLOR_BG_MAGENTA "\033[45m"
#define GIT_COLOR_BG_CYAN "\033[46m"
+#define GIT_COLOR_DI_IT_CYAN "\033[2;3;36m"
+#define GIT_COLOR_DI_IT_MAGENTA "\033[2;3;35m"
/* A special value meaning "no color selected" */
#define GIT_COLOR_NIL "NIL"
diff --git a/diff.c b/diff.c
index 40cccafb67..efd2530a89 100644
--- a/diff.c
+++ b/diff.c
@@ -56,10 +56,10 @@ static char diff_colors[][COLOR_MAXLEN] = {
GIT_COLOR_YELLOW, /* COMMIT */
GIT_COLOR_BG_RED, /* WHITESPACE */
GIT_COLOR_NORMAL, /* FUNCINFO */
- GIT_COLOR_BOLD_RED, /* OLD_MOVED_A */
- GIT_COLOR_BG_RED, /* OLD_MOVED_B */
- GIT_COLOR_BOLD_GREEN, /* NEW_MOVED_A */
- GIT_COLOR_BG_GREEN, /* NEW_MOVED_B */
+ GIT_COLOR_DI_IT_MAGENTA,/* OLD_MOVED */
+ GIT_COLOR_BG_RED, /* OLD_MOVED ALTERNATIVE */
+ GIT_COLOR_DI_IT_CYAN, /* NEW_MOVED */
+ GIT_COLOR_BG_GREEN, /* NEW_MOVED ALTERNATIVE */
};
static NORETURN void die_want_option(const char *option_name)
@@ -241,14 +241,33 @@ int git_diff_heuristic_config(const char *var, const char *value, void *cb)
return 0;
}
+static int parse_color_moved(const char *arg)
+{
+ if (!strcmp(arg, "no"))
+ return MOVED_LINES_NO;
+ else if (!strcmp(arg, "nobounds"))
+ return MOVED_LINES_BOUNDARY_NO;
+ else if (!strcmp(arg, "allbounds"))
+ return MOVED_LINES_BOUNDARY_ALL;
+ else if (!strcmp(arg, "adjacentbounds"))
+ return MOVED_LINES_BOUNDARY_ADJACENT;
+ else if (!strcmp(arg, "alternate"))
+ return MOVED_LINES_ALTERNATE;
+ else
+ return -1;
+}
+
int git_diff_ui_config(const char *var, const char *value, void *cb)
{
if (!strcmp(var, "diff.color") || !strcmp(var, "color.diff")) {
diff_use_color_default = git_config_colorbool(var, value);
return 0;
}
- if (!strcmp(var, "color.moved")) {
- diff_color_moved_default = git_config_bool(var, value);
+ if (!strcmp(var, "diff.colormoved")) {
+ int cm = parse_color_moved(value);
+ if (cm < 0)
+ return -1;
+ diff_color_moved_default = cm;
return 0;
}
if (!strcmp(var, "diff.context")) {
@@ -652,41 +671,69 @@ static void add_lines_to_move_detection(struct diff_options *o,
}
}
+static void mark_color_as_moved_single_line(struct diff_options *o,
+ struct diff_line *l, int alt_color)
+{
+ switch (l->sign) {
+ case '+':
+ l->set = diff_get_color_opt(o,
+ DIFF_FILE_NEW_MOVED + alt_color);
+ break;
+ case '-':
+ l->set = diff_get_color_opt(o,
+ DIFF_FILE_OLD_MOVED + alt_color);
+ break;
+ default:
+ die("BUG: we should have continued earlier?");
+ }
+}
+
static void mark_color_as_moved(struct diff_options *o,
struct hashmap *add_lines,
struct hashmap *del_lines)
{
struct moved_entry **pmb = NULL; /* potentially moved blocks */
+ struct diff_line *prev_line = NULL;
int pmb_nr = 0, pmb_alloc = 0;
- int use_alt_color = 0;
- int n;
+ int n, flipped_block = 0;
for (n = 0; n < o->line_buffer_nr; n++) {
struct hashmap *hm = NULL;
struct moved_entry *key;
struct moved_entry *match = NULL;
struct diff_line *l = &o->line_buffer[n];
- int i, lp, rp;
+ int i, lp, rp, adjacent_blocks = 0;
+ /* Check for any match to color it as a move. */
switch (l->sign) {
case '+':
hm = del_lines;
+ key = prepare_entry(o, n);
+ match = hashmap_get(hm, key, o);
+ free(key);
break;
case '-':
hm = add_lines;
+ key = prepare_entry(o, n);
+ match = hashmap_get(hm, key, o);
+ free(key);
break;
- default:
- use_alt_color = 0;
- pmb_nr = 0; /* no running sets */
+ default: ;
+ }
+
+ if (!match) {
+ pmb_nr = 0;
+ if (prev_line &&
+ o->color_moved == MOVED_LINES_BOUNDARY_ALL)
+ mark_color_as_moved_single_line(o, prev_line, 1);
+ prev_line = NULL;
continue;
}
- /* Check for any match to color it as a move. */
- key = prepare_entry(o, n);
- match = hashmap_get(hm, key, o);
- free(key);
- if (!match)
+ if (o->color_moved == MOVED_LINES_BOUNDARY_NO) {
+ mark_color_as_moved_single_line(o, l, 0);
continue;
+ }
/* Check any potential block runs, advance each or nullify */
for (i = 0; i < pmb_nr; i++) {
@@ -701,7 +748,7 @@ static void mark_color_as_moved(struct diff_options *o,
}
}
- /* Shrink the set to the remaining runs */
+ /* Shrink the set of potential block to the remaining running */
for (lp = 0, rp = pmb_nr - 1; lp <= rp;) {
while (lp < pmb_nr && pmb[lp])
lp++;
@@ -719,34 +766,44 @@ static void mark_color_as_moved(struct diff_options *o,
}
}
- if (rp > -1) {
- /* Remember the number of running sets */
- pmb_nr = rp + 1;
- } else {
- /* Toggle color */
- use_alt_color = (use_alt_color + 1) % 2;
+ /* Remember the number of running sets */
+ pmb_nr = rp + 1;
- /* Build up a new set */
- pmb_nr = 0;
+ if (pmb_nr == 0) {
+ /*
+ * This line is the start of a new block.
+ * Setup the set of potential blocks.
+ */
for (; match; match = hashmap_get_next(hm, match)) {
ALLOC_GROW(pmb, pmb_nr + 1, pmb_alloc);
pmb[pmb_nr++] = match;
}
+
+ if (o->color_moved == MOVED_LINES_BOUNDARY_ALL) {
+ adjacent_blocks = 1;
+ } else {
+ /* Check if two blocks are adjacent */
+ adjacent_blocks = prev_line &&
+ prev_line->sign == l->sign;
+ }
}
- switch (l->sign) {
- case '+':
- l->set = diff_get_color_opt(o,
- DIFF_FILE_NEW_MOVED + use_alt_color);
- break;
- case '-':
- l->set = diff_get_color_opt(o,
- DIFF_FILE_OLD_MOVED + use_alt_color);
- break;
- default:
- die("BUG: we should have continued earlier?");
+ if (o->color_moved == MOVED_LINES_ALTERNATE) {
+ if (adjacent_blocks)
+ flipped_block = (flipped_block + 1) % 2;
+ mark_color_as_moved_single_line(o, l, flipped_block);
+ } else {
+ /* MOVED_LINES_BOUNDARY_{ADJACENT, ALL} */
+ mark_color_as_moved_single_line(o, l, adjacent_blocks);
+ if (adjacent_blocks && prev_line)
+ prev_line->set = l->set;
}
+
+ prev_line = l;
}
+ if (prev_line && o->color_moved == MOVED_LINES_BOUNDARY_ALL)
+ mark_color_as_moved_single_line(o, prev_line, 1);
+
free(pmb);
}
@@ -4291,10 +4348,18 @@ int diff_opt_parse(struct diff_options *options,
else if (!strcmp(arg, "--no-color"))
options->use_color = 0;
else if (!strcmp(arg, "--color-moved"))
- options->color_moved = 1;
+ if (diff_color_moved_default)
+ options->color_moved = diff_color_moved_default;
+ else
+ options->color_moved = MOVED_LINES_BOUNDARY_ADJACENT;
else if (!strcmp(arg, "--no-color-moved"))
- options->color_moved = 0;
- else if (!strcmp(arg, "--color-words")) {
+ options->color_moved = MOVED_LINES_NO;
+ else if (skip_prefix(arg, "--color-moved=", &arg)) {
+ int cm = parse_color_moved(arg);
+ if (cm < 0)
+ die("bad --color-moved argument: %s", arg);
+ options->color_moved = cm;
+ } else if (!strcmp(arg, "--color-words")) {
options->use_color = 1;
options->word_diff = DIFF_WORDS_COLOR;
}
diff --git a/diff.h b/diff.h
index c6d806c6b5..d9fbafd383 100644
--- a/diff.h
+++ b/diff.h
@@ -230,7 +230,13 @@ struct diff_options {
struct diff_line *line_buffer;
int line_buffer_nr, line_buffer_alloc;
- int color_moved;
+ enum {
+ MOVED_LINES_NO = 0,
+ MOVED_LINES_BOUNDARY_NO = 1,
+ MOVED_LINES_BOUNDARY_ALL = 2,
+ MOVED_LINES_BOUNDARY_ADJACENT = 3,
+ MOVED_LINES_ALTERNATE = 4,
+ } color_moved;
};
/* Emit [line_prefix] [set] line [reset] */
diff --git a/t/t4015-diff-whitespace.sh b/t/t4015-diff-whitespace.sh
index 0e92bf94bf..d4bd082af7 100755
--- a/t/t4015-diff-whitespace.sh
+++ b/t/t4015-diff-whitespace.sh
@@ -984,6 +984,8 @@ test_expect_success 'detect moved code, complete file' '
git add test.c &&
git commit -m "add main function" &&
git mv test.c main.c &&
+ test_config color.diff.oldMoved "normal red" &&
+ test_config color.diff.newMoved "normal green" &&
git diff HEAD --color-moved --no-renames | test_decode_color >actual &&
cat >expected <<-\EOF &&
<BOLD>diff --git a/main.c b/main.c<RESET>
@@ -1081,6 +1083,10 @@ test_expect_success 'detect moved code, inside file' '
bar();
}
EOF
+ test_config color.diff.oldMoved "normal red" &&
+ test_config color.diff.newMoved "normal green" &&
+ test_config color.diff.oldMovedAlternative "bold red" &&
+ test_config color.diff.newMovedAlternative "bold green" &&
git diff HEAD --no-renames --color-moved| test_decode_color >actual &&
cat <<-\EOF >expected &&
<BOLD>diff --git a/main.c b/main.c<RESET>
@@ -1125,79 +1131,179 @@ test_expect_success 'detect moved code, inside file' '
'
test_expect_success 'detect permutations inside moved code' '
- # reusing the move example from last test:
- cat <<-\EOF >main.c &&
- #include<stdio.h>
- int stuff()
- {
- printf("Hello ");
- printf("World\n");
- }
-
- int main()
- {
- foo();
- }
+ git reset --hard &&
+ cat <<-\EOF >lines.txt &&
+ line 1
+ line 2
+ line 3
+ line 4
+ line 5
+ line 6
+ line 7
+ line 8
+ line 9
+ line 10
+ line 11
+ line 12
+ line 13
+ line 14
+ line 15
+ line 16
EOF
- cat <<-\EOF >test.c &&
- #include<stdio.h>
- int bar()
- {
- printf("Hello World, but different\n");
- }
+ git add lines.txt &&
+ git commit -m "add poetry" &&
+ cat <<-\EOF >lines.txt &&
+ line 4
+ line 5
+ line 6
+ line 7
+ line 8
+ line 9
+ line 1
+ line 2
+ line 3
+ line 14
+ line 15
+ line 16
+ line 10
+ line 11
+ line 12
+ line 13
+ EOF
+ test_config color.diff.oldMoved "magenta" &&
+ test_config color.diff.newMoved "cyan" &&
+ test_config color.diff.oldMovedAlternative "blue" &&
+ test_config color.diff.newMovedAlternative "yellow" &&
- int secure_foo(struct user *u)
- {
- foo(u);
- if (!u->is_allowed_foo)
- return;
- }
- int another_function()
- {
- bar();
- }
+ git diff HEAD --no-renames --color-moved=nobounds| test_decode_color >actual &&
+ cat <<-\EOF >expected &&
+ <BOLD>diff --git a/lines.txt b/lines.txt<RESET>
+ <BOLD>index 47ea9c3..ba96a38 100644<RESET>
+ <BOLD>--- a/lines.txt<RESET>
+ <BOLD>+++ b/lines.txt<RESET>
+ <CYAN>@@ -1,16 +1,16 @@<RESET>
+ <MAGENTA>-line 1<RESET>
+ <MAGENTA>-line 2<RESET>
+ <MAGENTA>-line 3<RESET>
+ line 4<RESET>
+ line 5<RESET>
+ line 6<RESET>
+ line 7<RESET>
+ line 8<RESET>
+ line 9<RESET>
+ <CYAN>+<RESET><CYAN>line 1<RESET>
+ <CYAN>+<RESET><CYAN>line 2<RESET>
+ <CYAN>+<RESET><CYAN>line 3<RESET>
+ <CYAN>+<RESET><CYAN>line 14<RESET>
+ <CYAN>+<RESET><CYAN>line 15<RESET>
+ <CYAN>+<RESET><CYAN>line 16<RESET>
+ line 10<RESET>
+ line 11<RESET>
+ line 12<RESET>
+ line 13<RESET>
+ <MAGENTA>-line 14<RESET>
+ <MAGENTA>-line 15<RESET>
+ <MAGENTA>-line 16<RESET>
+ EOF
+ test_cmp expected actual &&
+
+ git diff HEAD --no-renames --color-moved=adjacentbounds| test_decode_color >actual &&
+ cat <<-\EOF >expected &&
+ <BOLD>diff --git a/lines.txt b/lines.txt<RESET>
+ <BOLD>index 47ea9c3..ba96a38 100644<RESET>
+ <BOLD>--- a/lines.txt<RESET>
+ <BOLD>+++ b/lines.txt<RESET>
+ <CYAN>@@ -1,16 +1,16 @@<RESET>
+ <MAGENTA>-line 1<RESET>
+ <MAGENTA>-line 2<RESET>
+ <MAGENTA>-line 3<RESET>
+ line 4<RESET>
+ line 5<RESET>
+ line 6<RESET>
+ line 7<RESET>
+ line 8<RESET>
+ line 9<RESET>
+ <CYAN>+<RESET><CYAN>line 1<RESET>
+ <CYAN>+<RESET><CYAN>line 2<RESET>
+ <YELLOW>+<RESET><YELLOW>line 3<RESET>
+ <YELLOW>+<RESET><YELLOW>line 14<RESET>
+ <CYAN>+<RESET><CYAN>line 15<RESET>
+ <CYAN>+<RESET><CYAN>line 16<RESET>
+ line 10<RESET>
+ line 11<RESET>
+ line 12<RESET>
+ line 13<RESET>
+ <MAGENTA>-line 14<RESET>
+ <MAGENTA>-line 15<RESET>
+ <MAGENTA>-line 16<RESET>
EOF
+ test_cmp expected actual &&
+
+ test_config diff.colorMoved alternate &&
git diff HEAD --no-renames --color-moved| test_decode_color >actual &&
cat <<-\EOF >expected &&
- <BOLD>diff --git a/main.c b/main.c<RESET>
- <BOLD>index 27a619c..7cf9336 100644<RESET>
- <BOLD>--- a/main.c<RESET>
- <BOLD>+++ b/main.c<RESET>
- <CYAN>@@ -5,13 +5,6 @@<RESET> <RESET>printf("Hello ");<RESET>
- printf("World\n");<RESET>
- }<RESET>
- <RESET>
- <BRED>-int secure_foo(struct user *u)<RESET>
- <BRED>-{<RESET>
- <BOLD;RED>-if (!u->is_allowed_foo)<RESET>
- <BOLD;RED>-return;<RESET>
- <BRED>-foo(u);<RESET>
- <BOLD;RED>-}<RESET>
- <BOLD;RED>-<RESET>
- int main()<RESET>
- {<RESET>
- foo();<RESET>
- <BOLD>diff --git a/test.c b/test.c<RESET>
- <BOLD>index 1dc1d85..2bedec9 100644<RESET>
- <BOLD>--- a/test.c<RESET>
- <BOLD>+++ b/test.c<RESET>
- <CYAN>@@ -4,6 +4,13 @@<RESET> <RESET>int bar()<RESET>
- printf("Hello World, but different\n");<RESET>
- }<RESET>
- <RESET>
- <BGREEN>+<RESET><BGREEN>int secure_foo(struct user *u)<RESET>
- <BGREEN>+<RESET><BGREEN>{<RESET>
- <BOLD;GREEN>+<RESET><BOLD;GREEN>foo(u);<RESET>
- <BGREEN>+<RESET><BGREEN>if (!u->is_allowed_foo)<RESET>
- <BGREEN>+<RESET><BGREEN>return;<RESET>
- <BOLD;GREEN>+<RESET><BOLD;GREEN>}<RESET>
- <BOLD;GREEN>+<RESET>
- int another_function()<RESET>
- {<RESET>
- bar();<RESET>
+ <BOLD>diff --git a/lines.txt b/lines.txt<RESET>
+ <BOLD>index 47ea9c3..ba96a38 100644<RESET>
+ <BOLD>--- a/lines.txt<RESET>
+ <BOLD>+++ b/lines.txt<RESET>
+ <CYAN>@@ -1,16 +1,16 @@<RESET>
+ <MAGENTA>-line 1<RESET>
+ <MAGENTA>-line 2<RESET>
+ <MAGENTA>-line 3<RESET>
+ line 4<RESET>
+ line 5<RESET>
+ line 6<RESET>
+ line 7<RESET>
+ line 8<RESET>
+ line 9<RESET>
+ <CYAN>+<RESET><CYAN>line 1<RESET>
+ <CYAN>+<RESET><CYAN>line 2<RESET>
+ <CYAN>+<RESET><CYAN>line 3<RESET>
+ <YELLOW>+<RESET><YELLOW>line 14<RESET>
+ <YELLOW>+<RESET><YELLOW>line 15<RESET>
+ <YELLOW>+<RESET><YELLOW>line 16<RESET>
+ line 10<RESET>
+ line 11<RESET>
+ line 12<RESET>
+ line 13<RESET>
+ <BLUE>-line 14<RESET>
+ <BLUE>-line 15<RESET>
+ <BLUE>-line 16<RESET>
EOF
+ test_cmp expected actual &&
+ test_config diff.colorMoved allbounds &&
+ git diff HEAD --no-renames --color-moved| test_decode_color >actual &&
+ cat <<-\EOF >expected &&
+ <BOLD>diff --git a/lines.txt b/lines.txt<RESET>
+ <BOLD>index 47ea9c3..ba96a38 100644<RESET>
+ <BOLD>--- a/lines.txt<RESET>
+ <BOLD>+++ b/lines.txt<RESET>
+ <CYAN>@@ -1,16 +1,16 @@<RESET>
+ <BLUE>-line 1<RESET>
+ <MAGENTA>-line 2<RESET>
+ <BLUE>-line 3<RESET>
+ line 4<RESET>
+ line 5<RESET>
+ line 6<RESET>
+ line 7<RESET>
+ line 8<RESET>
+ line 9<RESET>
+ <YELLOW>+<RESET><YELLOW>line 1<RESET>
+ <CYAN>+<RESET><CYAN>line 2<RESET>
+ <YELLOW>+<RESET><YELLOW>line 3<RESET>
+ <YELLOW>+<RESET><YELLOW>line 14<RESET>
+ <CYAN>+<RESET><CYAN>line 15<RESET>
+ <YELLOW>+<RESET><YELLOW>line 16<RESET>
+ line 10<RESET>
+ line 11<RESET>
+ line 12<RESET>
+ line 13<RESET>
+ <BLUE>-line 14<RESET>
+ <MAGENTA>-line 15<RESET>
+ <BLUE>-line 16<RESET>
+ EOF
test_cmp expected actual
'
--
2.13.0.17.gab62347cd9
next prev parent reply other threads:[~2017-05-27 1:12 UTC|newest]
Thread overview: 125+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20170523024048.16879-1-sbeller@google.com/>
2017-05-24 21:40 ` [PATCHv5 00/17] Diff machine: highlight moved lines Stefan Beller
2017-05-24 21:40 ` [PATCHv5 01/17] diff: readability fix Stefan Beller
2017-05-24 21:40 ` [PATCHv5 02/17] diff: move line ending check into emit_hunk_header Stefan Beller
2017-05-24 21:40 ` [PATCHv5 03/17] diff.c: factor out diff_flush_patch_all_file_pairs Stefan Beller
2017-05-24 21:40 ` [PATCHv5 04/17] diff: introduce more flexible emit function Stefan Beller
2017-06-13 21:54 ` Jonathan Tan
2017-06-13 23:41 ` Stefan Beller
2017-06-13 23:46 ` Jonathan Tan
2017-05-24 21:40 ` [PATCHv5 05/17] diff.c: convert fn_out_consume to use emit_line Stefan Beller
2017-05-24 21:40 ` [PATCHv5 06/17] diff.c: convert builtin_diff to use emit_line_* Stefan Beller
2017-05-24 21:40 ` [PATCHv5 07/17] diff.c: convert emit_rewrite_diff " Stefan Beller
2017-05-24 21:40 ` [PATCHv5 08/17] diff.c: convert emit_rewrite_lines " Stefan Beller
2017-05-24 21:40 ` [PATCHv5 09/17] submodule.c: convert show_submodule_summary to use emit_line_fmt Stefan Beller
2017-05-24 21:40 ` [PATCHv5 10/17] diff.c: convert emit_binary_diff_body to use emit_line_* Stefan Beller
2017-05-24 21:40 ` [PATCHv5 11/17] diff.c: convert show_stats " Stefan Beller
2017-05-24 21:40 ` [PATCHv5 12/17] diff.c: convert word diffing " Stefan Beller
2017-05-24 21:40 ` [PATCHv5 13/17] diff.c: convert diff_flush " Stefan Beller
2017-05-24 21:40 ` [PATCHv5 14/17] diff.c: convert diff_summary " Stefan Beller
2017-05-24 21:40 ` [PATCHv5 15/17] diff.c: emit_line includes whitespace highlighting Stefan Beller
2017-05-24 21:40 ` [PATCHv5 16/17] diff: buffer all output if asked to Stefan Beller
2017-05-25 2:26 ` Junio C Hamano
2017-05-25 5:34 ` Stefan Beller
2017-05-26 1:09 ` Junio C Hamano
2017-06-13 22:07 ` Jonathan Tan
2017-06-14 2:52 ` Stefan Beller
2017-05-24 21:40 ` [PATCHv5 17/17] diff.c: color moved lines differently Stefan Beller
2017-05-25 2:27 ` Junio C Hamano
2017-05-25 5:39 ` Stefan Beller
2017-05-25 6:44 ` [PATCHv5 00/17] Diff machine: highlight moved lines Junio C Hamano
2017-05-25 16:31 ` Stefan Beller
2017-05-26 1:20 ` Junio C Hamano
2017-05-26 19:30 ` Stefan Beller
2017-05-27 0:18 ` Stefan Beller [this message]
2017-05-27 0:18 ` [PATCH 1/1] diff.c: color moved lines differently Stefan Beller
2017-05-27 7:05 ` Philip Oakley
2017-05-30 21:33 ` Stefan Beller
2017-06-01 0:24 ` [PATCH] " Stefan Beller
2017-06-13 22:51 ` Jonathan Tan
2017-06-14 18:55 ` Stefan Beller
2017-06-20 2:47 ` [PATCH 00/26] reroll of sb/diff-color-moved Stefan Beller
2017-06-20 2:47 ` [PATCH 01/26] diff.c: readability fix Stefan Beller
2017-06-20 2:47 ` [PATCH 02/26] diff.c: move line ending check into emit_hunk_header Stefan Beller
2017-06-20 2:47 ` [PATCH 03/26] diff.c: factor out diff_flush_patch_all_file_pairs Stefan Beller
2017-06-20 2:47 ` [PATCH 04/26] diff.c: introduce emit_diff_symbol Stefan Beller
2017-06-21 19:36 ` Junio C Hamano
2017-06-21 19:46 ` Stefan Beller
2017-06-21 20:26 ` Junio C Hamano
2017-06-21 21:13 ` Junio C Hamano
2017-06-21 21:23 ` Stefan Beller
2017-06-21 21:43 ` Junio C Hamano
2017-06-21 21:51 ` Stefan Beller
2017-06-21 21:45 ` Brandon Williams
2017-06-21 21:52 ` Junio C Hamano
2017-06-21 21:55 ` Brandon Williams
2017-06-20 2:47 ` [PATCH 05/26] diff.c: emit_diff_symbol learns DIFF_SYMBOL_CONTEXT_MARKER Stefan Beller
2017-06-20 2:47 ` [PATCH 06/26] diff.c: emit_diff_symbol learns DIFF_SYMBOL_CONTEXT_FRAGINFO Stefan Beller
2017-06-20 2:47 ` [PATCH 07/26] diff.c: emit_diff_symbol learns DIFF_SYMBOL_NO_LF_EOF Stefan Beller
2017-06-20 2:47 ` [PATCH 08/26] diff.c: migrate emit_line_checked to use emit_diff_symbol Stefan Beller
2017-06-21 20:05 ` Junio C Hamano
2017-06-22 23:30 ` Stefan Beller
2017-06-22 23:37 ` Stefan Beller
2017-06-23 4:56 ` Junio C Hamano
2017-06-20 2:47 ` [PATCH 09/26] diff.c: emit_diff_symbol learns DIFF_SYMBOL_WORDS{_PORCELAIN} Stefan Beller
2017-06-20 2:48 ` [PATCH 10/26] diff.c: emit_diff_symbol learns DIFF_SYMBOL_CONTEXT_INCOMPLETE Stefan Beller
2017-06-20 2:48 ` [PATCH 11/26] diff.c: emit_diff_symbol learns DIFF_SYMBOL_FILEPAIR Stefan Beller
2017-06-20 20:01 ` Jonathan Tan
2017-06-21 20:09 ` Junio C Hamano
2017-06-22 23:59 ` Stefan Beller
2017-06-20 2:48 ` [PATCH 12/26] diff.c: emit_diff_symbol learns DIFF_SYMBOL_HEADER Stefan Beller
2017-06-20 2:48 ` [PATCH 13/26] diff.c: emit_diff_symbol learns about DIFF_SYMBOL_BINARY_FILES Stefan Beller
2017-06-21 20:13 ` Junio C Hamano
2017-06-21 20:47 ` Stefan Beller
2017-06-20 2:48 ` [PATCH 14/26] diff.c: emit_diff_symbol learns DIFF_SYMBOL_REWRITE_DIFF Stefan Beller
2017-06-20 2:48 ` [PATCH 15/26] submodule.c: migrate diff output to use emit_diff_symbol Stefan Beller
2017-06-20 20:09 ` Jonathan Tan
2017-06-20 2:48 ` [PATCH 16/26] diff.c: convert emit_binary_diff_body " Stefan Beller
2017-06-21 20:16 ` Junio C Hamano
2017-06-20 2:48 ` [PATCH 17/26] diff.c: convert show_stats " Stefan Beller
2017-06-21 21:39 ` Brandon Williams
2017-06-21 22:16 ` Stefan Beller
2017-06-20 2:48 ` [PATCH 18/26] diff.c: convert word diffing " Stefan Beller
2017-06-20 2:48 ` [PATCH 19/26] diff.c: emit_diff_symbol learns about DIFF_SYMBOL_STAT_SEP Stefan Beller
2017-06-20 2:48 ` [PATCH 20/26] diff.c: emit_diff_symbol learns about DIFF_SYMBOL_SUMMARY Stefan Beller
2017-06-20 2:48 ` [PATCH 21/26] diff.c: buffer all output if asked to Stefan Beller
2017-06-20 2:48 ` [PATCH 22/26] diff.c: color moved lines differently Stefan Beller
2017-06-20 20:13 ` Jonathan Tan
2017-06-20 20:57 ` Stefan Beller
2017-06-20 2:48 ` [PATCH 23/26] diff.c: color moved lines differently, plain mode Stefan Beller
2017-06-20 2:48 ` [PATCH 24/26] diff.c: add dimming to moved line detection Stefan Beller
2017-06-21 20:23 ` Junio C Hamano
2017-06-20 2:48 ` [PATCH 25/26] diff: document the new --color-moved setting Stefan Beller
2017-06-20 2:48 ` [showing-off RFC/PATCH 26/26] diff.c: have a "machine parseable" move coloring Stefan Beller
2017-06-20 2:50 ` Stefan Beller
2017-06-23 21:43 ` Ævar Arnfjörð Bjarmason
2017-06-21 21:51 ` Brandon Williams
2017-06-21 21:55 ` Junio C Hamano
2017-06-21 22:40 ` Stefan Beller
2017-06-23 1:28 ` [PATCHv2 00/25] reroll of sb/diff-color-moved Stefan Beller
2017-06-23 1:28 ` [PATCHv2 01/25] diff.c: readability fix Stefan Beller
2017-06-23 1:28 ` [PATCHv2 02/25] diff.c: move line ending check into emit_hunk_header Stefan Beller
2017-06-23 1:28 ` [PATCHv2 03/25] diff.c: factor out diff_flush_patch_all_file_pairs Stefan Beller
2017-06-23 1:28 ` [PATCHv2 04/25] diff.c: introduce emit_diff_symbol Stefan Beller
2017-06-23 20:07 ` Junio C Hamano
2017-06-23 20:13 ` Stefan Beller
2017-06-23 1:28 ` [PATCHv2 05/25] diff.c: emit_diff_symbol learns DIFF_SYMBOL_CONTEXT_MARKER Stefan Beller
2017-06-23 1:29 ` [PATCHv2 06/25] diff.c: emit_diff_symbol learns DIFF_SYMBOL_CONTEXT_FRAGINFO Stefan Beller
2017-06-23 1:29 ` [PATCHv2 07/25] diff.c: emit_diff_symbol learns DIFF_SYMBOL_NO_LF_EOF Stefan Beller
2017-06-23 1:29 ` [PATCHv2 08/25] diff.c: migrate emit_line_checked to use emit_diff_symbol Stefan Beller
2017-06-23 1:29 ` [PATCHv2 09/25] diff.c: emit_diff_symbol learns DIFF_SYMBOL_WORDS[_PORCELAIN] Stefan Beller
2017-06-23 1:29 ` [PATCHv2 10/25] diff.c: emit_diff_symbol learns DIFF_SYMBOL_CONTEXT_INCOMPLETE Stefan Beller
2017-06-23 1:29 ` [PATCHv2 11/25] diff.c: emit_diff_symbol learns DIFF_SYMBOL_FILEPAIR_{PLUS, MINUS} Stefan Beller
2017-06-23 1:29 ` [PATCHv2 12/25] diff.c: emit_diff_symbol learns DIFF_SYMBOL_HEADER Stefan Beller
2017-06-23 1:29 ` [PATCHv2 13/25] diff.c: emit_diff_symbol learns about DIFF_SYMBOL_BINARY_FILES Stefan Beller
2017-06-23 1:29 ` [PATCHv2 14/25] diff.c: emit_diff_symbol learns DIFF_SYMBOL_REWRITE_DIFF Stefan Beller
2017-06-23 1:29 ` [PATCHv2 15/25] submodule.c: migrate diff output to use emit_diff_symbol Stefan Beller
2017-06-23 1:29 ` [PATCHv2 16/25] diff.c: convert emit_binary_diff_body " Stefan Beller
2017-06-23 1:29 ` [PATCHv2 17/25] diff.c: convert show_stats " Stefan Beller
2017-06-23 1:29 ` [PATCHv2 18/25] diff.c: convert word diffing " Stefan Beller
2017-06-23 1:29 ` [PATCHv2 19/25] diff.c: emit_diff_symbol learns about DIFF_SYMBOL_STAT_SEP Stefan Beller
2017-06-23 1:29 ` [PATCHv2 20/25] diff.c: emit_diff_symbol learns about DIFF_SYMBOL_SUMMARY Stefan Beller
2017-06-23 1:29 ` [PATCHv2 21/25] diff.c: buffer all output if asked to Stefan Beller
2017-06-23 1:29 ` [PATCHv2 22/25] diff.c: color moved lines differently Stefan Beller
2017-06-23 1:29 ` [PATCHv2 23/25] diff.c: color moved lines differently, plain mode Stefan Beller
2017-06-23 1:29 ` [PATCHv2 24/25] diff.c: add dimming to moved line detection Stefan Beller
2017-06-23 1:29 ` [PATCHv2 25/25] diff: document the new --color-moved setting Stefan Beller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170527001820.25214-1-sbeller@google.com \
--to=sbeller@google.com \
--cc=bmwill@google.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jonathantanmy@google.com \
--cc=jrnieder@gmail.com \
--cc=mhagger@alum.mit.edu \
--cc=peff@peff.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).