chiark / gitweb /
test suite: Make expect_fsck_fail contain objids
[dgit.git] / tests / lib
index baa122173b8bab8f1593a48a8d2822f65885457a..fb9ee38b4ab113e27268a3391ec4bd14ba04d35f 100644 (file)
--- a/tests/lib
+++ b/tests/lib
@@ -21,6 +21,8 @@ END
 
 trap 'test $? = 0 || t-report-failure' EXIT
 
+t-filter-out-git-hyphen-dir
+
 t-set-intree
 
 : ${DGIT_TEST_DEBUG=-D}
@@ -40,6 +42,8 @@ if [ x"$tmp" = x ]; then
        tmp=tests/tmp/$testname
        rm -rf $tmp
        mkdir $tmp
+elif [ "x$DGIT_TEST_TMPBASE" != x ]; then
+       tmpbase="$DGIT_TEST_TMPBASE"
 fi
 cd $tmp
 
@@ -51,10 +55,6 @@ env -0 >$tmp/.save-env
 
 ln -f $troot/ssh ssh
 
-mkdir -p $tmp/gnupg
-cp $troot/gnupg/* $tmp/gnupg
-chmod go-rw $tmp/gnupg/*
-
 export DEBCHANGE_VENDOR=dpkg
 
 mkdir -p $tmp/incoming
@@ -65,7 +65,8 @@ incoming              = $tmp/incoming
 run_dinstall           = 0
 END
 
-: ${tagpfx:=test-dummy}
+: ${t_archive_method:=aq}
+: ${tagpfx:=archive/test-dummy}
 : ${suitespecs:=sid:unstable}
 
 t-git-next-date () {
@@ -188,6 +189,8 @@ t-git-merge-base () {
 }
 
 t-has-ancestor () {
+       # t-has-ancestor ANCESTOR
+       # (CHILD is implicit, HEAD)
        local now=`git rev-parse HEAD`
        local ancestor=`git rev-parse $1^{}`
        local mbase=`t-git-merge-base $ancestor $now`
@@ -196,6 +199,18 @@ t-has-ancestor () {
        fi
 }
 
+t-has-parent-or-is () {
+       # t-has-parent-or-is CHILD PARENT
+       local child=$1
+       local parent=$2
+       local parents=$(git show --pretty=format:' %P %H ' "$child")
+       parent=$(git rev-parse "$parent~0")
+       case "$parents" in
+       *" $parent "*)  ;;
+       *)      fail "child $child lacks parent $parent" ;;
+       esac
+}
+
 t-prep-newpackage () {
        t-select-package $1
        v=$2
@@ -212,6 +227,9 @@ t-prep-newpackage () {
 
 t-archive-none () {
        t-select-package $1
+       t-archive-none-$t_archive_method
+}
+t-archive-none-aq () {
        mkdir -p $tmp/aq/dsc_in_suite $tmp/mirror/pool/main
 
        : >$tmp/aq/suites
@@ -223,12 +241,12 @@ t-archive-none () {
                local sname=${suitespec#*:}
 
                >$tmp/aq/package.$suite.$p
-               t-archive-updated $suite $p
+               t-aq-archive-updated $suite $p
 
                >$tmp/aq/package.new.$p
-               t-archive-updated new $p
+               t-aq-archive-updated new $p
 
-               ln -s $suite $tmp/aq/dsc_in_suite/$sname
+               ln -sf $suite $tmp/aq/dsc_in_suite/$sname
 
                cat <<END >>$tmp/aq/suites
 $jsondelim
@@ -253,7 +271,7 @@ END
 END
 }
 
-t-archive-updated () {
+t-aq-archive-updated () {
        local suite=$1
        local p=$2
        local suitedir=$tmp/aq/dsc_in_suite/$suite
@@ -278,16 +296,23 @@ t-archive-updated () {
 
 t-archive-process-incoming () {
        local suite=$1
-       mv $tmp/incoming/${p}_${v}[._]* $tmp/mirror/pool/main/
+       mv $tmp/incoming/${p}_* $tmp/mirror/pool/main/
        t-archive-query "$suite"
 }
 
 t-archive-query () {
        local suite=${1-sid}
        local dscf=main/${p}_${v}.dsc
+       t-archive-query-$t_archive_method "$suite" "$p" "$v" "$dscf"
+}
+t-archive-query-aq () {
+       local suite=$1
+       local p=$2
+       local v=$3
+       local dscf=$4
        local sha=`sha256sum <$tmp/mirror/pool/$dscf`
        echo "${v} ${sha%  -} $dscf" >>$tmp/aq/package.$suite.${p}
-       t-archive-updated $suite $p
+       t-aq-archive-updated $suite $p
 }
 
 t-archive () {
@@ -296,7 +321,7 @@ t-archive () {
        local dscf=${p}_$2.dsc
        rm -f $tmp/mirror/pool/main/${p}_*
        ln $troot/pkg-srcs/${p}_${2%-*}* $tmp/mirror/pool/main/
-       t-archive-query
+       t-archive-query $suite
        rm -rf $tmp/extract
        mkdir $tmp/extract
        (set -e; cd $tmp/extract; dpkg-source -x ../mirror/pool/main/$dscf)
@@ -324,6 +349,25 @@ t-git-dir-check () {
        esac
 }
 
+t-git-fsck () {
+       git fsck --no-dangling --strict || ${expect_fsck_fail:+true} false
+}
+
+t-fscks () {
+       (
+       shopt -s nullglob
+       for d in $tmp/*/.git $tmp/git/*.git; do
+               cd "$d"
+               t-git-fsck
+       done
+       )
+}
+
+t-ok () {
+       t-fscks
+       echo ok.
+}
+
 t-rm-dput-dropping () {
        rm -f $tmp/${p}_${v}_*.upload
 }
@@ -379,7 +423,8 @@ t-setup-done () {
        local savedirs=$2
        local importeval=$3
 
-       exec 4>$tmp/IMPORT.new
+       local import=IMPORT.${0##*/}
+       exec 4>$tmp/$import.new
 
        local vn
        for vn in $savevars; do
