72dd3e8bb4645a3c522e4c115c38a455dbe9c434
   1#!/bin/sh
   2
   3test_description='CRLF conversion all combinations'
   4
   5. ./test-lib.sh
   6
   7if ! test_have_prereq EXPENSIVE
   8then
   9        skip_all="EXPENSIVE not set"
  10        test_done
  11fi
  12
  13
  14compare_files()
  15{
  16        od -c <"$1" >"$1".expect &&
  17        od -c <"$2" >"$2".actual &&
  18        test_cmp "$1".expect "$2".actual &&
  19        rm "$1".expect "$2".actual
  20}
  21
  22compare_ws_file()
  23{
  24        pfx=$1
  25        exp=$2.expect
  26        act=$pfx.actual.$3
  27        od -c <"$2" >"$exp" &&
  28        od -c <"$3" >"$act" &&
  29        test_cmp $exp $act &&
  30        rm $exp $act
  31}
  32
  33create_gitattributes()
  34{
  35        txtbin=$1
  36        case "$txtbin" in
  37                auto)
  38                echo "*.txt text=auto" >.gitattributes
  39                ;;
  40                text)
  41                echo "*.txt text" >.gitattributes
  42                ;;
  43                -text)
  44                echo "*.txt -text" >.gitattributes
  45                ;;
  46                *)
  47                echo >.gitattributes
  48                ;;
  49        esac
  50}
  51
  52create_file_in_repo()
  53{
  54        crlf=$1
  55        txtbin=$2
  56        create_gitattributes "$txtbin" &&
  57        for f in LF CRLF LF_mix_CR CRLF_mix_LF CRLF_nul
  58        do
  59                pfx=crlf_${crlf}_attr_${txtbin}_$f.txt &&
  60                cp $f $pfx && git -c core.autocrlf=$crlf add $pfx
  61        done &&
  62        git commit -m "core.autocrlf $crlf"
  63}
  64
  65check_files_in_repo()
  66{
  67        crlf=$1
  68        txtbin=$2
  69        lfname=$3
  70        crlfname=$4
  71        lfmixcrlf=$5
  72        lfmixcr=$6
  73        crlfnul=$7
  74        pfx=crlf_${crlf}_attr_${txtbin}_ &&
  75        compare_files $lfname ${pfx}LF.txt &&
  76        compare_files $crlfname ${pfx}CRLF.txt &&
  77        compare_files $lfmixcrlf ${pfx}CRLF_mix_LF.txt &&
  78        compare_files $lfmixcr ${pfx}LF_mix_CR.txt &&
  79        compare_files $crlfnul ${pfx}CRLF_nul.txt
  80}
  81
  82
  83check_files_in_ws()
  84{
  85        eol=$1
  86        crlf=$2
  87        txtbin=$3
  88        lfname=$4
  89        crlfname=$5
  90        lfmixcrlf=$6
  91        lfmixcr=$7
  92        crlfnul=$8
  93        create_gitattributes $txtbin &&
  94        git config core.autocrlf $crlf &&
  95        pfx=eol_${eol}_crlf_${crlf}_attr_${txtbin}_ &&
  96        src=crlf_false_attr__ &&
  97        for f in LF CRLF LF_mix_CR CRLF_mix_LF CRLF_nul
  98        do
  99                rm $src$f.txt &&
 100                if test -z "$eol"; then
 101                        git checkout $src$f.txt
 102                else
 103                        git -c core.eol=$eol checkout $src$f.txt
 104                fi
 105        done
 106
 107
 108        test_expect_success "checkout core.eol=$eol core.autocrlf=$crlf gitattributes=$txtbin file=LF" "
 109                compare_ws_file $pfx $lfname    ${src}LF.txt
 110        "
 111        test_expect_success "checkout core.eol=$eol core.autocrlf=$crlf gitattributes=$txtbin file=CRLF" "
 112                compare_ws_file $pfx $crlfname  ${src}CRLF.txt
 113        "
 114        test_expect_success "checkout core.eol=$eol core.autocrlf=$crlf gitattributes=$txtbin file=CRLF_mix_LF" "
 115                compare_ws_file $pfx $lfmixcrlf ${src}CRLF_mix_LF.txt
 116        "
 117        test_expect_success "checkout core.eol=$eol core.autocrlf=$crlf gitattributes=$txtbin file=LF_mix_CR" "
 118                compare_ws_file $pfx $lfmixcr   ${src}LF_mix_CR.txt
 119        "
 120        test_expect_success "checkout core.eol=$eol core.autocrlf=$crlf gitattributes=$txtbin file=CRLF_nul" "
 121                compare_ws_file $pfx $crlfnul   ${src}CRLF_nul.txt
 122        "
 123}
 124
 125#######
 126(
 127        type od >/dev/null &&
 128        printf "line1Q\r\nline2\r\nline3" | q_to_nul >CRLF_nul &&
 129        cat >expect <<-EOF &&
 130        0000000 l i n e 1 \0 \r \n l i n e 2 \r \n l
 131        0000020 i n e 3
 132        0000024
 133EOF
 134        od -c CRLF_nul | sed -e "s/[    ][       ]*/ /g" -e "s/ *$//" >actual
 135        test_cmp expect actual &&
 136        rm expect actual
 137) || {
 138                skip_all="od not found or od -c not usable"
 139                exit 0
 140                test_done
 141}
 142
 143test_expect_success 'setup master' '
 144        echo >.gitattributes &&
 145        git checkout -b master &&
 146        git add .gitattributes &&
 147        git commit -m "add .gitattributes" "" &&
 148        printf "line1\nline2\nline3"     >LF &&
 149        printf "line1\r\nline2\r\nline3" >CRLF &&
 150        printf "line1\r\nline2\nline3"   >CRLF_mix_LF &&
 151        printf "line1\nline2\rline3"     >LF_mix_CR &&
 152        printf "line1\r\nline2\rline3"   >CRLF_mix_CR &&
 153        printf "line1Q\nline2\nline3" | q_to_nul >LF_nul
 154'
 155#  CRLF_nul had been created above
 156
 157test_expect_success 'create files' '
 158        create_file_in_repo false "" &&
 159        create_file_in_repo true  "" &&
 160        create_file_in_repo input "" &&
 161
 162        create_file_in_repo false "auto" &&
 163        create_file_in_repo true  "auto" &&
 164        create_file_in_repo input "auto" &&
 165
 166        create_file_in_repo false "text" &&
 167        create_file_in_repo true  "text" &&
 168        create_file_in_repo input "text" &&
 169
 170        create_file_in_repo false "-text" &&
 171        create_file_in_repo true  "-text" &&
 172        create_file_in_repo input "-text" &&
 173        rm -f *.txt &&
 174        git reset --hard
 175'
 176
 177test_expect_success 'commit empty gitattribues' '
 178        check_files_in_repo false ""      LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul &&
 179        check_files_in_repo true  ""      LF LF   LF          LF_mix_CR CRLF_nul &&
 180        check_files_in_repo input ""      LF LF   LF          LF_mix_CR CRLF_nul
 181'
 182
 183test_expect_success 'commit text=auto' '
 184        check_files_in_repo false "auto"  LF LF   LF          LF_mix_CR CRLF_nul &&
 185        check_files_in_repo true  "auto"  LF LF   LF          LF_mix_CR CRLF_nul &&
 186        check_files_in_repo input "auto"  LF LF   LF          LF_mix_CR CRLF_nul
 187'
 188
 189test_expect_success 'commit text' '
 190        check_files_in_repo false "text"  LF LF   LF          LF_mix_CR LF_nul &&
 191        check_files_in_repo true  "text"  LF LF   LF          LF_mix_CR LF_nul &&
 192        check_files_in_repo input "text"  LF LF   LF          LF_mix_CR LF_nul
 193'
 194
 195test_expect_success 'commit -text' '
 196        check_files_in_repo false "-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul &&
 197        check_files_in_repo true  "-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul &&
 198        check_files_in_repo input "-text" LF CRLF CRLF_mix_LF LF_mix_CR CRLF_nul
 199'
 200
 201################################################################################
 202# Check how files in the repo are changed when they are checked out
 203# How to read the table below:
 204# - check_files_in_ws will check multiple files, see below
 205# - parameter $1 : core.eol               lf | crlf
 206# - parameter $2 : core.autocrlf          false | true | input
 207# - parameter $3 : text in .gitattributs  "" (empty) | auto | text | -text
 208# - parameter $4 : reference for a file with only LF in the repo
 209# - parameter $5 : reference for a file with only CRLF in the repo
 210# - parameter $6 : reference for a file with mixed LF and CRLF in the repo
 211# - parameter $7 : reference for a file with LF and CR in the repo (does somebody uses this ?)
 212# - parameter $8 : reference for a file with CRLF and a NUL (should be handled as binary when auto)
 213
 214check_files_in_ws lf      false  ""       LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
 215check_files_in_ws lf      true   ""       CRLF  CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
 216check_files_in_ws lf      input  ""       LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
 217
 218check_files_in_ws lf      false "auto"    LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
 219check_files_in_ws lf      true  "auto"    CRLF  CRLF  CRLF         LF_mix_CR    CRLF_nul
 220check_files_in_ws lf      input "auto"    LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
 221
 222check_files_in_ws lf      false "text"    LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
 223check_files_in_ws lf      true  "text"    CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
 224check_files_in_ws lf      input "text"    LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
 225
 226check_files_in_ws lf      false "-text"   LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
 227check_files_in_ws lf      true  "-text"   LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
 228check_files_in_ws lf      input "-text"   LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
 229
 230###########
 231#core.autocrlf=input is forbidden with core.eol=crlf
 232check_files_in_ws crlf    false ""        LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
 233check_files_in_ws crlf    true  ""        CRLF  CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
 234
 235check_files_in_ws crlf    false "auto"    CRLF  CRLF  CRLF         LF_mix_CR    CRLF_nul
 236check_files_in_ws crlf    true  "auto"    CRLF  CRLF  CRLF         LF_mix_CR    CRLF_nul
 237
 238check_files_in_ws crlf    false "text"    CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
 239check_files_in_ws crlf    true  "text"    CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
 240
 241check_files_in_ws crlf    false "-text"   LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
 242check_files_in_ws crlf    true  "-text"   LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
 243
 244if test_have_prereq MINGW
 245then
 246check_files_in_ws ""      false ""        LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
 247check_files_in_ws ""      true  ""        CRLF  CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
 248check_files_in_ws ""      false "auto"    LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
 249check_files_in_ws ""      true  "auto"    CRLF  CRLF  CRLF         LF_mix_CR    CRLF_nul
 250check_files_in_ws ""      false "text"    LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
 251check_files_in_ws ""      true  "text"    CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
 252check_files_in_ws ""      false "-text"   LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
 253check_files_in_ws ""      true  "-text"   LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
 254
 255check_files_in_ws native  false ""        LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
 256check_files_in_ws native  true  ""        CRLF  CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
 257check_files_in_ws native  false "auto"    LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
 258check_files_in_ws native  true  "auto"    CRLF  CRLF  CRLF         LF_mix_CR    CRLF_nul
 259check_files_in_ws native  false "text"    LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
 260check_files_in_ws native  true  "text"    CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
 261check_files_in_ws native  false "-text"   LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
 262check_files_in_ws native  true  "-text"   LF    CRLF  CRLF_mix_LF  LF_mix_CR    CRLF_nul
 263fi
 264
 265test_done