| #!/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); | 
 | T/* a comment */ | 
 | 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_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 applies (leading whitespace)' ' | 
 | 	git apply patch5.patch | 
 | ' | 
 |  | 
 | test_expect_success 'patches do not mangle whitespace' ' | 
 | 	test_cmp main.c main.c.final | 
 | ' | 
 |  | 
 | 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_done |