637 lines
		
	
	
	
		
			18 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			637 lines
		
	
	
	
		
			18 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
#!/bin/sh
 | 
						|
#
 | 
						|
# Copyright (c) 2007 Frank Lichtenheld
 | 
						|
#
 | 
						|
 | 
						|
test_description='git-cvsserver access
 | 
						|
 | 
						|
tests read access to a git repository with the
 | 
						|
cvs CLI client via git-cvsserver server'
 | 
						|
 | 
						|
. ./test-lib.sh
 | 
						|
 | 
						|
if ! test_have_prereq PERL; then
 | 
						|
	skip_all='skipping git cvsserver tests, perl not available'
 | 
						|
	test_done
 | 
						|
fi
 | 
						|
cvs >/dev/null 2>&1
 | 
						|
if test $? -ne 1
 | 
						|
then
 | 
						|
    skip_all='skipping git-cvsserver tests, cvs not found'
 | 
						|
    test_done
 | 
						|
fi
 | 
						|
perl -e 'use DBI; use DBD::SQLite' >/dev/null 2>&1 || {
 | 
						|
    skip_all='skipping git-cvsserver tests, Perl SQLite interface unavailable'
 | 
						|
    test_done
 | 
						|
}
 | 
						|
 | 
						|
WORKDIR=$PWD
 | 
						|
SERVERDIR=$PWD/gitcvs.git
 | 
						|
git_config="$SERVERDIR/config"
 | 
						|
CVSROOT=":fork:$SERVERDIR"
 | 
						|
CVSWORK="$PWD/cvswork"
 | 
						|
CVS_SERVER=git-cvsserver
 | 
						|
export CVSROOT CVS_SERVER
 | 
						|
 | 
						|
rm -rf "$CVSWORK" "$SERVERDIR"
 | 
						|
test_expect_success 'setup' '
 | 
						|
  git config push.default matching &&
 | 
						|
  echo >empty &&
 | 
						|
  git add empty &&
 | 
						|
  git commit -q -m "First Commit" &&
 | 
						|
  mkdir secondroot &&
 | 
						|
  ( cd secondroot &&
 | 
						|
  git init &&
 | 
						|
  touch secondrootfile &&
 | 
						|
  git add secondrootfile &&
 | 
						|
  git commit -m "second root") &&
 | 
						|
  git fetch secondroot master &&
 | 
						|
  git merge --allow-unrelated-histories FETCH_HEAD &&
 | 
						|
  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" &&
 | 
						|
  GIT_DIR="$SERVERDIR" git config gitcvs.authdb "$SERVERDIR/auth.db" &&
 | 
						|
  echo cvsuser:cvGVEarMLnhlA > "$SERVERDIR/auth.db"
 | 
						|
'
 | 
						|
 | 
						|
# note that cvs doesn't accept absolute pathnames
 | 
						|
# as argument to co -d
 | 
						|
test_expect_success 'basic checkout' \
 | 
						|
  'GIT_CONFIG="$git_config" cvs -Q co -d cvswork master &&
 | 
						|
   test "$(echo $(grep -v ^D cvswork/CVS/Entries|cut -d/ -f2,3,5 | head -n 1))" = "empty/1.1/" &&
 | 
						|
   test "$(echo $(grep -v ^D cvswork/CVS/Entries|cut -d/ -f2,3,5 | sed -ne \$p))" = "secondrootfile/1.1/"'
 | 
						|
 | 
						|
#------------------------
 | 
						|
# PSERVER AUTHENTICATION
 | 
						|
#------------------------
 | 
						|
 | 
						|
cat >request-anonymous  <<EOF
 | 
						|
BEGIN AUTH REQUEST
 | 
						|
$SERVERDIR
 | 
						|
anonymous
 | 
						|
 | 
						|
END AUTH REQUEST
 | 
						|
EOF
 | 
						|
 | 
						|
cat >request-git  <<EOF
 | 
						|
BEGIN AUTH REQUEST
 | 
						|
$SERVERDIR
 | 
						|
git
 | 
						|
 | 
						|
END AUTH REQUEST
 | 
						|
EOF
 | 
						|
 | 
						|
cat >login-anonymous <<EOF
 | 
						|
BEGIN VERIFICATION REQUEST
 | 
						|
$SERVERDIR
 | 
						|