@@ -388,11 +433,11 @@ t-setup-done () {
                ' $vn "$(eval "printf '%s\n' \"\$$vn\"")"
        done
 
-       (set -e; cd $tmp; tar cf IMPORT.tar $savedirs)
+       (set -e; cd $tmp; tar cf $import.tar $savedirs)
 
        printf >&4 "\n%s\n" "$importeval"
 
-       mv -f $tmp/IMPORT.new $tmp/IMPORT
+       mv -f $tmp/$import.new $tmp/$import
 }
 
 t-setup-import () {
@@ -410,7 +455,7 @@ t-setup-import () {
                lock="$setupsrc.lock"
        fi
 
-       local simport="$setupsrc/IMPORT"
+       local simport="$setupsrc/IMPORT.$setupname"
 
        if ! [ -e "$simport" ]; then
                with-lock-ex -w "$lock" \
@@ -474,17 +519,19 @@ t-ref-head () {
 t-ref-same-val () {
        local name="$1"
        local val=$2
-       case "$t_ref_val" in
-       '')             ;;
+       case "${t_ref_val-unset}" in
+       unset)          ;;
        "$val")         ;;
-       *)              fail "ref varies: $name:\
- ${val:-nothing} != ${t_ref_val:-nothing}" ;;
+       *)              fail "ref varies: ($name)\
+ ${val:-nothing} != ${t_ref_val:-nothing} (${t_ref_names[*]})" ;;
        esac
        t_ref_val="$val"
