t / t4124-apply-ws-rule.shon commit builtin-apply: teach whitespace_rules (d5a4164)
   1#!/bin/sh
   2
   3test_description='core.whitespace rules and git-apply'
   4
   5. ./test-lib.sh
   6
   7prepare_test_file () {
   8
   9        # A line that has character X is touched iff RULE is in effect:
  10        #       X  RULE
  11        #       !  trailing-space
  12        #       @  space-before-tab
  13        #       #  indent-with-non-tab
  14        sed -e "s/_/ /g" -e "s/>/       /" <<-\EOF
  15                An_SP in an ordinary line>and a HT.
  16                >A HT.
  17                _>A SP and a HT (@).
  18                _>_A SP, a HT and a SP (@).
  19                _______Seven SP.
  20                ________Eight SP (#).
  21                _______>Seven SP and a HT (@).
  22                ________>Eight SP and a HT (@#).
  23                _______>_Seven SP, a HT and a SP (@).
  24                ________>_Eight SP, a HT and a SP (@#).
  25                _______________Fifteen SP (#).
  26                _______________>Fifteen SP and a HT (@#).
  27                ________________Sixteen SP (#).
  28                ________________>Sixteen SP and a HT (@#).
  29                _____a__Five SP, a non WS, two SP.
  30                A line with a (!) trailing SP_
  31                A line with a (!) trailing HT>
  32        EOF
  33}
  34
  35apply_patch () {
  36        >target &&
  37        sed -e "s|\([ab]\)/file|\1/target|" <patch |
  38        git apply "$@"
  39}
  40
  41test_fix () {
  42
  43        # fix should not barf
  44        apply_patch --whitespace=fix || return 1
  45
  46        # find touched lines
  47        diff file target | sed -n -e "s/^> //p" >fixed
  48
  49        # the changed lines are all expeced to change
  50        fixed_cnt=$(wc -l <fixed)
  51        case "$1" in
  52        '') expect_cnt=$fixed_cnt ;;
  53        ?*) expect_cnt=$(grep "[$1]" <fixed | wc -l) ;;
  54        esac
  55        test $fixed_cnt -eq $expect_cnt || return 1
  56
  57        # and we are not missing anything
  58        case "$1" in
  59        '') expect_cnt=0 ;;
  60        ?*) expect_cnt=$(grep "[$1]" <file | wc -l) ;;
  61        esac
  62        test $fixed_cnt -eq $expect_cnt || return 1
  63
  64        # Get the patch actually applied
  65        git diff-files -p target >fixed-patch
  66        test -s fixed-patch && return 0
  67
  68        # Make sure it is complaint-free
  69        >target
  70        git apply --whitespace=error-all <fixed-patch
  71
  72}
  73
  74test_expect_success setup '
  75
  76        >file &&
  77        git add file &&
  78        prepare_test_file >file &&
  79        git diff-files -p >patch &&
  80        >target &&
  81        git add target
  82
  83'
  84
  85test_expect_success 'whitespace=nowarn, default rule' '
  86
  87        apply_patch --whitespace=nowarn &&
  88        diff file target
  89
  90'
  91
  92test_expect_success 'whitespace=warn, default rule' '
  93
  94        apply_patch --whitespace=warn &&
  95        diff file target
  96
  97'
  98
  99test_expect_success 'whitespace=error-all, default rule' '
 100
 101        apply_patch --whitespace=error-all && return 1
 102        test -s target && return 1
 103        : happy
 104
 105'
 106
 107test_expect_success 'whitespace=error-all, no rule' '
 108
 109        git config core.whitespace -trailing,-space-before,-indent &&
 110        apply_patch --whitespace=error-all &&
 111        diff file target
 112
 113'
 114
 115for t in - ''
 116do
 117        case "$t" in '') tt='!' ;; *) tt= ;; esac
 118        for s in - ''
 119        do
 120                case "$s" in '') ts='@' ;; *) ts= ;; esac
 121                for i in - ''
 122                do
 123                        case "$i" in '') ti='#' ;; *) ti= ;; esac
 124                        rule=${t}trailing,${s}space,${i}indent &&
 125                        test_expect_success "rule=$rule" '
 126                                git config core.whitespace "$rule" &&
 127                                test_fix "$tt$ts$ti"
 128                        '
 129                done
 130        done
 131done
 132
 133test_done