anonymous
 | 
						|
 | 
						|
END VERIFICATION REQUEST
 | 
						|
EOF
 | 
						|
 | 
						|
cat >login-git <<EOF
 | 
						|
BEGIN VERIFICATION REQUEST
 | 
						|
$SERVERDIR
 | 
						|
git
 | 
						|
 | 
						|
END VERIFICATION REQUEST
 | 
						|
EOF
 | 
						|
 | 
						|
cat >login-git-ok <<EOF
 | 
						|
BEGIN VERIFICATION REQUEST
 | 
						|
$SERVERDIR
 | 
						|
cvsuser
 | 
						|
Ah<Z:yZZ30 e
 | 
						|
END VERIFICATION REQUEST
 | 
						|
EOF
 | 
						|
 | 
						|
test_expect_success 'pserver authentication' \
 | 
						|
  'cat request-anonymous | git-cvsserver pserver >log 2>&1 &&
 | 
						|
   sed -ne \$p log | grep "^I LOVE YOU\$"'
 | 
						|
 | 
						|
test_expect_success 'pserver authentication failure (non-anonymous user)' \
 | 
						|
  'if cat request-git | git-cvsserver pserver >log 2>&1
 | 
						|
   then
 | 
						|
       false
 | 
						|
   else
 | 
						|
       true
 | 
						|
   fi &&
 | 
						|
   sed -ne \$p log | grep "^I HATE YOU\$"'
 | 
						|
 | 
						|
test_expect_success 'pserver authentication success (non-anonymous user with password)' \
 | 
						|
  'cat login-git-ok | git-cvsserver pserver >log 2>&1 &&
 | 
						|
   sed -ne \$p log | grep "^I LOVE YOU\$"'
 | 
						|
 | 
						|
test_expect_success 'pserver authentication (login)' \
 | 
						|
  'cat login-anonymous | git-cvsserver pserver >log 2>&1 &&
 | 
						|
   sed -ne \$p log | grep "^I LOVE YOU\$"'
 | 
						|
 | 
						|
test_expect_success 'pserver authentication failure (login/non-anonymous user)' \
 | 
						|
  'if cat login-git | git-cvsserver pserver >log 2>&1
 | 
						|
   then
 | 
						|
       false
 | 
						|
   else
 | 
						|
       true
 | 
						|
   fi &&
 | 
						|
   sed -ne \$p log | grep "^I HATE YOU\$"'
 | 
						|
 | 
						|
 | 
						|
# misuse pserver authentication for testing of req_Root
 | 
						|
 | 
						|
cat >request-relative  <<EOF
 | 
						|
BEGIN AUTH REQUEST
 | 
						|
gitcvs.git
 | 
						|
anonymous
 | 
						|
 | 
						|
END AUTH REQUEST
 | 
						|
EOF
 | 
						|
 | 
						|
cat >request-conflict  <<EOF
 | 
						|
BEGIN AUTH REQUEST
 | 
						|
$SERVERDIR
 | 
						|
anonymous
 | 
						|
 | 
						|
END AUTH REQUEST
 | 
						|
Root $WORKDIR
 | 
						|
EOF
 | 
						|
 | 
						|
test_expect_success 'req_Root failure (relative pathname)' \
 | 
						|
  'if cat request-relative | git-cvsserver pserver >log 2>&1
 | 
						|
   then
 | 
						|
       echo unexpected success
 | 
						|
       false
 | 
						|
   else
 | 
						|
       true
 | 
						|
   fi &&
 | 
						|
   tail log | grep "^error 1 Root must be an absolute pathname$"'
 | 
						|
 | 
						|
test_expect_success 'req_Root failure (conflicting roots)' \
 | 
						|
  'cat request-conflict | git-cvsserver pserver >log 2>&1 &&
 | 
						|
   tail log | grep "^error 1 Conflicting roots specified$"'
 | 
						|
 | 
						|
test_expect_success 'req_Root (strict paths)' \
 | 
						|
  'cat request-anonymous | git-cvsserver --strict-paths pserver "$SERVERDIR" >log 2>&1 &&
 | 
						|
   sed -ne \$p log | grep "^I LOVE YOU\$"'
 | 
						|
 | 
						|
