Giuseppe Bilotta | 86c91f9 | 2009-08-04 13:16:49 +0200 | [diff] [blame] | 1 | #!/bin/sh |
| 2 | # |
| 3 | # Copyright (c) 2009 Giuseppe Bilotta |
| 4 | # |
| 5 | |
| 6 | test_description='git-apply --ignore-whitespace. |
| 7 | |
| 8 | ' |
| 9 | . ./test-lib.sh |
| 10 | |
| 11 | # This primes main.c file that indents without using HT at all. |
| 12 | # Various patches with HT and other spaces are attempted in the test. |
| 13 | |
| 14 | cat > patch1.patch <<\EOF |
| 15 | diff --git a/main.c b/main.c |
| 16 | new file mode 100644 |
| 17 | --- /dev/null |
| 18 | +++ b/main.c |
| 19 | @@ -0,0 +1,22 @@ |
| 20 | +#include <stdio.h> |
| 21 | + |
| 22 | +void print_int(int num); |
| 23 | +int func(int num); |
| 24 | + |
| 25 | +int main() { |
| 26 | + int i; |
| 27 | + |
| 28 | + for (i = 0; i < 10; i++) { |
| 29 | + print_int(func(i)); /* stuff */ |
| 30 | + } |
| 31 | + |
| 32 | + return 0; |
| 33 | +} |
| 34 | + |
| 35 | +int func(int num) { |
| 36 | + return num * num; |
| 37 | +} |
| 38 | + |
| 39 | +void print_int(int num) { |
| 40 | + printf("%d", num); |
| 41 | +} |
| 42 | EOF |
| 43 | |
| 44 | # Since whitespace is very significant and we want to prevent whitespace |
| 45 | # mangling when creating this test from a patch, we protect 'fixable' |
| 46 | # whitespace by replacing spaces with Z and replacing them at patch |
| 47 | # creation time, hence the sed trick. |
| 48 | |
| 49 | # This patch will fail unless whitespace differences are being ignored |
| 50 | |
| 51 | sed -e 's/Z/ /g' > patch2.patch <<\EOF |
| 52 | diff --git a/main.c b/main.c |
| 53 | --- a/main.c |
| 54 | +++ b/main.c |
| 55 | @@ -10,6 +10,8 @@ |
| 56 | Z print_int(func(i)); /* stuff */ |
| 57 | Z } |
| 58 | Z |
| 59 | + printf("\n"); |
| 60 | + |
| 61 | Z return 0; |
| 62 | Z} |
| 63 | Z |
| 64 | EOF |
| 65 | |
| 66 | # This patch will fail even if whitespace differences are being ignored, |
| 67 | # because of the missing string at EOL. TODO: this testcase should be |
| 68 | # improved by creating a line that has the same hash with and without |
| 69 | # the final string. |
| 70 | |
| 71 | sed -e 's/Z/ /g' > patch3.patch <<\EOF |
| 72 | diff --git a/main.c b/main.c |
| 73 | --- a/main.c |
| 74 | +++ b/main.c |
| 75 | @@ -10,3 +10,4 @@ |
| 76 | Z for (i = 0; i < 10; i++) { |
| 77 | Z print_int(func(i));Z |
| 78 | + /* stuff */ |
| 79 | Z } |
| 80 | EOF |
| 81 | |
| 82 | # This patch will fail even if whitespace differences are being ignored, |
| 83 | # because of the missing EOL at EOF. |
| 84 | |
| 85 | sed -e 's/Z/ /g' > patch4.patch <<\EOF |
| 86 | diff --git a/main.c b/main.c |
| 87 | --- a/main.c |
| 88 | +++ b/main.c |
| 89 | @@ -21,1 +21,1 @@ |
| 90 | - };Z |
| 91 | \ No newline at end of file |
| 92 | + }; |
| 93 | EOF |
| 94 | |
| 95 | # This patch will fail unless whitespace differences are being ignored. |
| 96 | |
| 97 | sed -e 's/Z/ /g' > patch5.patch <<\EOF |
| 98 | diff --git a/main.c b/main.c |
| 99 | --- a/main.c |
| 100 | +++ b/main.c |
| 101 | @@ -2,2 +2,3 @@ |
| 102 | Z void print_int(int num); |
| 103 | + /* a comment */ |
| 104 | Z int func(int num); |
| 105 | EOF |
| 106 | |
| 107 | # And this is how the final output should be. Patches introduce |
| 108 | # HTs but the original SP indents are mostly kept. |
| 109 | |
| 110 | sed -e 's/T/ /g' > main.c.final <<\EOF |
| 111 | #include <stdio.h> |
| 112 | |
| 113 | void print_int(int num); |
Giuseppe Bilotta | 86c91f9 | 2009-08-04 13:16:49 +0200 | [diff] [blame] | 114 | int func(int num); |
| 115 | |
| 116 | int main() { |
| 117 | int i; |
| 118 | |
| 119 | for (i = 0; i < 10; i++) { |
| 120 | print_int(func(i)); /* stuff */ |
| 121 | } |
| 122 | |
| 123 | Tprintf("\n"); |
| 124 | |
| 125 | return 0; |
| 126 | } |
| 127 | |
| 128 | int func(int num) { |
| 129 | return num * num; |
| 130 | } |
| 131 | |
| 132 | void print_int(int num) { |
| 133 | printf("%d", num); |
| 134 | } |
| 135 | EOF |
| 136 | |
| 137 | test_expect_success 'file creation' ' |
Matthew Ogilvie | 5d59a40 | 2009-11-28 11:38:55 -0700 | [diff] [blame] | 138 | git apply patch1.patch |
Giuseppe Bilotta | 86c91f9 | 2009-08-04 13:16:49 +0200 | [diff] [blame] | 139 | ' |
| 140 | |
| 141 | test_expect_success 'patch2 fails (retab)' ' |
Matthew Ogilvie | 5d59a40 | 2009-11-28 11:38:55 -0700 | [diff] [blame] | 142 | test_must_fail git apply patch2.patch |
Giuseppe Bilotta | 86c91f9 | 2009-08-04 13:16:49 +0200 | [diff] [blame] | 143 | ' |
| 144 | |
| 145 | test_expect_success 'patch2 applies with --ignore-whitespace' ' |
Matthew Ogilvie | 5d59a40 | 2009-11-28 11:38:55 -0700 | [diff] [blame] | 146 | git apply --ignore-whitespace patch2.patch |
Giuseppe Bilotta | 86c91f9 | 2009-08-04 13:16:49 +0200 | [diff] [blame] | 147 | ' |
| 148 | |
| 149 | test_expect_success 'patch2 reverse applies with --ignore-space-change' ' |
Matthew Ogilvie | 5d59a40 | 2009-11-28 11:38:55 -0700 | [diff] [blame] | 150 | git apply -R --ignore-space-change patch2.patch |
Giuseppe Bilotta | 86c91f9 | 2009-08-04 13:16:49 +0200 | [diff] [blame] | 151 | ' |
| 152 | |
| 153 | git config apply.ignorewhitespace change |
| 154 | |
| 155 | test_expect_success 'patch2 applies (apply.ignorewhitespace = change)' ' |
Junio C Hamano | 14d3bb4 | 2014-03-26 13:42:06 -0700 | [diff] [blame] | 156 | git apply patch2.patch && |
| 157 | test_cmp main.c.final main.c |
Giuseppe Bilotta | 86c91f9 | 2009-08-04 13:16:49 +0200 | [diff] [blame] | 158 | ' |
| 159 | |
| 160 | test_expect_success 'patch3 fails (missing string at EOL)' ' |
Matthew Ogilvie | 5d59a40 | 2009-11-28 11:38:55 -0700 | [diff] [blame] | 161 | test_must_fail git apply patch3.patch |
Giuseppe Bilotta | 86c91f9 | 2009-08-04 13:16:49 +0200 | [diff] [blame] | 162 | ' |
| 163 | |
| 164 | test_expect_success 'patch4 fails (missing EOL at EOF)' ' |
Matthew Ogilvie | 5d59a40 | 2009-11-28 11:38:55 -0700 | [diff] [blame] | 165 | test_must_fail git apply patch4.patch |
Giuseppe Bilotta | 86c91f9 | 2009-08-04 13:16:49 +0200 | [diff] [blame] | 166 | ' |
| 167 | |
Junio C Hamano | 14d3bb4 | 2014-03-26 13:42:06 -0700 | [diff] [blame] | 168 | test_expect_success 'patch5 fails (leading whitespace differences matter)' ' |
| 169 | test_must_fail git apply patch5.patch |
Giuseppe Bilotta | 86c91f9 | 2009-08-04 13:16:49 +0200 | [diff] [blame] | 170 | ' |
| 171 | |
| 172 | test_expect_success 're-create file (with --ignore-whitespace)' ' |
| 173 | rm -f main.c && |
Matthew Ogilvie | 5d59a40 | 2009-11-28 11:38:55 -0700 | [diff] [blame] | 174 | git apply patch1.patch |
Giuseppe Bilotta | 86c91f9 | 2009-08-04 13:16:49 +0200 | [diff] [blame] | 175 | ' |
| 176 | |
| 177 | test_expect_success 'patch5 fails (--no-ignore-whitespace)' ' |
Matthew Ogilvie | 5d59a40 | 2009-11-28 11:38:55 -0700 | [diff] [blame] | 178 | test_must_fail git apply --no-ignore-whitespace patch5.patch |
Giuseppe Bilotta | 86c91f9 | 2009-08-04 13:16:49 +0200 | [diff] [blame] | 179 | ' |
| 180 | |
| 181 | test_done |