196 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
			
		
		
	
	
			196 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
| #!/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
 |