test_expect_success 'req_Root failure (strict-paths)' '
 | 
						|
    ! cat request-anonymous |
 | 
						|
    git-cvsserver --strict-paths pserver "$WORKDIR" >log 2>&1
 | 
						|
'
 | 
						|
 | 
						|
test_expect_success 'req_Root (w/o strict-paths)' \
 | 
						|
  'cat request-anonymous | git-cvsserver pserver "$WORKDIR/" >log 2>&1 &&
 | 
						|
   sed -ne \$p log | grep "^I LOVE YOU\$"'
 | 
						|
 | 
						|
test_expect_success 'req_Root failure (w/o strict-paths)' '
 | 
						|
    ! cat request-anonymous |
 | 
						|
    git-cvsserver pserver "$WORKDIR/gitcvs" >log 2>&1
 | 
						|
'
 | 
						|
 | 
						|
cat >request-base  <<EOF
 | 
						|
BEGIN AUTH REQUEST
 | 
						|
/gitcvs.git
 | 
						|
anonymous
 | 
						|
 | 
						|
END AUTH REQUEST
 | 
						|
Root /gitcvs.git
 | 
						|
EOF
 | 
						|
 | 
						|
test_expect_success 'req_Root (base-path)' \
 | 
						|
  'cat request-base | git-cvsserver --strict-paths --base-path "$WORKDIR/" pserver "$SERVERDIR" >log 2>&1 &&
 | 
						|
   sed -ne \$p log | grep "^I LOVE YOU\$"'
 | 
						|
 | 
						|
test_expect_success 'req_Root failure (base-path)' '
 | 
						|
    ! cat request-anonymous |
 | 
						|
    git-cvsserver --strict-paths --base-path "$WORKDIR" pserver "$SERVERDIR" >log 2>&1
 | 
						|
'
 | 
						|
 | 
						|
GIT_DIR="$SERVERDIR" git config --bool gitcvs.enabled false || exit 1
 | 
						|
 | 
						|
test_expect_success 'req_Root (export-all)' \
 | 
						|
  'cat request-anonymous | git-cvsserver --export-all pserver "$WORKDIR" >log 2>&1 &&
 | 
						|
   sed -ne \$p log | grep "^I LOVE YOU\$"'
 | 
						|
 | 
						|
test_expect_success 'req_Root failure (export-all w/o whitelist)' \
 | 
						|
  '! (cat request-anonymous | git-cvsserver --export-all pserver >log 2>&1 || false)'
 | 
						|
 | 
						|
test_expect_success 'req_Root (everything together)' \
 | 
						|
  'cat request-base | git-cvsserver --export-all --strict-paths --base-path "$WORKDIR/" pserver "$SERVERDIR" >log 2>&1 &&
 | 
						|
   sed -ne \$p log | grep "^I LOVE YOU\$"'
 | 
						|
 | 
						|
GIT_DIR="$SERVERDIR" git config --bool gitcvs.enabled true || exit 1
 | 
						|
 | 
						|
#--------------
 | 
						|
# CONFIG TESTS
 | 
						|
#--------------
 | 
						|
 | 
						|
test_expect_success 'gitcvs.enabled = false' \
 | 
						|
  'GIT_DIR="$SERVERDIR" git config --bool gitcvs.enabled false &&
 | 
						|
   if GIT_CONFIG="$git_config" cvs -Q co -d cvswork2 master >cvs.log 2>&1
 | 
						|
   then
 | 
						|
     echo unexpected cvs success
 | 
						|
     false
 | 
						|
   else
 | 
						|
     true
 | 
						|
   fi &&
 | 
						|
   grep "GITCVS emulation disabled" cvs.log &&
 | 
						|
   test ! -d cvswork2'
 | 
						|
 | 
						|
rm -fr cvswork2
 | 
						|
test_expect_success 'gitcvs.ext.enabled = true' \
 | 
						|
  'GIT_DIR="$SERVERDIR" git config --bool gitcvs.ext.enabled true &&
 | 
						|
   GIT_DIR="$SERVERDIR" git config --bool gitcvs.enabled false &&
 | 
						|
   GIT_CONFIG="$git_config" cvs -Q co -d cvswork2 master >cvs.log 2>&1 &&
 | 
						|
   test_cmp cvswork cvswork2'
 | 
						|
 | 
						|
rm -fr cvswork2
 | 
						|
