#!/bin/sh # # Copyright (c) 2009 Giuseppe Bilotta # test_description='git-apply --ignore-whitespace. ' . ./test-lib.sh # This primes main.c file that indents without using HT at all. # Various patches with HT and other spaces are attempted in the test. cat > patch1.patch <<\EOF diff --git a/main.c b/main.c new file mode 100644 --- /dev/null +++ b/main.c @@ -0,0 +1,22 @@ +#include <stdio.h> + +void print_int(int num); +int func(int num); + +int main() { + int i; + + for (i = 0; i < 10; i++) { + print_int(func(i)); /* stuff */ + } + + return 0; +} + +int func(int num) { + return num * num; +} + +void print_int(int num) { + printf("%d", num); +} EOF # Since whitespace is very significant and we want to prevent whitespace # mangling when creating this test from a patch, we protect 'fixable' # whitespace by replacing spaces with Z and replacing them at patch # creation time, hence the sed trick. # This patch will fail unless whitespace differences are being ignored sed -e 's/Z/ /g' > patch2.patch <<\EOF diff --git a/main.c b/main.c --- a/main.c +++ b/main.c @@ -10,6 +10,8 @@ Z print_int(func(i)); /* stuff */ Z } Z + printf("\n"); + Z return 0; Z} Z EOF # This patch will fail even if whitespace differences are being ignored, # because of the missing string at EOL. TODO: this testcase should be # improved by creating a line that has the same hash with and without # the final string. sed -e 's/Z/ /g' > patch3.patch <<\EOF diff --git a/main.c b/main.c --- a/main.c +++ b/main.c @@ -10,3 +10,4 @@ Z for (i = 0; i < 10; i++) { Z print_int(func(i));Z + /* stuff */ Z } EOF # This patch will fail even if whitespace differences are being ignored, # because of the missing EOL at EOF. sed -e 's/Z/ /g' > patch4.patch <<\EOF diff --git a/main.c b/main.c --- a/main.c +++ b/main.c @@ -21,1 +21,1 @@ - };Z \ No newline at end of file + }; EOF # This patch will fail unless whitespace differences are being ignored. sed -e 's/Z/ /g' > patch5.patch <<\EOF diff --git a/main.c b/main.c --- a/main.c +++ b/main.c @@ -2,2 +2,3 @@ Z void print_int(int num); + /* a comment */ Z int func(int num); EOF # And this is how the final output should be. Patches introduce # HTs but the original SP indents are mostly kept. sed -e 's/T/ /g' > main.c.final <<\EOF #include <stdio.h> void print_int(int num); int func(int num); int main() { int i; for (i = 0; i < 10; i++) { print_int(func(i)); /* stuff */ } Tprintf("\n"); return 0; } int func(int num) { return num * num; } void print_int(int num) { printf("%d", num); } EOF test_expect_success 'file creation' ' git apply patch1.patch ' test_expect_success 'patch2 fails (retab)' ' test_must_fail git apply patch2.patch ' test_expect_success 'patch2 applies with --ignore-whitespace' ' git apply --ignore-whitespace patch2.patch ' test_expect_success 'patch2 reverse applies with --ignore-space-change' ' git apply -R --ignore-space-change patch2.patch ' git config apply.ignorewhitespace change test_expect_success 'patch2 applies (apply.ignorewhitespace = change)' ' git apply patch2.patch && test_cmp main.c.final main.c ' test_expect_success 'patch3 fails (missing string at EOL)' ' test_must_fail git apply patch3.patch ' test_expect_success 'patch4 fails (missing EOL at EOF)' ' test_must_fail git apply patch4.patch ' test_expect_success 'patch5 fails (leading whitespace differences matter)' ' test_must_fail git apply patch5.patch ' test_expect_success 're-create file (with --ignore-whitespace)' ' rm -f main.c && git apply patch1.patch ' test_expect_success 'patch5 fails (--no-ignore-whitespace)' ' test_must_fail git apply --no-ignore-whitespace patch5.patch ' test_expect_success 'apply --ignore-space-change --inaccurate-eof' ' echo 1 >file && git apply --ignore-space-change --inaccurate-eof <<-\EOF && diff --git a/file b/file --- a/file +++ b/file @@ -1 +1 @@ -1 +2 EOF printf 2 >expect && test_cmp expect file ' test_done