t / t4107-apply-ignore-whitespace.shon commit Add global and system-wide gitattributes (6df42ab)
   1#!/bin/sh
   2#
   3# Copyright (c) 2009 Giuseppe Bilotta
   4#
   5
   6test_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
  14cat > patch1.patch <<\EOF
  15diff --git a/main.c b/main.c
  16new 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+}
  42EOF
  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
  51sed -e 's/Z/ /g' > patch2.patch <<\EOF
  52diff --git a/main.c b/main.c
  53--- a/main.c
  54+++ b/main.c
  55@@ -10,6 +10,8 @@
  56Z               print_int(func(i)); /* stuff */
  57Z       }
  58Z
  59+       printf("\n");
  60+
  61Z       return 0;
  62Z}
  63Z
  64EOF
  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
  71sed -e 's/Z/ /g' > patch3.patch <<\EOF
  72diff --git a/main.c b/main.c
  73--- a/main.c
  74+++ b/main.c
  75@@ -10,3 +10,4 @@
  76Z       for (i = 0; i < 10; i++) {
  77Z               print_int(func(i));Z
  78+               /* stuff */
  79Z       }
  80EOF
  81
  82# This patch will fail even if whitespace differences are being ignored,
  83# because of the missing EOL at EOF.
  84
  85sed -e 's/Z/ /g' > patch4.patch <<\EOF
  86diff --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+       };
  93EOF
  94
  95# This patch will fail unless whitespace differences are being ignored.
  96
  97sed -e 's/Z/ /g' > patch5.patch <<\EOF
  98diff --git a/main.c b/main.c
  99--- a/main.c
 100+++ b/main.c
 101@@ -2,2 +2,3 @@
 102Z       void print_int(int num);
 103+       /* a comment */
 104Z       int func(int num);
 105EOF
 106
 107# And this is how the final output should be.  Patches introduce
 108# HTs but the original SP indents are mostly kept.
 109
 110sed -e 's/T/    /g' > main.c.final <<\EOF
 111#include <stdio.h>
 112
 113void print_int(int num);
 114T/* a comment */
 115int func(int num);
 116
 117int main() {
 118       int i;
 119
 120       for (i = 0; i < 10; i++) {
 121               print_int(func(i)); /* stuff */
 122       }
 123
 124Tprintf("\n");
 125
 126       return 0;
 127}
 128
 129int func(int num) {
 130       return num * num;
 131}
 132
 133void print_int(int num) {
 134       printf("%d", num);
 135}
 136EOF
 137
 138test_expect_success 'file creation' '
 139        git apply patch1.patch
 140'
 141
 142test_expect_success 'patch2 fails (retab)' '
 143        test_must_fail git apply patch2.patch
 144'
 145
 146test_expect_success 'patch2 applies with --ignore-whitespace' '
 147        git apply --ignore-whitespace patch2.patch
 148'
 149
 150test_expect_success 'patch2 reverse applies with --ignore-space-change' '
 151        git apply -R --ignore-space-change patch2.patch
 152'
 153
 154git config apply.ignorewhitespace change
 155
 156test_expect_success 'patch2 applies (apply.ignorewhitespace = change)' '
 157        git apply patch2.patch
 158'
 159
 160test_expect_success 'patch3 fails (missing string at EOL)' '
 161        test_must_fail git apply patch3.patch
 162'
 163
 164test_expect_success 'patch4 fails (missing EOL at EOF)' '
 165        test_must_fail git apply patch4.patch
 166'
 167
 168test_expect_success 'patch5 applies (leading whitespace)' '
 169        git apply patch5.patch
 170'
 171
 172test_expect_success 'patches do not mangle whitespace' '
 173        test_cmp main.c main.c.final
 174'
 175
 176test_expect_success 're-create file (with --ignore-whitespace)' '
 177        rm -f main.c &&
 178        git apply patch1.patch
 179'
 180
 181test_expect_success 'patch5 fails (--no-ignore-whitespace)' '
 182        test_must_fail git apply --no-ignore-whitespace patch5.patch
 183'
 184
 185test_done