test_expect_success 'gitcvs.ext.enabled = false' \
 | 
						|
  'GIT_DIR="$SERVERDIR" git config --bool gitcvs.ext.enabled false &&
 | 
						|
   GIT_DIR="$SERVERDIR" git config --bool gitcvs.enabled true &&
 | 
						|
   if GIT_CONFIG="$git_config" cvs -Q co -d cvswork2 master >cvs.log 2>&1
 | 
						|
   then
 | 
						|
     echo unexpected cvs success
 | 
						|
     false
 | 
						|
   else
 | 
						|
     true
 | 
						|
   fi &&
 | 
						|
   grep "GITCVS emulation disabled" cvs.log &&
 | 
						|
   test ! -d cvswork2'
 | 
						|
 | 
						|
rm -fr cvswork2
 | 
						|
test_expect_success 'gitcvs.dbname' \
 | 
						|
  'GIT_DIR="$SERVERDIR" git config --bool gitcvs.ext.enabled true &&
 | 
						|
   GIT_DIR="$SERVERDIR" git config gitcvs.dbname %Ggitcvs.%a.%m.sqlite &&
 | 
						|
   GIT_CONFIG="$git_config" cvs -Q co -d cvswork2 master >cvs.log 2>&1 &&
 | 
						|
   test_cmp cvswork cvswork2 &&
 | 
						|
   test -f "$SERVERDIR/gitcvs.ext.master.sqlite" &&
 | 
						|
   cmp "$SERVERDIR/gitcvs.master.sqlite" "$SERVERDIR/gitcvs.ext.master.sqlite"'
 | 
						|
 | 
						|
rm -fr cvswork2
 | 
						|
test_expect_success 'gitcvs.ext.dbname' \
 | 
						|
  'GIT_DIR="$SERVERDIR" git config --bool gitcvs.ext.enabled true &&
 | 
						|
   GIT_DIR="$SERVERDIR" git config gitcvs.ext.dbname %Ggitcvs1.%a.%m.sqlite &&
 | 
						|
   GIT_DIR="$SERVERDIR" git config gitcvs.dbname %Ggitcvs2.%a.%m.sqlite &&
 | 
						|
   GIT_CONFIG="$git_config" cvs -Q co -d cvswork2 master >cvs.log 2>&1 &&
 | 
						|
   test_cmp cvswork cvswork2 &&
 | 
						|
   test -f "$SERVERDIR/gitcvs1.ext.master.sqlite" &&
 | 
						|
   test ! -f "$SERVERDIR/gitcvs2.ext.master.sqlite" &&
 | 
						|
   cmp "$SERVERDIR/gitcvs.master.sqlite" "$SERVERDIR/gitcvs1.ext.master.sqlite"'
 | 
						|
 | 
						|
 | 
						|
#------------
 | 
						|
# CVS UPDATE
 | 
						|
#------------
 | 
						|
 | 
						|
rm -fr "$SERVERDIR"
 | 
						|
cd "$WORKDIR" &&
 | 
						|
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" ||
 | 
						|
exit 1
 | 
						|
 | 
						|
test_expect_success 'cvs update (create new file)' \
 | 
						|
  'echo testfile1 >testfile1 &&
 | 
						|
   git add testfile1 &&
 | 
						|
   git commit -q -m "Add testfile1" &&
 | 
						|
   git push gitcvs.git >/dev/null &&
 | 
						|
   cd cvswork &&
 | 
						|
   GIT_CONFIG="$git_config" cvs -Q update &&
 | 
						|
   test "$(echo $(grep testfile1 CVS/Entries|cut -d/ -f2,3,5))" = "testfile1/1.1/" &&
 | 
						|
   test_cmp testfile1 ../testfile1'
 | 
						|
 | 
						|
cd "$WORKDIR"
 | 
						|
test_expect_success 'cvs update (update existing file)' \
 | 
						|
  'echo line 2 >>testfile1 &&
 | 
						|
   git add testfile1 &&
 | 
						|
   git commit -q -m "Append to testfile1" &&
 | 
						|
   git push gitcvs.git >/dev/null &&
 | 
						|
   cd cvswork &&
 | 
						|
   GIT_CONFIG="$git_config" cvs -Q update &&
 | 
						|
   test "$(echo $(grep testfile1 CVS/Entries|cut -d/ -f2,3,5))" = "testfile1/1.2/" &&
 | 
						|
   test_cmp testfile1 ../testfile1'
 | 
						|
 | 
						|
