#!/bin/sh global test_description := ''Test diff indent heuristic. '' source ./test-lib.sh source "$TEST_DIRECTORY"/diff-lib.sh # Compare two diff outputs. Ignore "index" lines, because we don't # care about SHA-1s or file modes. proc compare_diff { sed -e "/^index /d" <$1 >.tmp-1 sed -e "/^index /d" <$2 >.tmp-2 test_cmp .tmp-1 .tmp-2 && rm -f .tmp-1 .tmp-2 } # Compare blame output using the expectation for a diff as reference. # Only look for the lines coming from non-boundary commits. proc compare_blame { sed -n -e "1,4d" -e "s/^\+//p" <$1 >.tmp-1 sed -ne "s/^[^^][^)]*) *//p" <$2 >.tmp-2 test_cmp .tmp-1 .tmp-2 && rm -f .tmp-1 .tmp-2 } test_expect_success 'prepare' ' cat <<-\EOF >spaces.txt && 1 2 a b 3 4 EOF cat <<-\EOF >functions.c && 1 2 /* function */ foo() { foo } 3 4 EOF git add spaces.txt functions.c && test_tick && git commit -m initial && git branch old && cat <<-\EOF >spaces.txt && 1 2 a b a b 3 4 EOF cat <<-\EOF >functions.c && 1 2 /* function */ bar() { foo } /* function */ foo() { foo } 3 4 EOF git add spaces.txt functions.c && test_tick && git commit -m initial && git branch new && tr "_" " " <<-\EOF >spaces-expect && diff --git a/spaces.txt b/spaces.txt --- a/spaces.txt +++ b/spaces.txt @@ -3,5 +3,8 @@ a _ b +a + +b 3 4 EOF tr "_" " " <<-\EOF >spaces-compacted-expect && diff --git a/spaces.txt b/spaces.txt --- a/spaces.txt +++ b/spaces.txt @@ -2,6 +2,9 @@ 2 a _ +b +a + b 3 4 EOF tr "_" " " <<-\EOF >functions-expect && diff --git a/functions.c b/functions.c --- a/functions.c +++ b/functions.c @@ -1,6 +1,11 @@ 1 2 /* function */ +bar() { + foo +} + +/* function */ foo() { foo } EOF tr "_" " " <<-\EOF >functions-compacted-expect diff --git a/functions.c b/functions.c --- a/functions.c +++ b/functions.c @@ -1,5 +1,10 @@ 1 2 +/* function */ +bar() { + foo +} + /* function */ foo() { foo EOF ' test_expect_success 'diff: ugly spaces' ' git diff old new -- spaces.txt >out && compare_diff spaces-expect out ' test_expect_success 'diff: nice spaces with --indent-heuristic' ' git diff --indent-heuristic old new -- spaces.txt >out-compacted && compare_diff spaces-compacted-expect out-compacted ' test_expect_success 'diff: nice spaces with diff.indentHeuristic' ' git -c diff.indentHeuristic=true diff old new -- spaces.txt >out-compacted2 && compare_diff spaces-compacted-expect out-compacted2 ' test_expect_success 'diff: --no-indent-heuristic overrides config' ' git -c diff.indentHeuristic=true diff --no-indent-heuristic old new -- spaces.txt >out2 && compare_diff spaces-expect out2 ' test_expect_success 'diff: --indent-heuristic with --patience' ' git diff --indent-heuristic --patience old new -- spaces.txt >out-compacted3 && compare_diff spaces-compacted-expect out-compacted3 ' test_expect_success 'diff: --indent-heuristic with --histogram' ' git diff --indent-heuristic --histogram old new -- spaces.txt >out-compacted4 && compare_diff spaces-compacted-expect out-compacted4 ' test_expect_success 'diff: ugly functions' ' git diff old new -- functions.c >out && compare_diff functions-expect out ' test_expect_success 'diff: nice functions with --indent-heuristic' ' git diff --indent-heuristic old new -- functions.c >out-compacted && compare_diff functions-compacted-expect out-compacted ' test_expect_success 'blame: ugly spaces' ' git blame old..new -- spaces.txt >out-blame && compare_blame spaces-expect out-blame ' test_expect_success 'blame: nice spaces with --indent-heuristic' ' git blame --indent-heuristic old..new -- spaces.txt >out-blame-compacted && compare_blame spaces-compacted-expect out-blame-compacted ' test_expect_success 'blame: nice spaces with diff.indentHeuristic' ' git -c diff.indentHeuristic=true blame old..new -- spaces.txt >out-blame-compacted2 && compare_blame spaces-compacted-expect out-blame-compacted2 ' test_expect_success 'blame: --no-indent-heuristic overrides config' ' git -c diff.indentHeuristic=true blame --no-indent-heuristic old..new -- spaces.txt >out-blame2 && git blame old..new -- spaces.txt >out-blame && compare_blame spaces-expect out-blame2 ' test_done (CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description) op: Equal rhs: {(SQ <"Test diff indent heuristic.\n"> <"\n">)} spids: [4] ) ] spids: [4] ) (C {(.)} {(./test-lib.sh)}) (C {(.)} {(DQ ($ VSub_Name "$TEST_DIRECTORY")) (/diff-lib.sh)}) (FuncDef name: compare_diff body: (BraceGroup children: [ (SimpleCommand words: [{(sed)} {(-e)} {(DQ ("/^index /d"))}] redirects: [ (Redir op_id: Redir_Less fd: -1 arg_word: {(DQ ($ VSub_Number "$1"))} spids: [44] ) (Redir op_id:Redir_Great fd:-1 arg_word:{(.tmp-1)} spids:[49]) ] ) (SimpleCommand words: [{(sed)} {(-e)} {(DQ ("/^index /d"))}] redirects: [ (Redir op_id: Redir_Less fd: -1 arg_word: {(DQ ($ VSub_Number "$2"))} spids: [61] ) (Redir op_id:Redir_Great fd:-1 arg_word:{(.tmp-2)} spids:[66]) ] ) (AndOr children: [(C {(test_cmp)} {(.tmp-1)} {(.tmp-2)}) (C {(rm)} {(-f)} {(.tmp-1)} {(.tmp-2)})] op_id: Op_DAmp ) ] spids: [33] ) spids: [28 32] ) (FuncDef name: compare_blame body: (BraceGroup children: [ (SimpleCommand words: [ {(sed)} {(-n)} {(-e)} {(DQ ("1,4d"))} {(-e)} {(DQ ("s/^") (EscapedLiteralPart token:) (//p))} ] redirects: [ (Redir op_id: Redir_Less fd: -1 arg_word: {(DQ ($ VSub_Number "$1"))} spids: [121] ) (Redir op_id:Redir_Great fd:-1 arg_word:{(.tmp-1)} spids:[126]) ] ) (SimpleCommand words: [{(sed)} {(-ne)} {(DQ ("s/^[^^][^)]*) *//p"))}] redirects: [ (Redir op_id: Redir_Less fd: -1 arg_word: {(DQ ($ VSub_Number "$2"))} spids: [138] ) (Redir op_id:Redir_Great fd:-1 arg_word:{(.tmp-2)} spids:[143]) ] ) (AndOr children: [(C {(test_cmp)} {(.tmp-1)} {(.tmp-2)}) (C {(rm)} {(-f)} {(.tmp-1)} {(.tmp-2)})] op_id: Op_DAmp ) ] spids: [100] ) spids: [95 99] ) (C {(test_expect_success)} {(SQ )} { (SQ <"\n"> <"\tcat <<-\\EOF >spaces.txt &&\n"> <"\t1\n"> <"\t2\n"> <"\ta\n"> <"\n"> <"\tb\n"> <"\t3\n"> <"\t4\n"> <"\tEOF\n"> <"\n"> <"\tcat <<-\\EOF >functions.c &&\n"> <"\t1\n"> <"\t2\n"> <"\t/* function */\n"> <"\tfoo() {\n"> <"\t foo\n"> <"\t}\n"> <"\n"> <"\t3\n"> <"\t4\n"> <"\tEOF\n"> <"\n"> <"\tgit add spaces.txt functions.c &&\n"> <"\ttest_tick &&\n"> <"\tgit commit -m initial &&\n"> <"\tgit branch old &&\n"> <"\n"> <"\tcat <<-\\EOF >spaces.txt &&\n"> <"\t1\n"> <"\t2\n"> <"\ta\n"> <"\n"> <"\tb\n"> <"\ta\n"> <"\n"> <"\tb\n"> <"\t3\n"> <"\t4\n"> <"\tEOF\n"> <"\n"> <"\tcat <<-\\EOF >functions.c &&\n"> <"\t1\n"> <"\t2\n"> <"\t/* function */\n"> <"\tbar() {\n"> <"\t foo\n"> <"\t}\n"> <"\n"> <"\t/* function */\n"> <"\tfoo() {\n"> <"\t foo\n"> <"\t}\n"> <"\n"> <"\t3\n"> <"\t4\n"> <"\tEOF\n"> <"\n"> <"\tgit add spaces.txt functions.c &&\n"> <"\ttest_tick &&\n"> <"\tgit commit -m initial &&\n"> <"\tgit branch new &&\n"> <"\n"> <"\ttr \"_\" \" \" <<-\\EOF >spaces-expect &&\n"> <"\tdiff --git a/spaces.txt b/spaces.txt\n"> <"\t--- a/spaces.txt\n"> <"\t+++ b/spaces.txt\n"> <"\t@@ -3,5 +3,8 @@\n"> <"\t a\n"> <"\t_\n"> <"\t b\n"> <"\t+a\n"> <"\t+\n"> <"\t+b\n"> <"\t 3\n"> <"\t 4\n"> <"\tEOF\n"> <"\n"> <"\ttr \"_\" \" \" <<-\\EOF >spaces-compacted-expect &&\n"> <"\tdiff --git a/spaces.txt b/spaces.txt\n"> <"\t--- a/spaces.txt\n"> <"\t+++ b/spaces.txt\n"> <"\t@@ -2,6 +2,9 @@\n"> <"\t 2\n"> <"\t a\n"> <"\t_\n"> <"\t+b\n"> <"\t+a\n"> <"\t+\n"> <"\t b\n"> <"\t 3\n"> <"\t 4\n"> <"\tEOF\n"> <"\n"> <"\ttr \"_\" \" \" <<-\\EOF >functions-expect &&\n"> <"\tdiff --git a/functions.c b/functions.c\n"> <"\t--- a/functions.c\n"> <"\t+++ b/functions.c\n"> <"\t@@ -1,6 +1,11 @@\n"> <"\t 1\n"> <"\t 2\n"> <"\t /* function */\n"> <"\t+bar() {\n"> <"\t+ foo\n"> <"\t+}\n"> <"\t+\n"> <"\t+/* function */\n"> <"\t foo() {\n"> <"\t foo\n"> <"\t }\n"> <"\tEOF\n"> <"\n"> <"\ttr \"_\" \" \" <<-\\EOF >functions-compacted-expect\n"> <"\tdiff --git a/functions.c b/functions.c\n"> <"\t--- a/functions.c\n"> <"\t+++ b/functions.c\n"> <"\t@@ -1,5 +1,10 @@\n"> <"\t 1\n"> <"\t 2\n"> <"\t+/* function */\n"> <"\t+bar() {\n"> <"\t+ foo\n"> <"\t+}\n"> <"\t+\n"> <"\t /* function */\n"> <"\t foo() {\n"> <"\t foo\n"> <"\tEOF\n"> ) } ) (C {(test_expect_success)} {(SQ <"diff: ugly spaces">)} { (SQ <"\n"> <"\tgit diff old new -- spaces.txt >out &&\n"> <"\tcompare_diff spaces-expect out\n"> ) } ) (C {(test_expect_success)} {(SQ <"diff: nice spaces with --indent-heuristic">)} { (SQ <"\n"> <"\tgit diff --indent-heuristic old new -- spaces.txt >out-compacted &&\n"> <"\tcompare_diff spaces-compacted-expect out-compacted\n"> ) } ) (C {(test_expect_success)} {(SQ <"diff: nice spaces with diff.indentHeuristic">)} { (SQ <"\n"> <"\tgit -c diff.indentHeuristic=true diff old new -- spaces.txt >out-compacted2 &&\n"> <"\tcompare_diff spaces-compacted-expect out-compacted2\n"> ) } ) (C {(test_expect_success)} {(SQ <"diff: --no-indent-heuristic overrides config">)} { (SQ <"\n"> < "\tgit -c diff.indentHeuristic=true diff --no-indent-heuristic old new -- spaces.txt >out2 &&\n" > <"\tcompare_diff spaces-expect out2\n"> ) } ) (C {(test_expect_success)} {(SQ <"diff: --indent-heuristic with --patience">)} { (SQ <"\n"> <"\tgit diff --indent-heuristic --patience old new -- spaces.txt >out-compacted3 &&\n"> <"\tcompare_diff spaces-compacted-expect out-compacted3\n"> ) } ) (C {(test_expect_success)} {(SQ <"diff: --indent-heuristic with --histogram">)} { (SQ <"\n"> <"\tgit diff --indent-heuristic --histogram old new -- spaces.txt >out-compacted4 &&\n"> <"\tcompare_diff spaces-compacted-expect out-compacted4\n"> ) } ) (C {(test_expect_success)} {(SQ <"diff: ugly functions">)} { (SQ <"\n"> <"\tgit diff old new -- functions.c >out &&\n"> <"\tcompare_diff functions-expect out\n"> ) } ) (C {(test_expect_success)} {(SQ <"diff: nice functions with --indent-heuristic">)} { (SQ <"\n"> <"\tgit diff --indent-heuristic old new -- functions.c >out-compacted &&\n"> <"\tcompare_diff functions-compacted-expect out-compacted\n"> ) } ) (C {(test_expect_success)} {(SQ <"blame: ugly spaces">)} { (SQ <"\n"> <"\tgit blame old..new -- spaces.txt >out-blame &&\n"> <"\tcompare_blame spaces-expect out-blame\n"> ) } ) (C {(test_expect_success)} {(SQ <"blame: nice spaces with --indent-heuristic">)} { (SQ <"\n"> <"\tgit blame --indent-heuristic old..new -- spaces.txt >out-blame-compacted &&\n"> <"\tcompare_blame spaces-compacted-expect out-blame-compacted\n"> ) } ) (C {(test_expect_success)} {(SQ <"blame: nice spaces with diff.indentHeuristic">)} { (SQ <"\n"> < "\tgit -c diff.indentHeuristic=true blame old..new -- spaces.txt >out-blame-compacted2 &&\n" > <"\tcompare_blame spaces-compacted-expect out-blame-compacted2\n"> ) } ) (C {(test_expect_success)} {(SQ <"blame: --no-indent-heuristic overrides config">)} { (SQ <"\n"> < "\tgit -c diff.indentHeuristic=true blame --no-indent-heuristic old..new -- spaces.txt >out-blame2 &&\n" > <"\tgit blame old..new -- spaces.txt >out-blame &&\n"> <"\tcompare_blame spaces-expect out-blame2\n"> ) } ) (C {(test_done)}) ] )