Merge branch 'ab/commit-empty-message'
[gitweb.git] / t / t4124-apply-ws-rule.sh
index fac2093d7f20d502f41f895d2ccdfccd5e639e2b..8d46df6c3abd0643031106dac15758fdbe5f2ccd 100755 (executable)
@@ -11,21 +11,22 @@ prepare_test_file () {
        #       !  trailing-space
        #       @  space-before-tab
        #       #  indent-with-non-tab
+       #       %  tab-in-indent
        sed -e "s/_/ /g" -e "s/>/       /" <<-\EOF
                An_SP in an ordinary line>and a HT.
-               >A HT.
-               _>A SP and a HT (@).
-               _>_A SP, a HT and a SP (@).
+               >A HT (%).
+               _>A SP and a HT (@%).
+               _>_A SP, a HT and a SP (@%).
                _______Seven SP.
                ________Eight SP (#).
-               _______>Seven SP and a HT (@).
-               ________>Eight SP and a HT (@#).
-               _______>_Seven SP, a HT and a SP (@).
-               ________>_Eight SP, a HT and a SP (@#).
+               _______>Seven SP and a HT (@%).
+               ________>Eight SP and a HT (@#%).
+               _______>_Seven SP, a HT and a SP (@%).
+               ________>_Eight SP, a HT and a SP (@#%).
                _______________Fifteen SP (#).
-               _______________>Fifteen SP and a HT (@#).
+               _______________>Fifteen SP and a HT (@#%).
                ________________Sixteen SP (#).
-               ________________>Sixteen SP and a HT (@#).
+               ________________>Sixteen SP and a HT (@#%).
                _____a__Five SP, a non WS, two SP.
                A line with a (!) trailing SP_
                A line with a (!) trailing HT>
@@ -39,7 +40,6 @@ apply_patch () {
 }
 
 test_fix () {
-
        # fix should not barf
        apply_patch --whitespace=fix || return 1
 
@@ -130,20 +130,25 @@ do
                for i in - ''
                do
                        case "$i" in '') ti='#' ;; *) ti= ;; esac
-                       rule=${t}trailing,${s}space,${i}indent
-
-                       rm -f .gitattributes
-                       test_expect_success "rule=$rule" '
-                               git config core.whitespace "$rule" &&
-                               test_fix "$tt$ts$ti"
-                       '
-
-                       test_expect_success "rule=$rule (attributes)" '
-                               git config --unset core.whitespace &&
-                               echo "target whitespace=$rule" >.gitattributes &&
-                               test_fix "$tt$ts$ti"
-                       '
-
+                       for h in - ''
+                       do
+                               [ -z "$h$i" ] && continue
+                               case "$h" in '') th='%' ;; *) th= ;; esac
+                               rule=${t}trailing,${s}space,${i}indent,${h}tab
+
+                               rm -f .gitattributes
+                               test_expect_success "rule=$rule" '
+                                       git config core.whitespace "$rule" &&
+                                       test_fix "$tt$ts$ti$th"
+                               '
+
+                               test_expect_success "rule=$rule (attributes)" '
+                                       git config --unset core.whitespace &&
+                                       echo "target whitespace=$rule" >.gitattributes &&
+                                       test_fix "$tt$ts$ti$th"
+                               '
+
+                       done
                done
        done
 done
@@ -170,4 +175,265 @@ test_expect_success 'trailing whitespace & no newline at the end of file' '
        grep "^$" target
 '
 
+test_expect_success 'blank at EOF with --whitespace=fix (1)' '
+       : these can fail depending on what we did before
+       git config --unset core.whitespace
+       rm -f .gitattributes
+
+       { echo a; echo b; echo c; } >one &&
+       git add one &&
+       { echo a; echo b; echo c; } >expect &&
+       { cat expect; echo; } >one &&
+       git diff -- one >patch &&
+
+       git checkout one &&
+       git apply --whitespace=fix patch &&
+       test_cmp expect one
+'
+
+test_expect_success 'blank at EOF with --whitespace=fix (2)' '
+       { echo a; echo b; echo c; } >one &&
+       git add one &&
+       { echo a; echo c; } >expect &&
+       { cat expect; echo; echo; } >one &&
+       git diff -- one >patch &&
+
+       git checkout one &&
+       git apply --whitespace=fix patch &&
+       test_cmp expect one
+'
+
+test_expect_success 'blank at EOF with --whitespace=fix (3)' '
+       { echo a; echo b; echo; } >one &&
+       git add one &&
+       { echo a; echo c; echo; } >expect &&
+       { cat expect; echo; echo; } >one &&
+       git diff -- one >patch &&
+
+       git checkout one &&
+       git apply --whitespace=fix patch &&
+       test_cmp expect one
+'
+
+test_expect_success 'blank at end of hunk, not at EOF with --whitespace=fix' '
+       { echo a; echo b; echo; echo; echo; echo; echo; echo d; } >one &&
+       git add one &&
+       { echo a; echo c; echo; echo; echo; echo; echo; echo; echo d; } >expect &&
+       cp expect one &&
+       git diff -- one >patch &&
+
+       git checkout one &&
+       git apply --whitespace=fix patch &&
+       test_cmp expect one
+'
+
+test_expect_success 'blank at EOF with --whitespace=warn' '
+       { echo a; echo b; echo c; } >one &&
+       git add one &&
+       echo >>one &&
+       cat one >expect &&
+       git diff -- one >patch &&
+
+       git checkout one &&
+       git apply --whitespace=warn patch 2>error &&
+       test_cmp expect one &&
+       grep "new blank line at EOF" error
+'
+
+test_expect_success 'blank at EOF with --whitespace=error' '
+       { echo a; echo b; echo c; } >one &&
+       git add one &&
+       cat one >expect &&
+       echo >>one &&
+       git diff -- one >patch &&
+
+       git checkout one &&
+       test_must_fail git apply --whitespace=error patch 2>error &&
+       test_cmp expect one &&
+       grep "new blank line at EOF" error
+'
+
+test_expect_success 'blank but not empty at EOF' '
+       { echo a; echo b; echo c; } >one &&
+       git add one &&
+       echo "   " >>one &&
+       cat one >expect &&
+       git diff -- one >patch &&
+
+       git checkout one &&
+       git apply --whitespace=warn patch 2>error &&
+       test_cmp expect one &&
+       grep "new blank line at EOF" error
+'
+
+test_expect_success 'applying beyond EOF requires one non-blank context line' '
+       { echo; echo; echo; echo; } >one &&
+       git add one &&
+       { echo b; } >>one &&
+       git diff -- one >patch &&
+
+       git checkout one &&
+       { echo a; echo; } >one &&
+       cp one expect &&
+       test_must_fail git apply --whitespace=fix patch &&
+       test_cmp one expect &&
+       test_must_fail git apply --ignore-space-change --whitespace=fix patch &&
+       test_cmp one expect
+'
+
+test_expect_success 'tons of blanks at EOF should not apply' '
+       for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16; do
+               echo; echo; echo; echo;
+       done >one &&
+       git add one &&
+       echo a >>one &&
+       git diff -- one >patch &&
+
+       >one &&
+       test_must_fail git apply --whitespace=fix patch &&
+       test_must_fail git apply --ignore-space-change --whitespace=fix patch
+'
+
+test_expect_success 'missing blank line at end with --whitespace=fix' '
+       echo a >one &&
+       echo >>one &&
+       git add one &&
+       echo b >>one &&
+       cp one expect &&
+       git diff -- one >patch &&
+       echo a >one &&
+       cp one saved-one &&
+       test_must_fail git apply patch &&
+       git apply --whitespace=fix patch &&
+       test_cmp one expect &&
+       mv saved-one one &&
+       git apply --ignore-space-change --whitespace=fix patch &&
+       test_cmp one expect
+'
+
+test_expect_success 'two missing blank lines at end with --whitespace=fix' '
+       { echo a; echo; echo b; echo c; } >one &&
+       cp one no-blank-lines &&
+       { echo; echo; } >>one &&
+       git add one &&
+       echo d >>one &&
+       cp one expect &&
+       echo >>one &&
+       git diff -- one >patch &&
+       cp no-blank-lines one &&
+       test_must_fail git apply patch &&
+       git apply --whitespace=fix patch &&
+       test_cmp one expect &&
+       mv no-blank-lines one &&
+       test_must_fail git apply patch &&
+       git apply --ignore-space-change --whitespace=fix patch &&
+       test_cmp one expect
+'
+
+test_expect_success 'shrink file with tons of missing blanks at end of file' '
+       { echo a; echo b; echo c; } >one &&
+       cp one no-blank-lines &&
+       for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16; do
+               echo; echo; echo; echo;
+       done >>one &&
+       git add one &&
+       echo a >one &&
+       cp one expect &&
+       git diff -- one >patch &&
+       cp no-blank-lines one &&
+       test_must_fail git apply patch &&
+       git apply --whitespace=fix patch &&
+       test_cmp one expect &&
+       mv no-blank-lines one &&
+       git apply --ignore-space-change --whitespace=fix patch &&
+       test_cmp one expect
+'
+
+test_expect_success 'missing blanks at EOF must only match blank lines' '
+       { echo a; echo b; } >one &&
+       git add one &&
+       { echo c; echo d; } >>one &&
+       git diff -- one >patch &&
+
+       echo a >one &&
+       test_must_fail git apply patch
+       test_must_fail git apply --whitespace=fix patch &&
+       test_must_fail git apply --ignore-space-change --whitespace=fix patch
+'
+
+sed -e's/Z//' >one <<EOF
+a
+b
+c
+                     Z
+EOF
+
+test_expect_success 'missing blank line should match context line with spaces' '
+       git add one &&
+       echo d >>one &&
+       git diff -- one >patch &&
+       { echo a; echo b; echo c; } >one &&
+       cp one expect &&
+       { echo; echo d; } >>expect &&
+       git add one &&
+
+       git apply --whitespace=fix patch &&
+       test_cmp one expect
+'
+
+sed -e's/Z//' >one <<EOF
+a
+b
+c
+                     Z
+EOF
+
+test_expect_success 'same, but with the --ignore-space-option' '
+       git add one &&
+       echo d >>one &&
+       cp one expect &&
+       git diff -- one >patch &&
+       { echo a; echo b; echo c; } >one &&
+       git add one &&
+
+       git checkout-index -f one &&
+       git apply --ignore-space-change --whitespace=fix patch &&
+       test_cmp one expect
+'
+
+test_expect_success 'same, but with CR-LF line endings && cr-at-eol set' '
+       git config core.whitespace cr-at-eol &&
+       printf "a\r\n" >one &&
+       printf "b\r\n" >>one &&
+       printf "c\r\n" >>one &&
+       cp one save-one &&
+       printf "                 \r\n" >>one
+       git add one &&
+       printf "d\r\n" >>one &&
+       cp one expect &&
+       git diff -- one >patch &&
+       mv save-one one &&
+
+       git apply --ignore-space-change --whitespace=fix patch &&
+       test_cmp one expect
+'
+
+test_expect_success 'same, but with CR-LF line endings && cr-at-eol unset' '
+       git config --unset core.whitespace &&
+       printf "a\r\n" >one &&
+       printf "b\r\n" >>one &&
+       printf "c\r\n" >>one &&
+       cp one save-one &&
+       printf "                 \r\n" >>one
+       git add one &&
+       cp one expect &&
+       printf "d\r\n" >>one &&
+       git diff -- one >patch &&
+       mv save-one one &&
+       echo d >>expect &&
+
+       git apply --ignore-space-change --whitespace=fix patch &&
+       test_cmp one expect
+'
+
 test_done