cd "$WORKDIR"
 | 
						|
#TODO: cvsserver doesn't support update w/o -d
 | 
						|
test_expect_failure "cvs update w/o -d doesn't create subdir (TODO)" '
 | 
						|
   mkdir test &&
 | 
						|
   echo >test/empty &&
 | 
						|
   git add test &&
 | 
						|
   git commit -q -m "Single Subdirectory" &&
 | 
						|
   git push gitcvs.git >/dev/null &&
 | 
						|
   cd cvswork &&
 | 
						|
   GIT_CONFIG="$git_config" cvs -Q update &&
 | 
						|
   test ! -d test
 | 
						|
'
 | 
						|
 | 
						|
cd "$WORKDIR"
 | 
						|
test_expect_success 'cvs update (subdirectories)' \
 | 
						|
  '(for dir in A A/B A/B/C A/D E; do
 | 
						|
      mkdir $dir &&
 | 
						|
      echo "test file in $dir" >"$dir/file_in_$(echo $dir|sed -e "s#/# #g")"  &&
 | 
						|
      git add $dir
 | 
						|
   done) &&
 | 
						|
   git commit -q -m "deep sub directory structure" &&
 | 
						|
   git push gitcvs.git >/dev/null &&
 | 
						|
   cd cvswork &&
 | 
						|
   GIT_CONFIG="$git_config" cvs -Q update -d &&
 | 
						|
   (for dir in A A/B A/B/C A/D E; do
 | 
						|
      filename="file_in_$(echo $dir|sed -e "s#/# #g")" &&
 | 
						|
      if test "$(echo $(grep -v ^D $dir/CVS/Entries|cut -d/ -f2,3,5))" = "$filename/1.1/" &&
 | 
						|
	test_cmp "$dir/$filename" "../$dir/$filename"; then
 | 
						|
        :
 | 
						|
      else
 | 
						|
        echo >failure
 | 
						|
      fi
 | 
						|
    done) &&
 | 
						|
   test ! -f failure'
 | 
						|
 | 
						|
cd "$WORKDIR"
 | 
						|
test_expect_success 'cvs update (delete file)' \
 | 
						|
  'git rm testfile1 &&
 | 
						|
   git commit -q -m "Remove testfile1" &&
 | 
						|
   git push gitcvs.git >/dev/null &&
 | 
						|
   cd cvswork &&
 | 
						|
   GIT_CONFIG="$git_config" cvs -Q update &&
 | 
						|
   test -z "$(grep testfile1 CVS/Entries)" &&
 | 
						|
   test ! -f testfile1'
 | 
						|
 | 
						|
cd "$WORKDIR"
 | 
						|
test_expect_success 'cvs update (re-add deleted file)' \
 | 
						|
  'echo readded testfile >testfile1 &&
 | 
						|
   git add testfile1 &&
 | 
						|
   git commit -q -m "Re-Add testfile1" &&
 | 
						|
   git push gitcvs.git >/dev/null &&
 | 
						|
   cd cvswork &&
 | 
						|
   GIT_CONFIG="$git_config" cvs -Q update &&
 | 
						|
   test "$(echo $(grep testfile1 CVS/Entries|cut -d/ -f2,3,5))" = "testfile1/1.4/" &&
 | 
						|
   test_cmp testfile1 ../testfile1'
 | 
						|
 | 
						|
cd "$WORKDIR"
 | 
						|
