3 # Copyright (c) 2008 Matthew Ogilvie
 
   4 # Parts adapted from other tests.
 
   7 test_description='git-cvsserver -kb modes
 
   9 tests -kb mode for binary files when accessing a git
 
  10 repository using cvs CLI client via git-cvsserver server'
 
  15     foundEntry="$(grep "^/$2/" "$1/CVS/Entries")"
 
  16     if [ x"$foundEntry" = x"" ] ; then
 
  17        echo "NOT FOUND: $1 $2 1 $3" >> "${WORKDIR}/marked.log"
 
  20     test x"$(grep "^/$2/" "$1/CVS/Entries" | cut -d/ -f5)" = x"$3"
 
  22     echo "$1 $2 $stat '$3'" >> "${WORKDIR}/marked.log"
 
  27     foundEntry="$(grep "^/$2/" "$1/CVS/Entries")"
 
  28     if [ -r "$1/$2" ] ; then
 
  29         echo "Error: File still exists: $1 $2" >> "${WORKDIR}/marked.log"
 
  32     if [ x"$foundEntry" != x"" ] ; then
 
  33         echo "Error: should not have found: $1 $2" >> "${WORKDIR}/marked.log"
 
  36         echo "Correctly not found: $1 $2" >> "${WORKDIR}/marked.log"
 
  41 check_status_options() {
 
  43     GIT_CONFIG="$git_config" cvs -Q status "$2" > "${WORKDIR}/status.out" 2>&1
 
  45     if [ x"$?" != x"0" ] ; then
 
  46         echo "Error from cvs status: $1 $2" >> "${WORKDIR}/marked.log"
 
  49     got="$(sed -n -e 's/^[      ]*Sticky Options:[      ]*//p' "${WORKDIR}/status.out")"
 
  51     if [ x"$expect" = x"" ] ; then
 
  54     test x"$got" = x"$expect"
 
  56     echo "cvs status: $1 $2 $stat '$3' '$got'" >> "${WORKDIR}/marked.log"
 
  63     skip_all='skipping git-cvsserver tests, cvs not found'
 
  66 if ! test_have_prereq PERL
 
  68     skip_all='skipping git-cvsserver tests, perl not available'
 
  71 perl -e 'use DBI; use DBD::SQLite' >/dev/null 2>&1 || {
 
  72     skip_all='skipping git-cvsserver tests, Perl SQLite interface unavailable'
 
  76 unset GIT_DIR GIT_CONFIG
 
  78 SERVERDIR=$PWD/gitcvs.git
 
  79 git_config="$SERVERDIR/config"
 
  80 CVSROOT=":fork:$SERVERDIR"
 
  81 CVSWORK="$PWD/cvswork"
 
  82 CVS_SERVER=git-cvsserver
 
  83 export CVSROOT CVS_SERVER
 
  85 rm -rf "$CVSWORK" "$SERVERDIR"
 
  86 test_expect_success 'setup' '
 
  87     git config push.default matching &&
 
  88     echo "Simple text file" >textfile.c &&
 
  89     echo "File with embedded NUL: Q <- there" | q_to_nul > binfile.bin &&
 
  91     echo "Another text file" > subdir/file.h &&
 
  92     echo "Another binary: Q (this time CR)" | q_to_cr > subdir/withCr.bin &&
 
  93     echo "Mixed up NUL, but marked text: Q <- there" | q_to_nul > mixedUp.c &&
 
  94     echo "Unspecified" > subdir/unspecified.other &&
 
  95     echo "/*.bin -crlf" > .gitattributes &&
 
  96     echo "/*.c crlf" >> .gitattributes &&
 
  97     echo "subdir/*.bin -crlf" >> .gitattributes &&
 
  98     echo "subdir/*.c crlf" >> .gitattributes &&
 
  99     echo "subdir/file.h crlf" >> .gitattributes &&
 
 100     git add .gitattributes textfile.c binfile.bin mixedUp.c subdir/* &&
 
 101     git commit -q -m "First Commit" &&
 
 102     git clone -q --bare "$WORKDIR/.git" "$SERVERDIR" >/dev/null 2>&1 &&
 
 103     GIT_DIR="$SERVERDIR" git config --bool gitcvs.enabled true &&
 
 104     GIT_DIR="$SERVERDIR" git config gitcvs.logfile "$SERVERDIR/gitcvs.log"
 
 107 test_expect_success 'cvs co (default crlf)' '
 
 108     GIT_CONFIG="$git_config" cvs -Q co -d cvswork master >cvs.log 2>&1 &&
 
 109     test x"$(grep '/-k' cvswork/CVS/Entries cvswork/subdir/CVS/Entries)" = x""
 
 113 test_expect_success 'cvs co (allbinary)' '
 
 114     GIT_DIR="$SERVERDIR" git config --bool gitcvs.allbinary true &&
 
 115     GIT_CONFIG="$git_config" cvs -Q co -d cvswork master >cvs.log 2>&1 &&
 
 116     marked_as cvswork textfile.c -kb &&
 
 117     marked_as cvswork binfile.bin -kb &&
 
 118     marked_as cvswork .gitattributes -kb &&
 
 119     marked_as cvswork mixedUp.c -kb &&
 
 120     marked_as cvswork/subdir withCr.bin -kb &&
 
 121     marked_as cvswork/subdir file.h -kb &&
 
 122     marked_as cvswork/subdir unspecified.other -kb
 
 125 rm -rf cvswork cvs.log
 
 126 test_expect_success 'cvs co (use attributes/allbinary)' '
 
 127     GIT_DIR="$SERVERDIR" git config --bool gitcvs.usecrlfattr true &&
 
 128     GIT_CONFIG="$git_config" cvs -Q co -d cvswork master >cvs.log 2>&1 &&
 
 129     marked_as cvswork textfile.c "" &&
 
 130     marked_as cvswork binfile.bin -kb &&
 
 131     marked_as cvswork .gitattributes -kb &&
 
 132     marked_as cvswork mixedUp.c "" &&
 
 133     marked_as cvswork/subdir withCr.bin -kb &&
 
 134     marked_as cvswork/subdir file.h "" &&
 
 135     marked_as cvswork/subdir unspecified.other -kb
 
 139 test_expect_success 'cvs co (use attributes)' '
 
 140     GIT_DIR="$SERVERDIR" git config --bool gitcvs.allbinary false &&
 
 141     GIT_CONFIG="$git_config" cvs -Q co -d cvswork master >cvs.log 2>&1 &&
 
 142     marked_as cvswork textfile.c "" &&
 
 143     marked_as cvswork binfile.bin -kb &&
 
 144     marked_as cvswork .gitattributes "" &&
 
 145     marked_as cvswork mixedUp.c "" &&
 
 146     marked_as cvswork/subdir withCr.bin -kb &&
 
 147     marked_as cvswork/subdir file.h "" &&
 
 148     marked_as cvswork/subdir unspecified.other ""
 
 151 test_expect_success 'adding files' '
 
 154     echo "more text" > src.c &&
 
 155     GIT_CONFIG="$git_config" cvs -Q add src.c >cvs.log 2>&1 &&
 
 156     marked_as . src.c "" &&
 
 157     echo "pseudo-binary" > temp.bin
 
 159     GIT_CONFIG="$git_config" cvs -Q add subdir/temp.bin >cvs.log 2>&1 &&
 
 160     marked_as subdir temp.bin "-kb" &&
 
 162     GIT_CONFIG="$git_config" cvs -Q ci -m "adding files" >cvs.log 2>&1 &&
 
 163     marked_as . temp.bin "-kb" &&
 
 168 test_expect_success 'updating' '
 
 169     git pull gitcvs.git &&
 
 170     echo 'hi' > subdir/newfile.bin &&
 
 171     echo 'junk' > subdir/file.h &&
 
 172     echo 'hi' > subdir/newfile.c &&
 
 173     echo 'hello' >> binfile.bin &&
 
 174     git add subdir/newfile.bin subdir/file.h subdir/newfile.c binfile.bin &&
 
 175     git commit -q -m "Add and change some files" &&
 
 176     git push gitcvs.git >/dev/null &&
 
 178     GIT_CONFIG="$git_config" cvs -Q update
 
 180     marked_as cvswork textfile.c "" &&
 
 181     marked_as cvswork binfile.bin -kb &&
 
 182     marked_as cvswork .gitattributes "" &&
 
 183     marked_as cvswork mixedUp.c "" &&
 
 184     marked_as cvswork/subdir withCr.bin -kb &&
 
 185     marked_as cvswork/subdir file.h "" &&
 
 186     marked_as cvswork/subdir unspecified.other "" &&
 
 187     marked_as cvswork/subdir newfile.bin -kb &&
 
 188     marked_as cvswork/subdir newfile.c "" &&
 
 189     echo "File with embedded NUL: Q <- there" | q_to_nul > tmpExpect1 &&
 
 190     echo "hello" >> tmpExpect1 &&
 
 191     cmp cvswork/binfile.bin tmpExpect1
 
 195 test_expect_success 'cvs co (use attributes/guess)' '
 
 196     GIT_DIR="$SERVERDIR" git config gitcvs.allbinary guess &&
 
 197     GIT_CONFIG="$git_config" cvs -Q co -d cvswork master >cvs.log 2>&1 &&
 
 198     marked_as cvswork textfile.c "" &&
 
 199     marked_as cvswork binfile.bin -kb &&
 
 200     marked_as cvswork .gitattributes "" &&
 
 201     marked_as cvswork mixedUp.c "" &&
 
 202     marked_as cvswork/subdir withCr.bin -kb &&
 
 203     marked_as cvswork/subdir file.h "" &&
 
 204     marked_as cvswork/subdir unspecified.other "" &&
 
 205     marked_as cvswork/subdir newfile.bin -kb &&
 
 206     marked_as cvswork/subdir newfile.c ""
 
 209 test_expect_success 'setup multi-line files' '
 
 213       echo "line 4 with NUL: Q <-" ) | q_to_nul > multiline.c &&
 
 214     git add multiline.c &&
 
 218       echo "line 4" ) | q_to_nul > multilineTxt.c &&
 
 219     git add multilineTxt.c &&
 
 220     git commit -q -m "multiline files" &&
 
 221     git push gitcvs.git >/dev/null
 
 225 test_expect_success 'cvs co (guess)' '
 
 226     GIT_DIR="$SERVERDIR" git config --bool gitcvs.usecrlfattr false &&
 
 227     GIT_CONFIG="$git_config" cvs -Q co -d cvswork master >cvs.log 2>&1 &&
 
 228     marked_as cvswork textfile.c "" &&
 
 229     marked_as cvswork binfile.bin -kb &&
 
 230     marked_as cvswork .gitattributes "" &&
 
 231     marked_as cvswork mixedUp.c -kb &&
 
 232     marked_as cvswork multiline.c -kb &&
 
 233     marked_as cvswork multilineTxt.c "" &&
 
 234     marked_as cvswork/subdir withCr.bin -kb &&
 
 235     marked_as cvswork/subdir file.h "" &&
 
 236     marked_as cvswork/subdir unspecified.other "" &&
 
 237     marked_as cvswork/subdir newfile.bin "" &&
 
 238     marked_as cvswork/subdir newfile.c ""
 
 241 test_expect_success 'cvs co another copy (guess)' '
 
 242     GIT_CONFIG="$git_config" cvs -Q co -d cvswork2 master >cvs.log 2>&1 &&
 
 243     marked_as cvswork2 textfile.c "" &&
 
 244     marked_as cvswork2 binfile.bin -kb &&
 
 245     marked_as cvswork2 .gitattributes "" &&
 
 246     marked_as cvswork2 mixedUp.c -kb &&
 
 247     marked_as cvswork2 multiline.c -kb &&
 
 248     marked_as cvswork2 multilineTxt.c "" &&
 
 249     marked_as cvswork2/subdir withCr.bin -kb &&
 
 250     marked_as cvswork2/subdir file.h "" &&
 
 251     marked_as cvswork2/subdir unspecified.other "" &&
 
 252     marked_as cvswork2/subdir newfile.bin "" &&
 
 253     marked_as cvswork2/subdir newfile.c ""
 
 256 test_expect_success 'cvs status - sticky options' '
 
 257     check_status_options cvswork2 textfile.c "" &&
 
 258     check_status_options cvswork2 binfile.bin -kb &&
 
 259     check_status_options cvswork2 .gitattributes "" &&
 
 260     check_status_options cvswork2 mixedUp.c -kb &&
 
 261     check_status_options cvswork2 multiline.c -kb &&
 
 262     check_status_options cvswork2 multilineTxt.c "" &&
 
 263     check_status_options cvswork2/subdir withCr.bin -kb &&
 
 264     check_status_options cvswork2 subdir/withCr.bin -kb &&
 
 265     check_status_options cvswork2/subdir file.h "" &&
 
 266     check_status_options cvswork2 subdir/file.h "" &&
 
 267     check_status_options cvswork2/subdir unspecified.other "" &&
 
 268     check_status_options cvswork2/subdir newfile.bin "" &&
 
 269     check_status_options cvswork2/subdir newfile.c ""
 
 272 test_expect_success 'add text (guess)' '
 
 274     echo "simpleText" > simpleText.c &&
 
 275     GIT_CONFIG="$git_config" cvs -Q add simpleText.c
 
 277     marked_as cvswork simpleText.c ""
 
 280 test_expect_success 'add bin (guess)' '
 
 282     echo "simpleBin: NUL: Q <- there" | q_to_nul > simpleBin.bin &&
 
 283     GIT_CONFIG="$git_config" cvs -Q add simpleBin.bin
 
 285     marked_as cvswork simpleBin.bin -kb
 
 288 test_expect_success 'remove files (guess)' '
 
 290     GIT_CONFIG="$git_config" cvs -Q rm -f subdir/file.h &&
 
 292     GIT_CONFIG="$git_config" cvs -Q rm -f withCr.bin
 
 294     marked_as cvswork/subdir withCr.bin -kb &&
 
 295     marked_as cvswork/subdir file.h ""
 
 298 test_expect_success 'cvs ci (guess)' '
 
 300     GIT_CONFIG="$git_config" cvs -Q ci -m "add/rm files" >cvs.log 2>&1
 
 302     marked_as cvswork textfile.c "" &&
 
 303     marked_as cvswork binfile.bin -kb &&
 
 304     marked_as cvswork .gitattributes "" &&
 
 305     marked_as cvswork mixedUp.c -kb &&
 
 306     marked_as cvswork multiline.c -kb &&
 
 307     marked_as cvswork multilineTxt.c "" &&
 
 308     not_present cvswork/subdir withCr.bin &&
 
 309     not_present cvswork/subdir file.h &&
 
 310     marked_as cvswork/subdir unspecified.other "" &&
 
 311     marked_as cvswork/subdir newfile.bin "" &&
 
 312     marked_as cvswork/subdir newfile.c "" &&
 
 313     marked_as cvswork simpleBin.bin -kb &&
 
 314     marked_as cvswork simpleText.c ""
 
 317 test_expect_success 'update subdir of other copy (guess)' '
 
 318     (cd cvswork2/subdir &&
 
 319     GIT_CONFIG="$git_config" cvs -Q update
 
 321     marked_as cvswork2 textfile.c "" &&
 
 322     marked_as cvswork2 binfile.bin -kb &&
 
 323     marked_as cvswork2 .gitattributes "" &&
 
 324     marked_as cvswork2 mixedUp.c -kb &&
 
 325     marked_as cvswork2 multiline.c -kb &&
 
 326     marked_as cvswork2 multilineTxt.c "" &&
 
 327     not_present cvswork2/subdir withCr.bin &&
 
 328     not_present cvswork2/subdir file.h &&
 
 329     marked_as cvswork2/subdir unspecified.other "" &&
 
 330     marked_as cvswork2/subdir newfile.bin "" &&
 
 331     marked_as cvswork2/subdir newfile.c "" &&
 
 332     not_present cvswork2 simpleBin.bin &&
 
 333     not_present cvswork2 simpleText.c
 
 336 echo "starting update/merge" >> "${WORKDIR}/marked.log"
 
 337 test_expect_success 'update/merge full other copy (guess)' '
 
 338     git pull gitcvs.git master &&
 
 339     sed "s/3/replaced_3/" < multilineTxt.c > ml.temp &&
 
 340     mv ml.temp multilineTxt.c &&
 
 341     git add multilineTxt.c &&
 
 342     git commit -q -m "modify multiline file" >> "${WORKDIR}/marked.log" &&
 
 343     git push gitcvs.git >/dev/null &&
 
 345     sed "s/1/replaced_1/" < multilineTxt.c > ml.temp &&
 
 346     mv ml.temp multilineTxt.c &&
 
 347     GIT_CONFIG="$git_config" cvs update > cvs.log 2>&1
 
 349     marked_as cvswork2 textfile.c "" &&
 
 350     marked_as cvswork2 binfile.bin -kb &&
 
 351     marked_as cvswork2 .gitattributes "" &&
 
 352     marked_as cvswork2 mixedUp.c -kb &&
 
 353     marked_as cvswork2 multiline.c -kb &&
 
 354     marked_as cvswork2 multilineTxt.c "" &&
 
 355     not_present cvswork2/subdir withCr.bin &&
 
 356     not_present cvswork2/subdir file.h &&
 
 357     marked_as cvswork2/subdir unspecified.other "" &&
 
 358     marked_as cvswork2/subdir newfile.bin "" &&
 
 359     marked_as cvswork2/subdir newfile.c "" &&
 
 360     marked_as cvswork2 simpleBin.bin -kb &&
 
 361     marked_as cvswork2 simpleText.c "" &&
 
 362     echo "line replaced_1" > tmpExpect2 &&
 
 363     echo "line 2" >> tmpExpect2 &&
 
 364     echo "line replaced_3" >> tmpExpect2 &&
 
 365     echo "line 4" | q_to_nul >> tmpExpect2 &&
 
 366     cmp cvswork2/multilineTxt.c tmpExpect2