|  | #!/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 |