test_expect_success 'cvs update (merge)' \
 | 
						|
  'echo Line 0 >expected &&
 | 
						|
   for i in 1 2 3 4 5 6 7
 | 
						|
   do
 | 
						|
     echo Line $i >>merge &&
 | 
						|
     echo Line $i >>expected
 | 
						|
   done &&
 | 
						|
   echo Line 8 >>expected &&
 | 
						|
   git add merge &&
 | 
						|
   git commit -q -m "Merge test (pre-merge)" &&
 | 
						|
   git push gitcvs.git >/dev/null &&
 | 
						|
   cd cvswork &&
 | 
						|
   GIT_CONFIG="$git_config" cvs -Q update &&
 | 
						|
   test "$(echo $(grep merge CVS/Entries|cut -d/ -f2,3,5))" = "merge/1.1/" &&
 | 
						|
   test_cmp merge ../merge &&
 | 
						|
   ( echo Line 0 && cat merge ) >merge.tmp &&
 | 
						|
   mv merge.tmp merge &&
 | 
						|
   cd "$WORKDIR" &&
 | 
						|
   echo Line 8 >>merge &&
 | 
						|
   git add merge &&
 | 
						|
   git commit -q -m "Merge test (merge)" &&
 | 
						|
   git push gitcvs.git >/dev/null &&
 | 
						|
   cd cvswork &&
 | 
						|
   sleep 1 && touch merge &&
 | 
						|
   GIT_CONFIG="$git_config" cvs -Q update &&
 | 
						|
   test_cmp merge ../expected'
 | 
						|
 | 
						|
cd "$WORKDIR"
 | 
						|
 | 
						|
cat >expected.C <<EOF
 | 
						|
<<<<<<< merge.mine
 | 
						|
Line 0
 | 
						|
=======
 | 
						|
LINE 0
 | 
						|
>>>>>>> merge.1.3
 | 
						|
EOF
 | 
						|
 | 
						|
for i in 1 2 3 4 5 6 7 8
 | 
						|
do
 | 
						|
  echo Line $i >>expected.C
 | 
						|
done
 | 
						|
 | 
						|
test_expect_success 'cvs update (conflict merge)' \
 | 
						|
  '( echo LINE 0 && cat merge ) >merge.tmp &&
 | 
						|
   mv merge.tmp merge &&
 | 
						|
   git add merge &&
 | 
						|
   git commit -q -m "Merge test (conflict)" &&
 | 
						|
   git push gitcvs.git >/dev/null &&
 | 
						|
   cd cvswork &&
 | 
						|
   GIT_CONFIG="$git_config" cvs -Q update &&
 | 
						|
   test_cmp merge ../expected.C'
 | 
						|
 | 
						|
cd "$WORKDIR"
 | 
						|
test_expect_success 'cvs update (-C)' \
 | 
						|
  'cd cvswork &&
 | 
						|
   GIT_CONFIG="$git_config" cvs -Q update -C &&
 | 
						|
   test_cmp merge ../merge'
 | 
						|
 | 
						|
cd "$WORKDIR"
 | 
						|
test_expect_success 'cvs update (merge no-op)' \
 | 
						|
   'echo Line 9 >>merge &&
 | 
						|
    cp merge cvswork/merge &&
 | 
						|
    git add merge &&
 | 
						|
    git commit -q -m "Merge test (no-op)" &&
 | 
						|
    git push gitcvs.git >/dev/null &&
 | 
						|
    cd cvswork &&
 | 
						|
    sleep 1 && touch merge &&
 | 
						|
    GIT_CONFIG="$git_config" cvs -Q update &&
 | 
						|
    test_cmp merge ../merge'
 | 
						|
 | 
						|
cd "$WORKDIR"
 | 
						|
test_expect_success 'cvs update (-p)' '
 | 
						|
    touch really-empty &&
 | 
						|
    echo Line 1 > no-lf &&
 | 
						|
    printf "Line 2" >> no-lf &&
 | 
						|
    git add really-empty no-lf &&
 | 
						|
    git commit -q -m "Update -p test" &&
 | 
						|
    git push gitcvs.git >/dev/null &&
 | 
						|
    cd cvswork &&
 | 
						|
    GIT_CONFIG="$git_config" cvs update &&
 | 
						|
    for i in merge no-lf empty really-empty; do
 | 
						|
	GIT_CONFIG="$git_config" cvs update -p "$i" >$i.out &&
 | 
						|
	test_cmp $i.out ../$i || return 1
 | 
						|
    done
 | 
						|
'
 | 
						|
 | 
						|
cd "$WORKDIR"
 | 
						|
test_expect_success 'cvs update (module list supports packed refs)' '
 | 
						|
    GIT_DIR="$SERVERDIR" git pack-refs --all &&
 | 
						|
    GIT_CONFIG="$git_config" cvs -n up -d 2> out &&
 | 
						|
    grep "cvs update: New directory \`master'\''" < out
 | 
						|
'
 | 
						|
 | 
						|
#------------
 | 
						|
# CVS STATUS
 | 
						|
