| #!/bin/sh |
| |
| test_description='Test diff indent heuristic. |
| |
| ' |
| GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main |
| export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME |
| |
| . ./test-lib.sh |
| . "$TEST_DIRECTORY"/lib-diff.sh |
| |
| # Compare two diff outputs. Ignore "index" lines, because we don't |
| # care about SHA-1s or file modes. |
| 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. |
| 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 |
| ' |
| |
| # --- diff tests ---------------------------------------------------------- |
| |
| test_expect_success 'diff: ugly spaces' ' |
| git diff --no-indent-heuristic old new -- spaces.txt >out && |
| compare_diff spaces-expect out |
| ' |
| |
| 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: nice spaces with --indent-heuristic' ' |
| git -c diff.indentHeuristic=false 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=true' ' |
| git -c diff.indentHeuristic=true diff old new -- spaces.txt >out-compacted2 && |
| compare_diff spaces-compacted-expect out-compacted2 |
| ' |
| |
| 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 --no-indent-heuristic 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 |
| ' |
| |
| # --- blame tests --------------------------------------------------------- |
| |
| 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=true' ' |
| 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: ugly spaces with --no-indent-heuristic' ' |
| git blame --no-indent-heuristic old..new -- spaces.txt >out-blame && |
| compare_blame spaces-expect out-blame |
| ' |
| |
| test_expect_success 'blame: ugly spaces with diff.indentHeuristic=false' ' |
| git -c diff.indentHeuristic=false blame old..new -- spaces.txt >out-blame2 && |
| compare_blame spaces-expect out-blame2 |
| ' |
| |
| test_expect_success 'blame: --no-indent-heuristic overrides config' ' |
| git -c diff.indentHeuristic=true blame --no-indent-heuristic old..new -- spaces.txt >out-blame3 && |
| git blame old..new -- spaces.txt >out-blame && |
| compare_blame spaces-expect out-blame3 |
| ' |
| |
| test_expect_success 'blame: --indent-heuristic overrides config' ' |
| git -c diff.indentHeuristic=false blame --indent-heuristic old..new -- spaces.txt >out-blame-compacted3 && |
| compare_blame spaces-compacted-expect out-blame-compacted2 |
| ' |
| |
| # --- diff-tree tests ----------------------------------------------------- |
| |
| test_expect_success 'diff-tree: nice spaces with --indent-heuristic' ' |
| git diff-tree --indent-heuristic -p old new -- spaces.txt >out-diff-tree-compacted && |
| compare_diff spaces-compacted-expect out-diff-tree-compacted |
| ' |
| |
| test_expect_success 'diff-tree: nice spaces with diff.indentHeuristic=true' ' |
| git -c diff.indentHeuristic=true diff-tree -p old new -- spaces.txt >out-diff-tree-compacted2 && |
| compare_diff spaces-compacted-expect out-diff-tree-compacted2 |
| ' |
| |
| test_expect_success 'diff-tree: ugly spaces with --no-indent-heuristic' ' |
| git diff-tree --no-indent-heuristic -p old new -- spaces.txt >out-diff-tree && |
| compare_diff spaces-expect out-diff-tree |
| ' |
| |
| test_expect_success 'diff-tree: ugly spaces with diff.indentHeuristic=false' ' |
| git -c diff.indentHeuristic=false diff-tree -p old new -- spaces.txt >out-diff-tree2 && |
| compare_diff spaces-expect out-diff-tree2 |
| ' |
| |
| test_expect_success 'diff-tree: --indent-heuristic overrides config' ' |
| git -c diff.indentHeuristic=false diff-tree --indent-heuristic -p old new -- spaces.txt >out-diff-tree-compacted3 && |
| compare_diff spaces-compacted-expect out-diff-tree-compacted3 |
| ' |
| |
| test_expect_success 'diff-tree: --no-indent-heuristic overrides config' ' |
| git -c diff.indentHeuristic=true diff-tree --no-indent-heuristic -p old new -- spaces.txt >out-diff-tree3 && |
| compare_diff spaces-expect out-diff-tree3 |
| ' |
| |
| # --- diff-index tests ---------------------------------------------------- |
| |
| test_expect_success 'diff-index: nice spaces with --indent-heuristic' ' |
| git checkout -B diff-index && |
| git reset --soft HEAD~ && |
| git diff-index --indent-heuristic -p old -- spaces.txt >out-diff-index-compacted && |
| compare_diff spaces-compacted-expect out-diff-index-compacted && |
| git checkout -f main |
| ' |
| |
| test_expect_success 'diff-index: nice spaces with diff.indentHeuristic=true' ' |
| git checkout -B diff-index && |
| git reset --soft HEAD~ && |
| git -c diff.indentHeuristic=true diff-index -p old -- spaces.txt >out-diff-index-compacted2 && |
| compare_diff spaces-compacted-expect out-diff-index-compacted2 && |
| git checkout -f main |
| ' |
| |
| test_expect_success 'diff-index: ugly spaces with --no-indent-heuristic' ' |
| git checkout -B diff-index && |
| git reset --soft HEAD~ && |
| git diff-index --no-indent-heuristic -p old -- spaces.txt >out-diff-index && |
| compare_diff spaces-expect out-diff-index && |
| git checkout -f main |
| ' |
| |
| test_expect_success 'diff-index: ugly spaces with diff.indentHeuristic=false' ' |
| git checkout -B diff-index && |
| git reset --soft HEAD~ && |
| git -c diff.indentHeuristic=false diff-index -p old -- spaces.txt >out-diff-index2 && |
| compare_diff spaces-expect out-diff-index2 && |
| git checkout -f main |
| ' |
| |
| test_expect_success 'diff-index: --indent-heuristic overrides config' ' |
| git checkout -B diff-index && |
| git reset --soft HEAD~ && |
| git -c diff.indentHeuristic=false diff-index --indent-heuristic -p old -- spaces.txt >out-diff-index-compacted3 && |
| compare_diff spaces-compacted-expect out-diff-index-compacted3 && |
| git checkout -f main |
| ' |
| |
| test_expect_success 'diff-index: --no-indent-heuristic overrides config' ' |
| git checkout -B diff-index && |
| git reset --soft HEAD~ && |
| git -c diff.indentHeuristic=true diff-index --no-indent-heuristic -p old -- spaces.txt >out-diff-index3 && |
| compare_diff spaces-expect out-diff-index3 && |
| git checkout -f main |
| ' |
| |
| # --- diff-files tests ---------------------------------------------------- |
| |
| test_expect_success 'diff-files: nice spaces with --indent-heuristic' ' |
| git checkout -B diff-files && |
| git reset HEAD~ && |
| git diff-files --indent-heuristic -p spaces.txt >out-diff-files-raw && |
| grep -v index out-diff-files-raw >out-diff-files-compacted && |
| compare_diff spaces-compacted-expect out-diff-files-compacted && |
| git checkout -f main |
| ' |
| |
| test_expect_success 'diff-files: nice spaces with diff.indentHeuristic=true' ' |
| git checkout -B diff-files && |
| git reset HEAD~ && |
| git -c diff.indentHeuristic=true diff-files -p spaces.txt >out-diff-files-raw2 && |
| grep -v index out-diff-files-raw2 >out-diff-files-compacted2 && |
| compare_diff spaces-compacted-expect out-diff-files-compacted2 && |
| git checkout -f main |
| ' |
| |
| test_expect_success 'diff-files: ugly spaces with --no-indent-heuristic' ' |
| git checkout -B diff-files && |
| git reset HEAD~ && |
| git diff-files --no-indent-heuristic -p spaces.txt >out-diff-files-raw && |
| grep -v index out-diff-files-raw >out-diff-files && |
| compare_diff spaces-expect out-diff-files && |
| git checkout -f main |
| ' |
| |
| test_expect_success 'diff-files: ugly spaces with diff.indentHeuristic=false' ' |
| git checkout -B diff-files && |
| git reset HEAD~ && |
| git -c diff.indentHeuristic=false diff-files -p spaces.txt >out-diff-files-raw2 && |
| grep -v index out-diff-files-raw2 >out-diff-files && |
| compare_diff spaces-expect out-diff-files && |
| git checkout -f main |
| ' |
| |
| test_expect_success 'diff-files: --indent-heuristic overrides config' ' |
| git checkout -B diff-files && |
| git reset HEAD~ && |
| git -c diff.indentHeuristic=false diff-files --indent-heuristic -p spaces.txt >out-diff-files-raw3 && |
| grep -v index out-diff-files-raw3 >out-diff-files-compacted && |
| compare_diff spaces-compacted-expect out-diff-files-compacted && |
| git checkout -f main |
| ' |
| |
| test_expect_success 'diff-files: --no-indent-heuristic overrides config' ' |
| git checkout -B diff-files && |
| git reset HEAD~ && |
| git -c diff.indentHeuristic=true diff-files --no-indent-heuristic -p spaces.txt >out-diff-files-raw4 && |
| grep -v index out-diff-files-raw4 >out-diff-files && |
| compare_diff spaces-expect out-diff-files && |
| git checkout -f main |
| ' |
| |
| test_done |