v2:
* addressed all issues raised
* last patch dropped (WIP/RFC: diff.c: have a "machine parseable" move coloring)
* interdiff below
v1:
This is a complete rewrite of the series. Highlights:
* instead of buffering partial lines, we'll pretend all diff output
follows a well defined grammar, and we emit symbols thereof.
(The difference is mostly mental, though by this trick we reduce
the memory footprint for storing one of these symbols from 7 variables
(3 pointers, 3 ints, one state (also int) down to 4 variables
(one pointer, 2 ints, one state).
* The algorithm for color painting was detangled:
-> different functions for block detection and dimming
-> The last patch (not to be applied) is an RFC that shows
how we would approach non-colored, but machine parseable highlighting
of moved lines.
Thanks,
Stefan
Stefan Beller (25):
diff.c: readability fix
diff.c: move line ending check into emit_hunk_header
diff.c: factor out diff_flush_patch_all_file_pairs
diff.c: introduce emit_diff_symbol
diff.c: emit_diff_symbol learns DIFF_SYMBOL_CONTEXT_MARKER
diff.c: emit_diff_symbol learns DIFF_SYMBOL_CONTEXT_FRAGINFO
diff.c: emit_diff_symbol learns DIFF_SYMBOL_NO_LF_EOF
diff.c: migrate emit_line_checked to use emit_diff_symbol
diff.c: emit_diff_symbol learns DIFF_SYMBOL_WORDS[_PORCELAIN]
diff.c: emit_diff_symbol learns DIFF_SYMBOL_CONTEXT_INCOMPLETE
diff.c: emit_diff_symbol learns DIFF_SYMBOL_FILEPAIR_{PLUS, MINUS}
diff.c: emit_diff_symbol learns DIFF_SYMBOL_HEADER
diff.c: emit_diff_symbol learns about DIFF_SYMBOL_BINARY_FILES
diff.c: emit_diff_symbol learns DIFF_SYMBOL_REWRITE_DIFF
submodule.c: migrate diff output to use emit_diff_symbol
diff.c: convert emit_binary_diff_body to use emit_diff_symbol
diff.c: convert show_stats to use emit_diff_symbol
diff.c: convert word diffing to use emit_diff_symbol
diff.c: emit_diff_symbol learns about DIFF_SYMBOL_STAT_SEP
diff.c: emit_diff_symbol learns about DIFF_SYMBOL_SUMMARY
diff.c: buffer all output if asked to
diff.c: color moved lines differently
diff.c: color moved lines differently, plain mode
diff.c: add dimming to moved line detection
diff: document the new --color-moved setting
Documentation/config.txt | 12 +-
Documentation/diff-options.txt | 27 +
cache.h|2 +
color.h|2 +
diff.c | 1270
diff.h | 37 +-
submodule.c| 85 ++-
submodule.h| 13 +-
t/t4015-diff-whitespace.sh | 369
9 files changed, 1501 insertions(+), 316 deletions(-)
diff to what is currently queued:
diff --git a/cache.h b/cache.h
index 4d63c44f07..d2204bf6d1 100644
--- a/cache.h
+++ b/cache.h
@@ -2168,6 +2168,7 @@ void shift_tree_by(const struct object_id *, const struct
object_id *, struct ob
#define WS_TRAILING_SPACE (WS_BLANK_AT_EOL|WS_BLANK_AT_EOF)
#define WS_DEFAULT_RULE (WS_TRAILING_SPACE|WS_SPACE_BEFORE_TAB|8)
#define WS_TAB_WIDTH_MASK077
+/* All WS_* -- when extended, adapt diff.c emit_symbol */
#define WS_RULE_MASK 0
extern unsigned whitespace_rule_cfg;
extern unsigned whitespace_rule(const char *);
diff --git a/color.h b/color.h
index 0e091b0cf5..fd2b688dfb 100644
--- a/color.h
+++ b/color.h
@@ -42,8 +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 "\033[2m"
-#define GIT_COLOR_DI_IT"\033[2;3m"
+#define GIT_COLOR_FAINT"\033[2m"
+#define GIT_COLOR_FAINT_ITALIC "\033[2;3m"
/* A special value meaning "no color selected" */
#define GIT_COLOR_NIL "NIL"
diff --git a/diff.c b/diff.c
index 7756f7610c..82ace48c38 100644
--- a/diff.c
+++ b/diff.c
@@ -59,12 +59,12 @@ static char diff_colors[][COLOR_MAXLEN] = {
GIT_COLOR_NORMAL, /* FUNCINFO */
GIT_COLOR_BOLD_MAGENTA, /* OLD_MOVED */
GIT_COLOR_BOLD_BLUE,/* OLD_MOVED ALTERNATIVE */
- GIT_COLOR_DI, /* OLD_MOVED_DIM */
- GIT_COLOR_DI_IT,/* OLD_MOVED_ALTERNATIVE_DIM */
+ GIT_COLOR_FAINT,/* OLD_MOVED_DIM */
+ GIT_COLOR_FAINT_ITALIC, /* OLD_MOVED_ALTERNATIVE_DIM */
GIT_COLOR_BOLD_CYAN,/* NEW_MOVED */
GIT_COLOR_BOLD_YELLOW, /* NEW_MOVED ALTERNATIVE */
- GIT_COLOR_DI, /* NEW_MOVED_DIM */
- GIT_COLOR_DI_IT,/* NEW_MOVED_ALTERNATIVE_DIM */
+ GIT_COLOR_FAINT,/* NEW_MOVED_DIM */
+ GIT_COLOR_FAINT_ITALIC, /* NEW_MOVED_ALTERNATIVE_DIM */
};
static NORETURN void die_want_option(const char *option_name)
@@ -607,32 +607,11 @@ static void emit_line(struct diff_options *o, const char
*set, const char *reset
}
enum diff_symbol {
- DIFF_SYMBOL_SEPARATOR,
- DIFF_SYMBOL_CONTEXT_MARKER,
- DIFF_SYMBOL_CONTEXT_FR