#------------
 | 
						|
 | 
						|
cd "$WORKDIR"
 | 
						|
test_expect_success 'cvs status' '
 | 
						|
    mkdir status.dir &&
 | 
						|
    echo Line > status.dir/status.file &&
 | 
						|
    echo Line > status.file &&
 | 
						|
    git add status.dir status.file &&
 | 
						|
    git commit -q -m "Status test" &&
 | 
						|
    git push gitcvs.git >/dev/null &&
 | 
						|
    cd cvswork &&
 | 
						|
    GIT_CONFIG="$git_config" cvs update &&
 | 
						|
    GIT_CONFIG="$git_config" cvs status | grep "^File: status.file" >../out &&
 | 
						|
    test_line_count = 2 ../out
 | 
						|
'
 | 
						|
 | 
						|
cd "$WORKDIR"
 | 
						|
test_expect_success 'cvs status (nonrecursive)' '
 | 
						|
    cd cvswork &&
 | 
						|
    GIT_CONFIG="$git_config" cvs status -l | grep "^File: status.file" >../out &&
 | 
						|
    test_line_count = 1 ../out
 | 
						|
'
 | 
						|
 | 
						|
cd "$WORKDIR"
 | 
						|
test_expect_success 'cvs status (no subdirs in header)' '
 | 
						|
    cd cvswork &&
 | 
						|
    GIT_CONFIG="$git_config" cvs status | grep ^File: >../out &&
 | 
						|
    ! grep / <../out
 | 
						|
'
 | 
						|
 | 
						|
#------------
 | 
						|
# CVS CHECKOUT
 | 
						|
#------------
 | 
						|
 | 
						|
cd "$WORKDIR"
 | 
						|
test_expect_success 'cvs co -c (shows module database)' '
 | 
						|
    GIT_CONFIG="$git_config" cvs co -c > out &&
 | 
						|
    grep "^master[	 ][ 	]*master$" <out &&
 | 
						|
    ! grep -v "^master[	 ][ 	]*master$" <out
 | 
						|
'
 | 
						|
 | 
						|
#------------
 | 
						|
# CVS LOG
 | 
						|
#------------
 | 
						|
 | 
						|
# Known issues with git-cvsserver current log output:
 | 
						|
#  - Hard coded "lines: +2 -3" placeholder, instead of real numbers.
 | 
						|
#  - CVS normally does not internally add a blank first line
 | 
						|
#    or a last line with nothing but a space to log messages.
 | 
						|
#  - The latest cvs 1.12.x server sends +0000 timezone (with some hidden "MT"
 | 
						|
#    tagging in the protocol), and if cvs 1.12.x client sees the MT tags,
 | 
						|
#    it converts to local time zone.  git-cvsserver doesn't do the +0000
 | 
						|
#    or the MT tags...
 | 
						|
#  - The latest 1.12.x releases add a "commitid:" field on to the end of the
 | 
						|
#    "date:" line (after "lines:").  Maybe we could stick git's commit id
 | 
						|
#    in it?  Or does CVS expect a certain number of bits (too few for
 | 
						|
#    a full sha1)?
 | 
						|
#
 | 
						|
# Given the above, expect the following test to break if git-cvsserver's
 | 
						|
# log output is improved.  The test is just to ensure it doesn't
 | 
						|
# accidentally get worse.
 | 
						|
 | 
						|
sed -e 's/^x//' -e 's/SP$/ /' > "$WORKDIR/expect" <<EOF
 | 
						|
x
 | 
						|
xRCS file: $WORKDIR/gitcvs.git/master/merge,v
 | 
						|
xWorking file: merge
 | 
						|
xhead: 1.4
 | 
						|
xbranch:
 | 
						|
xlocks: strict
 | 
						|
xaccess list:
 | 
						|
xsymbolic names:
 | 
						|
xkeyword substitution: kv
 | 
						|
xtotal revisions: 4;	selected revisions: 4
 | 
						|
xdescription:
 | 
						|
x----------------------------
 | 
						|
xrevision 1.4
 | 
						|
xdate: __DATE__;  author: author;  state: Exp;  lines: +2 -3
 | 
						|
x
 | 
						|
xMerge test (no-op)
 | 
						|
xSP
 | 
						|
x----------------------------
 | 
						|