+       t_ref_names+=("$name")
 }
 
 t-refs-same-start () {
-       t_ref_val=''
+       unset t_ref_val
+       t_ref_names=()
 }
 
 t-refs-same () {
@@ -572,6 +619,7 @@ t-splitbrain-pushed-good--unpack () {
        mkdir t-unpack
        cd t-unpack
        ln -s $tmp/mirror/pool/main/*.orig*.tar* .
+       ln -s $tmp/incoming/*.orig*.tar* . ||:
        ln -s $incoming_dsc .
        ln -s ${incoming_dsc/.dsc/.debian.tar}* .
        dpkg-source "$@" -x *.dsc
@@ -601,6 +649,13 @@ t-splitbrain-pushed-good-start () {
        git merge-base --is-ancestor $dep14tag $dgittag
 
        t-refs-same-start
+       t-ref-same refs/heads/split.p
+       case "$(t-git-get-ref refs/heads/split.b)" in
+       "$t_ref_val") ;;
+       "$(git rev-parse refs/heads/split.p^0)") ;;
+       "$(git rev-parse refs/heads/split.p^1)") ;;
+       *) fail 'bad b/p' ;;
+       esac
        t-pushed-good-core
 
        t-incoming-dsc
@@ -696,11 +751,13 @@ t-stunt-envvar () {
        local var=$1
        local tstunt=$2
        eval '
-               case "'$var'" in
+               case "$'$var'" in
                "$tstunt:"*)    ;;
                *":$tstunt:"*)  ;;
+               "")             '$var'="$tstunt" ;;
                *)              '$var'="$tstunt:$'$var'" ;;
                esac
+               export '$var'
        '
 }
 
@@ -721,6 +778,16 @@ t-tstunt-parsechangelog () {
        t-tstunt dpkg-parsechangelog Dpkg/Changelog/Parse.pm
 }
 
+t-tstunt-lintian () {
+       t-tstunt lintian
+}
+
+t-tstunt-debuild () {
+       : ${DGIT_TEST_REAL_DEBUILD:=$(type -p debuild)}
+       export DGIT_TEST_REAL_DEBUILD
+       t-tstunt debuild
+}
+
 t-incoming-dsc () {
        local dsc=${p}_${v}.dsc
        incoming_dsc=$tmp/incoming/$dsc
@@ -762,7 +829,19 @@ t-gbp-unapplied-pq2qc () {
        git commit -m 'Commit patch queue'
 }
 
-t-gbp-example-prep () {
+t-git-pseudo-merge () {
+       # like   git merge -s ours
+       if [ ! "$git_pseuomerge_opts" ]; then
+               if git merge --help \
+                | grep -q allow-unrelated-histories; then
+                       git_pseuomerge_opts='--allow-unrelated-histories'
+               fi
+               git_pseuomerge_opts+=' -s ours'
+       fi
+       git merge $git_pseuomerge_opts "$@"
+}
+
+t-gbp-example-prep-no-ff () {
        t-tstunt-parsechangelog
        t-archive example 1.0-1
        t-git-none
@@ -772,7 +851,7 @@ t-gbp-example-prep () {
 
        t-dgit fetch
 
-       git-checkout -b patch-queue/quilt-tip-2 patch-queue/quilt-tip
+       git checkout -b patch-queue/quilt-tip-2 patch-queue/quilt-tip
        gbp pq rebase
 
        echo '/* some comment */' >>src.c
@@ -782,8 +861,12 @@ t-gbp-example-prep () {
        t-gbp-unapplied-pq2qc
 
        t-commit 'some updates' 1.0-2
+}
 
-       git merge -s ours \
+t-gbp-example-prep () {
+       t-gbp-example-prep-no-ff
+
+       t-git-pseudo-merge \
                -m 'Pseudo-merge to make descendant of archive' \
                remotes/dgit/dgit/sid
 }
@@ -791,7 +874,7 @@ t-gbp-example-prep () {
 t-commit () {
        local msg=$1
        v=${2:-${majorv:-1}.$revision}
-       dch -v$v --distribution ${3:-unstable} "$1"
+       dch --force-distribution -v$v --distribution ${3:-unstable} "$1"
        git add debian/changelog
        debcommit
        revision=$(( ${revision-0} + 1 ))
@@ -806,7 +889,7 @@ t-drs () {
  t-git-config dgit-distro.test-dummy.git-url "ext::$troot/drs-git-ext %S "
  t-git-config dgit-distro.test-dummy.git-check true
  t-git-config dgit-distro.test-dummy.git-create true
- t-git-config dgit-distro.test-dummy.dgit-tag-format old,new
+ t-git-config dgit-distro.test-dummy.dgit-tag-format new,old,maint
        cp $troot/gnupg/{dd.gpg,dm.gpg,dm.txt} $tmp/.
        cp $troot/suites $tmp/.
        cp $troot/suites $tmp/suites-master
@@ -830,9 +913,10 @@ t-drs () {
 
 t-newtag () {
  export tagpfx=archive/test-dummy
- t-git-config dgit-distro.test-dummy.dgit-tag-format new
+ t-git-config dgit-distro.test-dummy.dgit-tag-format new,maint
 }
 t-oldtag () {
+ export tagpfx=test-dummy
  t-git-config dgit-distro.test-dummy.dgit-tag-format old
 }
 
@@ -904,6 +988,7 @@ t-chain-test () {
        local d=${0%/*}
        cd $root
        export DGIT_TEST_TESTNAME="$testname"
+       export DGIT_TEST_TMPBASE="$tmpbase"
        export ADTTMP=$tmp
        exec "$d/$ct"
 }      
@@ -913,3 +998,8 @@ t-alt-test () {
        t-${t%%-*}
        t-chain-test "${t#*-}"
 }
+
+case "$0" in
+*/gnupg) ;;
+*)     t-setup-import gnupg    ;;
+esac