#!/bin/sh # # Copyright (c) 2008 Matthew Ogilvie # Parts adapted from other tests. # setglobal test_description = ''git-cvsserver -kb modes tests -kb mode for binary files when accessing a git repository using cvs CLI client via git-cvsserver server'' source ./test-lib.sh proc marked_as { setglobal foundEntry = $[grep "^/$2/" "$1/CVS/Entries] if test x"$foundEntry" = x"" { echo "NOT FOUND: $1 $2 1 $3" >> "$(WORKDIR)/marked.log" return 1 } test x"$[grep "^/$2/" "$1/CVS/Entries" | cut -d/ -f5]" = x"$3" setglobal stat = $Status echo "$1 $2 $stat '$3'" >> "$(WORKDIR)/marked.log" return $stat } proc not_present { setglobal foundEntry = $[grep "^/$2/" "$1/CVS/Entries] if test -r "$1/$2" { echo "Error: File still exists: $1 $2" >> "$(WORKDIR)/marked.log" return 1; } if test x"$foundEntry" != x"" { echo "Error: should not have found: $1 $2" >> "$(WORKDIR)/marked.log" return 1; } else { echo "Correctly not found: $1 $2" >> "$(WORKDIR)/marked.log" return 0; } } proc check_status_options { shell {cd $1 && env GIT_CONFIG=$git_config cvs -Q status $2 > "$(WORKDIR)/status.out" !2 > !1 } if test x"$Status" != x"0" { echo "Error from cvs status: $1 $2" >> "$(WORKDIR)/marked.log" return 1; } setglobal got = $[sed -n -e 's/^[ ]*Sticky Options:[ ]*//p' "$(WORKDIR)/status.out] setglobal expect = $3 if test x"$expect" = x"" { setglobal expect = '"(none)'" } test x"$got" = x"$expect" setglobal stat = $Status echo "cvs status: $1 $2 $stat '$3' '$got'" >> "$(WORKDIR)/marked.log" return $stat } cvs >/dev/null !2 > !1 if test $Status -ne 1 { setglobal skip_all = ''skipping git-cvsserver tests, cvs not found'' test_done } if ! test_have_prereq PERL { setglobal skip_all = ''skipping git-cvsserver tests, perl not available'' test_done } perl -e 'use DBI; use DBD::SQLite' >/dev/null !2 > !1 || do { setglobal skip_all = ''skipping git-cvsserver tests, Perl SQLite interface unavailable'' test_done } unset GIT_DIR GIT_CONFIG setglobal WORKDIR = $PWD setglobal SERVERDIR = "$PWD/gitcvs.git" setglobal git_config = ""$SERVERDIR/config"" setglobal CVSROOT = "":fork:$SERVERDIR"" setglobal CVSWORK = ""$PWD/cvswork"" setglobal CVS_SERVER = 'git-cvsserver' export CVSROOT CVS_SERVER rm -rf $CVSWORK $SERVERDIR test_expect_success 'setup' ' git config push.default matching && echo "Simple text file" >textfile.c && echo "File with embedded NUL: Q <- there" | q_to_nul > binfile.bin && mkdir subdir && echo "Another text file" > subdir/file.h && echo "Another binary: Q (this time CR)" | q_to_cr > subdir/withCr.bin && echo "Mixed up NUL, but marked text: Q <- there" | q_to_nul > mixedUp.c && echo "Unspecified" > subdir/unspecified.other && echo "/*.bin -crlf" > .gitattributes && echo "/*.c crlf" >> .gitattributes && echo "subdir/*.bin -crlf" >> .gitattributes && echo "subdir/*.c crlf" >> .gitattributes && echo "subdir/file.h crlf" >> .gitattributes && git add .gitattributes textfile.c binfile.bin mixedUp.c subdir/* && git commit -q -m "First Commit" && git clone -q --bare "$WORKDIR/.git" "$SERVERDIR" >/dev/null 2>&1 && GIT_DIR="$SERVERDIR" git config --bool gitcvs.enabled true && GIT_DIR="$SERVERDIR" git config gitcvs.logfile "$SERVERDIR/gitcvs.log" ' test_expect_success 'cvs co (default crlf)' ' GIT_CONFIG="$git_config" cvs -Q co -d cvswork master >cvs.log 2>&1 && test x"$(grep '/-k' cvswork/CVS/Entries cvswork/subdir/CVS/Entries)" = x"" ' rm -rf cvswork test_expect_success 'cvs co (allbinary)' ' GIT_DIR="$SERVERDIR" git config --bool gitcvs.allbinary true && GIT_CONFIG="$git_config" cvs -Q co -d cvswork master >cvs.log 2>&1 && marked_as cvswork textfile.c -kb && marked_as cvswork binfile.bin -kb && marked_as cvswork .gitattributes -kb && marked_as cvswork mixedUp.c -kb && marked_as cvswork/subdir withCr.bin -kb && marked_as cvswork/subdir file.h -kb && marked_as cvswork/subdir unspecified.other -kb ' rm -rf cvswork cvs.log test_expect_success 'cvs co (use attributes/allbinary)' ' GIT_DIR="$SERVERDIR" git config --bool gitcvs.usecrlfattr true && GIT_CONFIG="$git_config" cvs -Q co -d cvswork master >cvs.log 2>&1 && marked_as cvswork textfile.c "" && marked_as cvswork binfile.bin -kb && marked_as cvswork .gitattributes -kb && marked_as cvswork mixedUp.c "" && marked_as cvswork/subdir withCr.bin -kb && marked_as cvswork/subdir file.h "" && marked_as cvswork/subdir unspecified.other -kb ' rm -rf cvswork test_expect_success 'cvs co (use attributes)' ' GIT_DIR="$SERVERDIR" git config --bool gitcvs.allbinary false && GIT_CONFIG="$git_config" cvs -Q co -d cvswork master >cvs.log 2>&1 && marked_as cvswork textfile.c "" && marked_as cvswork binfile.bin -kb && marked_as cvswork .gitattributes "" && marked_as cvswork mixedUp.c "" && marked_as cvswork/subdir withCr.bin -kb && marked_as cvswork/subdir file.h "" && marked_as cvswork/subdir unspecified.other "" ' test_expect_success 'adding files' ' (cd cvswork && (cd subdir && echo "more text" > src.c && GIT_CONFIG="$git_config" cvs -Q add src.c >cvs.log 2>&1 && marked_as . src.c "" && echo "pseudo-binary" > temp.bin ) && GIT_CONFIG="$git_config" cvs -Q add subdir/temp.bin >cvs.log 2>&1 && marked_as subdir temp.bin "-kb" && cd subdir && GIT_CONFIG="$git_config" cvs -Q ci -m "adding files" >cvs.log 2>&1 && marked_as . temp.bin "-kb" && marked_as . src.c "" ) ' test_expect_success 'updating' ' git pull gitcvs.git && echo 'hi' > subdir/newfile.bin && echo 'junk' > subdir/file.h && echo 'hi' > subdir/newfile.c && echo 'hello' >> binfile.bin && git add subdir/newfile.bin subdir/file.h subdir/newfile.c binfile.bin && git commit -q -m "Add and change some files" && git push gitcvs.git >/dev/null && (cd cvswork && GIT_CONFIG="$git_config" cvs -Q update ) && marked_as cvswork textfile.c "" && marked_as cvswork binfile.bin -kb && marked_as cvswork .gitattributes "" && marked_as cvswork mixedUp.c "" && marked_as cvswork/subdir withCr.bin -kb && marked_as cvswork/subdir file.h "" && marked_as cvswork/subdir unspecified.other "" && marked_as cvswork/subdir newfile.bin -kb && marked_as cvswork/subdir newfile.c "" && echo "File with embedded NUL: Q <- there" | q_to_nul > tmpExpect1 && echo "hello" >> tmpExpect1 && cmp cvswork/binfile.bin tmpExpect1 ' rm -rf cvswork test_expect_success 'cvs co (use attributes/guess)' ' GIT_DIR="$SERVERDIR" git config gitcvs.allbinary guess && GIT_CONFIG="$git_config" cvs -Q co -d cvswork master >cvs.log 2>&1 && marked_as cvswork textfile.c "" && marked_as cvswork binfile.bin -kb && marked_as cvswork .gitattributes "" && marked_as cvswork mixedUp.c "" && marked_as cvswork/subdir withCr.bin -kb && marked_as cvswork/subdir file.h "" && marked_as cvswork/subdir unspecified.other "" && marked_as cvswork/subdir newfile.bin -kb && marked_as cvswork/subdir newfile.c "" ' test_expect_success 'setup multi-line files' ' ( echo "line 1" && echo "line 2" && echo "line 3" && echo "line 4 with NUL: Q <-" ) | q_to_nul > multiline.c && git add multiline.c && ( echo "line 1" && echo "line 2" && echo "line 3" && echo "line 4" ) | q_to_nul > multilineTxt.c && git add multilineTxt.c && git commit -q -m "multiline files" && git push gitcvs.git >/dev/null ' rm -rf cvswork test_expect_success 'cvs co (guess)' ' GIT_DIR="$SERVERDIR" git config --bool gitcvs.usecrlfattr false && GIT_CONFIG="$git_config" cvs -Q co -d cvswork master >cvs.log 2>&1 && marked_as cvswork textfile.c "" && marked_as cvswork binfile.bin -kb && marked_as cvswork .gitattributes "" && marked_as cvswork mixedUp.c -kb && marked_as cvswork multiline.c -kb && marked_as cvswork multilineTxt.c "" && marked_as cvswork/subdir withCr.bin -kb && marked_as cvswork/subdir file.h "" && marked_as cvswork/subdir unspecified.other "" && marked_as cvswork/subdir newfile.bin "" && marked_as cvswork/subdir newfile.c "" ' test_expect_success 'cvs co another copy (guess)' ' GIT_CONFIG="$git_config" cvs -Q co -d cvswork2 master >cvs.log 2>&1 && marked_as cvswork2 textfile.c "" && marked_as cvswork2 binfile.bin -kb && marked_as cvswork2 .gitattributes "" && marked_as cvswork2 mixedUp.c -kb && marked_as cvswork2 multiline.c -kb && marked_as cvswork2 multilineTxt.c "" && marked_as cvswork2/subdir withCr.bin -kb && marked_as cvswork2/subdir file.h "" && marked_as cvswork2/subdir unspecified.other "" && marked_as cvswork2/subdir newfile.bin "" && marked_as cvswork2/subdir newfile.c "" ' test_expect_success 'cvs status - sticky options' ' check_status_options cvswork2 textfile.c "" && check_status_options cvswork2 binfile.bin -kb && check_status_options cvswork2 .gitattributes "" && check_status_options cvswork2 mixedUp.c -kb && check_status_options cvswork2 multiline.c -kb && check_status_options cvswork2 multilineTxt.c "" && check_status_options cvswork2/subdir withCr.bin -kb && check_status_options cvswork2 subdir/withCr.bin -kb && check_status_options cvswork2/subdir file.h "" && check_status_options cvswork2 subdir/file.h "" && check_status_options cvswork2/subdir unspecified.other "" && check_status_options cvswork2/subdir newfile.bin "" && check_status_options cvswork2/subdir newfile.c "" ' test_expect_success 'add text (guess)' ' (cd cvswork && echo "simpleText" > simpleText.c && GIT_CONFIG="$git_config" cvs -Q add simpleText.c ) && marked_as cvswork simpleText.c "" ' test_expect_success 'add bin (guess)' ' (cd cvswork && echo "simpleBin: NUL: Q <- there" | q_to_nul > simpleBin.bin && GIT_CONFIG="$git_config" cvs -Q add simpleBin.bin ) && marked_as cvswork simpleBin.bin -kb ' test_expect_success 'remove files (guess)' ' (cd cvswork && GIT_CONFIG="$git_config" cvs -Q rm -f subdir/file.h && (cd subdir && GIT_CONFIG="$git_config" cvs -Q rm -f withCr.bin )) && marked_as cvswork/subdir withCr.bin -kb && marked_as cvswork/subdir file.h "" ' test_expect_success 'cvs ci (guess)' ' (cd cvswork && GIT_CONFIG="$git_config" cvs -Q ci -m "add/rm files" >cvs.log 2>&1 ) && marked_as cvswork textfile.c "" && marked_as cvswork binfile.bin -kb && marked_as cvswork .gitattributes "" && marked_as cvswork mixedUp.c -kb && marked_as cvswork multiline.c -kb && marked_as cvswork multilineTxt.c "" && not_present cvswork/subdir withCr.bin && not_present cvswork/subdir file.h && marked_as cvswork/subdir unspecified.other "" && marked_as cvswork/subdir newfile.bin "" && marked_as cvswork/subdir newfile.c "" && marked_as cvswork simpleBin.bin -kb && marked_as cvswork simpleText.c "" ' test_expect_success 'update subdir of other copy (guess)' ' (cd cvswork2/subdir && GIT_CONFIG="$git_config" cvs -Q update ) && marked_as cvswork2 textfile.c "" && marked_as cvswork2 binfile.bin -kb && marked_as cvswork2 .gitattributes "" && marked_as cvswork2 mixedUp.c -kb && marked_as cvswork2 multiline.c -kb && marked_as cvswork2 multilineTxt.c "" && not_present cvswork2/subdir withCr.bin && not_present cvswork2/subdir file.h && marked_as cvswork2/subdir unspecified.other "" && marked_as cvswork2/subdir newfile.bin "" && marked_as cvswork2/subdir newfile.c "" && not_present cvswork2 simpleBin.bin && not_present cvswork2 simpleText.c ' echo "starting update/merge" >> "$(WORKDIR)/marked.log" test_expect_success 'update/merge full other copy (guess)' ' git pull gitcvs.git master && sed "s/3/replaced_3/" < multilineTxt.c > ml.temp && mv ml.temp multilineTxt.c && git add multilineTxt.c && git commit -q -m "modify multiline file" >> "${WORKDIR}/marked.log" && git push gitcvs.git >/dev/null && (cd cvswork2 && sed "s/1/replaced_1/" < multilineTxt.c > ml.temp && mv ml.temp multilineTxt.c && GIT_CONFIG="$git_config" cvs update > cvs.log 2>&1 ) && marked_as cvswork2 textfile.c "" && marked_as cvswork2 binfile.bin -kb && marked_as cvswork2 .gitattributes "" && marked_as cvswork2 mixedUp.c -kb && marked_as cvswork2 multiline.c -kb && marked_as cvswork2 multilineTxt.c "" && not_present cvswork2/subdir withCr.bin && not_present cvswork2/subdir file.h && marked_as cvswork2/subdir unspecified.other "" && marked_as cvswork2/subdir newfile.bin "" && marked_as cvswork2/subdir newfile.c "" && marked_as cvswork2 simpleBin.bin -kb && marked_as cvswork2 simpleText.c "" && echo "line replaced_1" > tmpExpect2 && echo "line 2" >> tmpExpect2 && echo "line replaced_3" >> tmpExpect2 && echo "line 4" | q_to_nul >> tmpExpect2 && cmp cvswork2/multilineTxt.c tmpExpect2 ' test_done