xrevision 1.3
 | 
						|
xdate: __DATE__;  author: author;  state: Exp;  lines: +2 -3
 | 
						|
x
 | 
						|
xMerge test (conflict)
 | 
						|
xSP
 | 
						|
x----------------------------
 | 
						|
xrevision 1.2
 | 
						|
xdate: __DATE__;  author: author;  state: Exp;  lines: +2 -3
 | 
						|
x
 | 
						|
xMerge test (merge)
 | 
						|
xSP
 | 
						|
x----------------------------
 | 
						|
xrevision 1.1
 | 
						|
xdate: __DATE__;  author: author;  state: Exp;  lines: +2 -3
 | 
						|
x
 | 
						|
xMerge test (pre-merge)
 | 
						|
xSP
 | 
						|
x=============================================================================
 | 
						|
EOF
 | 
						|
expectStat="$?"
 | 
						|
 | 
						|
cd "$WORKDIR"
 | 
						|
test_expect_success 'cvs log' '
 | 
						|
    cd cvswork &&
 | 
						|
    test x"$expectStat" = x"0" &&
 | 
						|
    GIT_CONFIG="$git_config" cvs log merge >../out &&
 | 
						|
    sed -e "s%2[0-9][0-9][0-9]/[01][0-9]/[0-3][0-9] [0-2][0-9]:[0-5][0-9]:[0-5][0-9]%__DATE__%" ../out > ../actual &&
 | 
						|
    test_cmp ../expect ../actual
 | 
						|
'
 | 
						|
 | 
						|
#------------
 | 
						|
# CVS ANNOTATE
 | 
						|
#------------
 | 
						|
 | 
						|
cd "$WORKDIR"
 | 
						|
test_expect_success 'cvs annotate' '
 | 
						|
    cd cvswork &&
 | 
						|
    GIT_CONFIG="$git_config" cvs annotate merge >../out &&
 | 
						|
    sed -e "s/ .*//" ../out >../actual &&
 | 
						|
    for i in 3 1 1 1 1 1 1 1 2 4; do echo 1.$i; done >../expect &&
 | 
						|
    test_cmp ../expect ../actual
 | 
						|
'
 | 
						|
 | 
						|
#------------
 | 
						|
# running via git-shell
 | 
						|
#------------
 | 
						|
 | 
						|
cd "$WORKDIR"
 | 
						|
 | 
						|
test_expect_success 'create remote-cvs helper' '
 | 
						|
	write_script remote-cvs <<-\EOF
 | 
						|
	exec git shell -c "cvs server"
 | 
						|
	EOF
 | 
						|
'
 | 
						|
 | 
						|
test_expect_success 'cvs server does not run with vanilla git-shell' '
 | 
						|
	(
 | 
						|
		cd cvswork &&
 | 
						|
		CVS_SERVER=$WORKDIR/remote-cvs &&
 | 
						|
		export CVS_SERVER &&
 | 
						|
		test_must_fail cvs log merge
 | 
						|
	)
 | 
						|
'
 | 
						|
 | 
						|
test_expect_success 'configure git shell to run cvs server' '
 | 
						|
	mkdir "$HOME"/git-shell-commands &&
 | 
						|
 | 
						|
	write_script "$HOME"/git-shell-commands/cvs <<-\EOF &&
 | 
						|
	if ! test $# = 1 && test "$1" = "server"
 | 
						|
	then
 | 
						|
		echo >&2 "git-cvsserver only handles \"server\""
 | 
						|
		exit 1
 | 
						|
	fi
 | 
						|
	exec git cvsserver server
 | 
						|
	EOF
 | 
						|
 | 
						|
	# Should not be used, but part of the recommended setup
 | 
						|
	write_script "$HOME"/git-shell-commands/no-interactive-login <<-\EOF
 | 
						|
	echo Interactive login forbidden
 | 
						|
	EOF
 | 
						|
'
 | 
						|
 | 
						|
test_expect_success 'cvs server can run with recommended config' '
 | 
						|
	(
 | 
						|
		cd cvswork &&
 | 
						|
		CVS_SERVER=$WORKDIR/remote-cvs &&
 | 
						|
		export CVS_SERVER &&
 | 
						|
		cvs log merge
 | 
						|
	)
 | 
						|
'
 | 
						|
 | 
						|
test_done
 |