Merge branch 'kb/maint-diff-ws-check'
* kb/maint-diff-ws-check: diff: handle lines containing only whitespace and tabs better test-lib: extend test_decode_color to handle more color codes
This commit is contained in:
commit
44e4155f83
@ -491,4 +491,41 @@ test_expect_success 'combined diff with autocrlf conversion' '
|
||||
|
||||
'
|
||||
|
||||
# Start testing the colored format for whitespace checks
|
||||
|
||||
test_expect_success 'setup diff colors' '
|
||||
git config color.diff always &&
|
||||
git config color.diff.plain normal &&
|
||||
git config color.diff.meta bold &&
|
||||
git config color.diff.frag cyan &&
|
||||
git config color.diff.func normal &&
|
||||
git config color.diff.old red &&
|
||||
git config color.diff.new green &&
|
||||
git config color.diff.commit yellow &&
|
||||
git config color.diff.whitespace "normal red" &&
|
||||
|
||||
git config core.autocrlf false
|
||||
'
|
||||
cat >expected <<\EOF
|
||||
<BOLD>diff --git a/x b/x<RESET>
|
||||
<BOLD>index 9daeafb..2874b91 100644<RESET>
|
||||
<BOLD>--- a/x<RESET>
|
||||
<BOLD>+++ b/x<RESET>
|
||||
<CYAN>@@ -1 +1,4 @@<RESET>
|
||||
test<RESET>
|
||||
<GREEN>+<RESET><GREEN>{<RESET>
|
||||
<GREEN>+<RESET><BRED> <RESET>
|
||||
<GREEN>+<RESET><GREEN>}<RESET>
|
||||
EOF
|
||||
|
||||
test_expect_success 'diff that introduces a line with only tabs' '
|
||||
git config core.whitespace blank-at-eol &&
|
||||
git reset --hard &&
|
||||
echo "test" > x &&
|
||||
git commit -m "initial" x &&
|
||||
echo "{NTN}" | tr "NT" "\n\t" >> x &&
|
||||
git -c color.diff=always diff | test_decode_color >current &&
|
||||
test_cmp expected current
|
||||
'
|
||||
|
||||
test_done
|
||||
|
@ -35,10 +35,10 @@ aeff = aeff * ( aaa )
|
||||
EOF
|
||||
|
||||
cat > expect <<\EOF
|
||||
<WHITE>diff --git a/pre b/post<RESET>
|
||||
<WHITE>index 330b04f..5ed8eff 100644<RESET>
|
||||
<WHITE>--- a/pre<RESET>
|
||||
<WHITE>+++ b/post<RESET>
|
||||
<BOLD>diff --git a/pre b/post<RESET>
|
||||
<BOLD>index 330b04f..5ed8eff 100644<RESET>
|
||||
<BOLD>--- a/pre<RESET>
|
||||
<BOLD>+++ b/post<RESET>
|
||||
<CYAN>@@ -1,3 +1,7 @@<RESET>
|
||||
<RED>h(4)<RESET><GREEN>h(4),hh[44]<RESET>
|
||||
|
||||
@ -122,10 +122,10 @@ test_expect_success '--word-diff=plain --no-color' '
|
||||
'
|
||||
|
||||
cat > expect <<EOF
|
||||
<WHITE>diff --git a/pre b/post<RESET>
|
||||
<WHITE>index 330b04f..5ed8eff 100644<RESET>
|
||||
<WHITE>--- a/pre<RESET>
|
||||
<WHITE>+++ b/post<RESET>
|
||||
<BOLD>diff --git a/pre b/post<RESET>
|
||||
<BOLD>index 330b04f..5ed8eff 100644<RESET>
|
||||
<BOLD>--- a/pre<RESET>
|
||||
<BOLD>+++ b/post<RESET>
|
||||
<CYAN>@@ -1,3 +1,7 @@<RESET>
|
||||
<RED>[-h(4)-]<RESET><GREEN>{+h(4),hh[44]+}<RESET>
|
||||
|
||||
@ -143,10 +143,10 @@ test_expect_success '--word-diff=plain --color' '
|
||||
'
|
||||
|
||||
cat > expect <<\EOF
|
||||
<WHITE>diff --git a/pre b/post<RESET>
|
||||
<WHITE>index 330b04f..5ed8eff 100644<RESET>
|
||||
<WHITE>--- a/pre<RESET>
|
||||
<WHITE>+++ b/post<RESET>
|
||||
<BOLD>diff --git a/pre b/post<RESET>
|
||||
<BOLD>index 330b04f..5ed8eff 100644<RESET>
|
||||
<BOLD>--- a/pre<RESET>
|
||||
<BOLD>+++ b/post<RESET>
|
||||
<CYAN>@@ -1 +1 @@<RESET>
|
||||
<RED>h(4)<RESET><GREEN>h(4),hh[44]<RESET>
|
||||
<CYAN>@@ -3,0 +4,4 @@<RESET> <RESET><MAGENTA>a = b + c<RESET>
|
||||
@ -163,10 +163,10 @@ test_expect_success 'word diff without context' '
|
||||
'
|
||||
|
||||
cat > expect <<\EOF
|
||||
<WHITE>diff --git a/pre b/post<RESET>
|
||||
<WHITE>index 330b04f..5ed8eff 100644<RESET>
|
||||
<WHITE>--- a/pre<RESET>
|
||||
<WHITE>+++ b/post<RESET>
|
||||
<BOLD>diff --git a/pre b/post<RESET>
|
||||
<BOLD>index 330b04f..5ed8eff 100644<RESET>
|
||||
<BOLD>--- a/pre<RESET>
|
||||
<BOLD>+++ b/post<RESET>
|
||||
<CYAN>@@ -1,3 +1,7 @@<RESET>
|
||||
h(4),<GREEN>hh<RESET>[44]
|
||||
|
||||
@ -199,10 +199,10 @@ test_expect_success 'option overrides .gitattributes' '
|
||||
'
|
||||
|
||||
cat > expect <<\EOF
|
||||
<WHITE>diff --git a/pre b/post<RESET>
|
||||
<WHITE>index 330b04f..5ed8eff 100644<RESET>
|
||||
<WHITE>--- a/pre<RESET>
|
||||
<WHITE>+++ b/post<RESET>
|
||||
<BOLD>diff --git a/pre b/post<RESET>
|
||||
<BOLD>index 330b04f..5ed8eff 100644<RESET>
|
||||
<BOLD>--- a/pre<RESET>
|
||||
<BOLD>+++ b/post<RESET>
|
||||
<CYAN>@@ -1,3 +1,7 @@<RESET>
|
||||
h(4)<GREEN>,hh[44]<RESET>
|
||||
|
||||
@ -231,10 +231,10 @@ test_expect_success 'command-line overrides config' '
|
||||
'
|
||||
|
||||
cat > expect <<\EOF
|
||||
<WHITE>diff --git a/pre b/post<RESET>
|
||||
<WHITE>index 330b04f..5ed8eff 100644<RESET>
|
||||
<WHITE>--- a/pre<RESET>
|
||||
<WHITE>+++ b/post<RESET>
|
||||
<BOLD>diff --git a/pre b/post<RESET>
|
||||
<BOLD>index 330b04f..5ed8eff 100644<RESET>
|
||||
<BOLD>--- a/pre<RESET>
|
||||
<BOLD>+++ b/post<RESET>
|
||||
<CYAN>@@ -1,3 +1,7 @@<RESET>
|
||||
h(4),<GREEN>{+hh+}<RESET>[44]
|
||||
|
||||
@ -260,10 +260,10 @@ test_expect_success 'remove diff driver regex' '
|
||||
'
|
||||
|
||||
cat > expect <<\EOF
|
||||
<WHITE>diff --git a/pre b/post<RESET>
|
||||
<WHITE>index 330b04f..5ed8eff 100644<RESET>
|
||||
<WHITE>--- a/pre<RESET>
|
||||
<WHITE>+++ b/post<RESET>
|
||||
<BOLD>diff --git a/pre b/post<RESET>
|
||||
<BOLD>index 330b04f..5ed8eff 100644<RESET>
|
||||
<BOLD>--- a/pre<RESET>
|
||||
<BOLD>+++ b/post<RESET>
|
||||
<CYAN>@@ -1,3 +1,7 @@<RESET>
|
||||
h(4),<GREEN>hh[44<RESET>]
|
||||
|
||||
@ -282,10 +282,10 @@ echo 'aaa (aaa)' > pre
|
||||
echo 'aaa (aaa) aaa' > post
|
||||
|
||||
cat > expect <<\EOF
|
||||
<WHITE>diff --git a/pre b/post<RESET>
|
||||
<WHITE>index c29453b..be22f37 100644<RESET>
|
||||
<WHITE>--- a/pre<RESET>
|
||||
<WHITE>+++ b/post<RESET>
|
||||
<BOLD>diff --git a/pre b/post<RESET>
|
||||
<BOLD>index c29453b..be22f37 100644<RESET>
|
||||
<BOLD>--- a/pre<RESET>
|
||||
<BOLD>+++ b/post<RESET>
|
||||
<CYAN>@@ -1 +1 @@<RESET>
|
||||
aaa (aaa) <GREEN>aaa<RESET>
|
||||
EOF
|
||||
@ -301,10 +301,10 @@ echo '(:' > pre
|
||||
echo '(' > post
|
||||
|
||||
cat > expect <<\EOF
|
||||
<WHITE>diff --git a/pre b/post<RESET>
|
||||
<WHITE>index 289cb9d..2d06f37 100644<RESET>
|
||||
<WHITE>--- a/pre<RESET>
|
||||
<WHITE>+++ b/post<RESET>
|
||||
<BOLD>diff --git a/pre b/post<RESET>
|
||||
<BOLD>index 289cb9d..2d06f37 100644<RESET>
|
||||
<BOLD>--- a/pre<RESET>
|
||||
<BOLD>+++ b/post<RESET>
|
||||
<CYAN>@@ -1 +1 @@<RESET>
|
||||
(<RED>:<RESET>
|
||||
EOF
|
||||
|
@ -238,14 +238,47 @@ test_set_editor () {
|
||||
}
|
||||
|
||||
test_decode_color () {
|
||||
sed -e 's/.\[1m/<WHITE>/g' \
|
||||
-e 's/.\[31m/<RED>/g' \
|
||||
-e 's/.\[32m/<GREEN>/g' \
|
||||
-e 's/.\[33m/<YELLOW>/g' \
|
||||
-e 's/.\[34m/<BLUE>/g' \
|
||||
-e 's/.\[35m/<MAGENTA>/g' \
|
||||
-e 's/.\[36m/<CYAN>/g' \
|
||||
-e 's/.\[m/<RESET>/g'
|
||||
awk '
|
||||
function name(n) {
|
||||
if (n == 0) return "RESET";
|
||||
if (n == 1) return "BOLD";
|
||||
if (n == 30) return "BLACK";
|
||||
if (n == 31) return "RED";
|
||||
if (n == 32) return "GREEN";
|
||||
if (n == 33) return "YELLOW";
|
||||
if (n == 34) return "BLUE";
|
||||
if (n == 35) return "MAGENTA";
|
||||
if (n == 36) return "CYAN";
|
||||
if (n == 37) return "WHITE";
|
||||
if (n == 40) return "BLACK";
|
||||
if (n == 41) return "BRED";
|
||||
if (n == 42) return "BGREEN";
|
||||
if (n == 43) return "BYELLOW";
|
||||
if (n == 44) return "BBLUE";
|
||||
if (n == 45) return "BMAGENTA";
|
||||
if (n == 46) return "BCYAN";
|
||||
if (n == 47) return "BWHITE";
|
||||
}
|
||||
{
|
||||
while (match($0, /\x1b\[[0-9;]*m/) != 0) {
|
||||
printf "%s<", substr($0, 1, RSTART-1);
|
||||
codes = substr($0, RSTART+2, RLENGTH-3);
|
||||
if (length(codes) == 0)
|
||||
printf "%s", name(0)
|
||||
else {
|
||||
n = split(codes, ary, ";");
|
||||
sep = "";
|
||||
for (i = 1; i <= n; i++) {
|
||||
printf "%s%s", sep, name(ary[i]);
|
||||
sep = ";"
|
||||
}
|
||||
}
|
||||
printf ">";
|
||||
$0 = substr($0, RSTART + RLENGTH, length($0) - RSTART - RLENGTH + 1);
|
||||
}
|
||||
print
|
||||
}
|
||||
'
|
||||
}
|
||||
|
||||
nul_to_q () {
|
||||
|
7
ws.c
7
ws.c
@ -174,8 +174,11 @@ static unsigned ws_check_emit_1(const char *line, int len, unsigned ws_rule,
|
||||
}
|
||||
}
|
||||
|
||||
if (trailing_whitespace == -1)
|
||||
trailing_whitespace = len;
|
||||
|
||||
/* Check indentation */
|
||||
for (i = 0; i < len; i++) {
|
||||
for (i = 0; i < trailing_whitespace; i++) {
|
||||
if (line[i] == ' ')
|
||||
continue;
|
||||
if (line[i] != '\t')
|
||||
@ -218,8 +221,6 @@ static unsigned ws_check_emit_1(const char *line, int len, unsigned ws_rule,
|
||||
* Now the rest of the line starts at "written".
|
||||
* The non-highlighted part ends at "trailing_whitespace".
|
||||
*/
|
||||
if (trailing_whitespace == -1)
|
||||
trailing_whitespace = len;
|
||||
|
||||
/* Emit non-highlighted (middle) segment. */
|
||||
if (trailing_whitespace - written > 0) {
|
||||
|
Loading…
Reference in New Issue
Block a user