chiark / gitweb /
test suite: t-check-only-bpd: Check $tmp/.. not ..
[dgit.git] / tests / lib
index f2414ae434c10ed90d256931fdc6192ae91d9234..a4f307f8a70c3770f09536a37225b543c1e07bbe 100644 (file)
--- a/tests/lib
+++ b/tests/lib
@@ -12,10 +12,13 @@ t-report-failure () {
        rc=$1
        cat <<END >&2
 TEST FAILED
+cwd: $PWD
 funcs: ${FUNCNAME[*]}
 lines: ${BASH_LINENO[*]}
 files: ${BASH_SOURCE[*]}
 END
+       t-save-artifacts
+
        exit 16
 }
 
@@ -28,15 +31,20 @@ t-set-intree
 : ${DGIT_TEST_DEBUG=-D}
 export DGIT_TEST_DEBUG
 
-export GIT_COMMITTER_DATE='1440253867 +0100'
-export GIT_AUTHOR_DATE='1440253867 +0100'
+: ${DGIT_TEST_DISTRO+ ${distro=${DGIT_TEST_DISTRO}}}
+
+export GIT_COMMITTER_DATE='1530000000 +0100'
+export GIT_AUTHOR_DATE='1530000000 +0100'
 
 root=`pwd`
 troot=$root/tests
 testname="${DGIT_TEST_TESTNAME-${0##*/}}"
+export DGIT_TEST_TROOT=$troot
+bpd=..
 
 tmp=$ADTTMP
 if [ x"$tmp" = x ]; then
+       export DGIT_TEST_BYHAND=1
        mkdir -p tests/tmp
        tmpbase=$troot/tmp
        tmp=tests/tmp/$testname
@@ -51,11 +59,14 @@ tmp=`pwd`
 
 t-set-using-tmp
 
+test -f $tmp/.save-env || \
 env -0 >$tmp/.save-env
 
-ln -f $troot/ssh ssh
+ln -sf $troot/ssh ssh
 
 export DEBCHANGE_VENDOR=dpkg
+unset VISUAL
+unset GIT_EDITOR
 
 mkdir -p $tmp/incoming
 cat <<END >$tmp/dput.cf
@@ -65,6 +76,9 @@ incoming              = $tmp/incoming
 run_dinstall           = 0
 END
 
+schroot=${DGIT_SCHROOT_CHROOT:-build}
+# Pretty much any Debian sid snapshot schroot will do.
+
 : ${t_archive_method:=aq}
 : ${tagpfx:=archive/test-dummy}
 : ${suitespecs:=sid:unstable}
@@ -114,7 +128,7 @@ t-grep-mpat () {
 t-expect-push-fail () {
        local mpat="$1"; shift
 
-       local triedpush=`git rev-parse HEAD`
+       local triedpush; triedpush=`git rev-parse HEAD`
 
        t-reporefs pre-push
        t-expect-fail "$mpat"  "$@"
@@ -147,7 +161,7 @@ t-reporefs () {
         exec >"$outputfile"
         if test -d $whichrepo; then
                cd $whichrepo
-               git show-ref |sort
+               git show-ref |t-sort
        fi)
 }
 
@@ -184,6 +198,13 @@ t-git-none () {
        (set -e; cd $tmp/git; tar xf $troot/git-template.tar)
 }
 
+t-salsa-add-remote () {
+       local d=$tmp/salsa/$p
+       mkdir -p $d
+       (set -e; cd $d; git init --bare)
+       git remote add ${1-origin} $d
+}
+
 t-git-merge-base () {
        git merge-base $1 $2 || test $? = 1
 }
@@ -191,9 +212,9 @@ 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`
+       local now;      now=`git rev-parse HEAD`
+       local ancestor; ancestor=`git rev-parse $1^{}`
+       local mbase;    mbase=`t-git-merge-base $ancestor $now`
        if [ x$mbase != x$ancestor ]; then
                fail "not ff $ancestor..$now, $mbase != $ancestor"
        fi
@@ -203,7 +224,8 @@ 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")
+       local parents
+       parents=$(git show --pretty=format:' %P %H ' "$child")
        parent=$(git rev-parse "$parent~0")
        case "$parents" in
        *" $parent "*)  ;;
@@ -310,7 +332,7 @@ t-archive-query-aq () {
        local p=$2
        local v=$3
        local dscf=$4
-       local sha=`sha256sum <$tmp/mirror/pool/$dscf`
+       local sha; sha=`sha256sum <$tmp/mirror/pool/$dscf`
        echo "${v} ${sha%  -} $dscf" >>$tmp/aq/package.$suite.${p}
        t-aq-archive-updated $suite $p
 }
@@ -320,7 +342,7 @@ t-archive () {
        v=$2
        local dscf=${p}_$2.dsc
        rm -f $tmp/mirror/pool/main/${p}_*
-       ln $troot/pkg-srcs/${p}_${2%-*}* $tmp/mirror/pool/main/
+       ln -s $troot/pkg-srcs/${p}_${2%-*}* $tmp/mirror/pool/main/
        t-archive-query $suite
        rm -rf $tmp/extract
        mkdir $tmp/extract
@@ -354,9 +376,11 @@ t-expect-fsck-fail () {
 }
 
 t-git-fsck () {
+       local fsckerrs=$(git rev-parse --git-dir)/dgit-test-fsck.errs
+
        set +e
        LC_MESSAGES=C git fsck --no-dangling --strict 2>&1 \
-               | tee dgit-test-fsck.errs
+               | tee $fsckerrs
        ps="${PIPESTATUS[*]}"
        set -e
 
@@ -370,7 +394,7 @@ t-git-fsck () {
        pats+=(-e 'notice: No default references')
 
        set +e
-       grep -v "${pats[@]}" dgit-test-fsck.errs
+       grep -v "${pats[@]}" $fsckerrs
        rc=$?
        set -e
        case $rc in
@@ -380,37 +404,69 @@ t-git-fsck () {
        esac
 }
 
+t-check-only-bpd () {
+       if [ "$bpd" = .. ]; then return; fi
+       t-files-notexist \
+               $tmp/*.{deb,changes,dsc,buildinfo} \
+               $tmp/*.{tar,diff}.*
+}
+
 t-fscks () {
        (
        shopt -s nullglob
        for d in $tmp/*/.git $tmp/git/*.git; do
-               cd "$d"
+               cd "${d%/.git}"
                t-git-fsck
        done
        )
 }
 
 t-ok () {
+       : '========================================'
+       t-check-only-bpd
        t-fscks
+       t-save-artifacts
        echo ok.
 }
 
+t-save-artifacts () {
+       artifacts="$AUTOPKGTEST_ARTIFACTS"
+       if [ x"$artifacts" = x ]; then return; fi
+       if [ x"tmp" = x ]; then return; fi
+       GZIP=-1v tar -C "$tmp" -zc -f "$artifacts/${0##*/}.tar.gz" \
+               --exclude=\*.tar .
+}
+
 t-rm-dput-dropping () {
        rm -f $tmp/${p}_${v}_*.upload
 }
 
 t-dgit () {
        local dgit=${DGIT_TEST-dgit}
-       pwd
+       pwd >&2
        : '
 {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{'
        $dgit --dgit=$dgit --dget:-u --dput:--config=$tmp/dput.cf \
-               -dtest-dummy $DGIT_TEST_OPTS $DGIT_TEST_DEBUG \
-               -k39B13D8A $t_dgit_xopts "$@"
+ ${dgit_config_debian_alias-"--config-lookup-explode=dgit-distro.debian.alias-canon"} \
+ ${DGIT_GITDEBREBASE_TEST+--git-debrebase=}${DGIT_GITDEBREBASE_TEST} \
+               ${distro+${distro:+-d}}${distro--dtest-dummy} \
+               $DGIT_TEST_OPTS $DGIT_TEST_DEBUG \
+               -kBCD22CD83243B79D3DFAC33EA3DBCBC039B13D8A $t_dgit_xopts "$@"
        : '}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
 '
 }
 
+t-dgit-manpage () {
+       local section=$1
+       local page=$2
+       (export LC_ALL=C.UTF-8
+        if [ "$DGIT_TEST_INTREE" ]; then
+               make -C $DGIT_TEST_INTREE $page.$section.view
+        else
+               man $section $page
+        fi)
+}
+
 t-diff-nogit () {
        diff --exclude=.git --exclude=.pc -ruN $*
 }
@@ -450,12 +506,12 @@ t-setup-done () {
        local savedirs=$2
        local importeval=$3
 
-       local import=IMPORT.${0##*/}
+       local import=IMPORT.${DGIT_TEST_TESTNAME-${0##*/}}
        exec 4>$tmp/$import.new
 
        local vn
        for vn in $savevars; do
-               perl >&4 -I. -MDebian::Dgit -e '
+               perl >&4 -"I$root" -MDebian::Dgit -e '
                        printf "%s=%s\n", $ARGV[0], shellquote $ARGV[1]
                ' $vn "$(eval "printf '%s\n' \"\$$vn\"")"
        done
@@ -528,18 +584,18 @@ t-git-get-ref () {
 
 t-ref-same-exact () {
        local name="$1"
-       local val=`t-git-get-ref-exact $name`
+       local val; val=`t-git-get-ref-exact $name`
        t-ref-same-val "$name" $val
 }
 
 t-ref-same () {
        local name="$1"
-       local val=`t-git-get-ref $name`
+       local val; val=`t-git-get-ref $name`
        t-ref-same-val "$name" $val
 }
 
 t-ref-head () {
-       local val=`git rev-parse HEAD`
+       local val; val=`git rev-parse HEAD`
        t-ref-same-val HEAD $val
 }
 
@@ -589,11 +645,11 @@ t-format-ref () {
 t-sametree-parent () {
        local ref=$1
        local parent
-       local ctree=$(t-format-ref '%T' "$ref")
+       local ctree; ctree=$(t-format-ref '%T' "$ref")
        while :; do
                local psame=''
                for parent in $(t-format-ref '%P' "$ref"); do
-                       local ptree=$(t-format-ref '%T' "$parent")
+                       local ptree; ptree=$(t-format-ref '%T' "$parent")
                        if [ "x$ptree" = "x$ctree" ]; then
                                psame+=" $parent"
                        fi
@@ -605,14 +661,35 @@ t-sametree-parent () {
 }
 
 t-check-pushed-master () {
-       local master=`t-git-get-ref refs/heads/master`
+       local master; master=`t-git-get-ref refs/heads/master`
        if [ x$master = x$t_ref_val ]; then return; fi
        if [ x$master = x ]; then fail "failed to push master"; fi
        # didn't update master, it must be not FF
-       local mbase=`t-git-merge-base $master $t_ref_val`
+       local mbase; mbase=`t-git-merge-base $master $t_ref_val`
        if [ x$mbase = x$master ]; then fail "failed to ff master"; fi
 }
 
+t-push-was-source-only () {
+        local f
+       t-files-notexist $tmp/incoming/${p}_${v}_*.deb \
+                         $tmp/incoming/${p}_${v}_*.udeb
+       # we permit _source.buildinfo files; see test_changes_source_only()
+       for f in $tmp/incoming/${p}_${v}_*.buildinfo; do
+            if [ -e $f ]; then
+                case "$f" in
+                    *_source.buildinfo) ;;
+                    *) fail "non-source-only file $f exists!" ;;
+                esac
+            fi
+        done
+}
+
+t-push-included () {
+    for f in $@; do
+        stat $tmp/incoming/$f
+    done
+}
+
 t-pushed-good () {
        local branch=$1
        local suite=${2:-sid}
@@ -640,6 +717,12 @@ t-pushed-good-core () {
        git verify-tag `t-v-tag`
 }
 
+t-pushed-good-check-changes () {
+       changes_filename="$tmp/incoming/${p}_${v}_*.changes"
+        grep -E "^Distribution: $suite" $changes_filename
+        grep -E "^Version: $v" $changes_filename
+}
+
 t-splitbrain-pushed-good--unpack () {
        cd $tmp
        rm -rf t-unpack
@@ -774,6 +857,12 @@ t-822-field () {
        ' <$file
 }
 
+t-defdistro () {
+       export DGIT_TEST_DISTRO=''
+       distro=''
+       t-git-config dgit-suite.unstable.distro test-dummy
+}
+
 t-stunt-envvar () {
        local var=$1
        local tstunt=$2
@@ -788,12 +877,48 @@ t-stunt-envvar () {
        '
 }
 
+t-tstunt--save-real () {
+       local f="$1"
+       case "$f" in
+       */*) return ;;
+       esac
+
+       local rc
+       local real
+       set +e
+       real=$(
+               p=":$PATH:"
+               p="${p/:"$tmp/tstunt":/:}"
+               p="${p%:}"
+               p="${p#:}"
+               PATH="$p"
+               type -p "$f"
+       )
+       rc=$?
+       set -e
+
+       case $rc in
+       1)      return ;;
+       0)      ;;
+       *)      fail "did not find $f on PATH $PATH" ;;
+       esac
+
+       local varname=${f//[^_0-9a-zA-Z]/_}
+       varname=DGIT_TEST_REAL_${varname^^}
+
+       eval "
+               : \${$varname:=\$real}
+               export $varname
+       "
+}
+
 t-tstunt () {
        local tstunt=$tmp/tstunt
        t-stunt-envvar PATH $tstunt
        t-stunt-envvar PERLLIB $tstunt
        local f
        for f in "$@"; do
+               t-tstunt--save-real $f
                f="./$f"
                local d="$tstunt/${f%/*}"
                mkdir -p $d
@@ -810,8 +935,6 @@ t-tstunt-lintian () {
 }
 
 t-tstunt-debuild () {
-       : ${DGIT_TEST_REAL_DEBUILD:=$(type -p debuild)}
-       export DGIT_TEST_REAL_DEBUILD
        t-tstunt debuild
 }
 
@@ -822,8 +945,12 @@ t-incoming-dsc () {
 
 t-ref-dsc-dgit () {
        t-incoming-dsc
-       local val=`t-822-field $incoming_dsc Dgit`
-       perl -e '$_=shift @ARGV; die "Dgit $_ ?" unless m/^\w+\b/;' "$val"
+       local val; val=`t-822-field $incoming_dsc Dgit`
+       val=$( perl -e '
+               $_=shift @ARGV;
+               die "Dgit $_ ?" unless m/^\w+\b/;
+               print $&,"\n" or die $!;
+       ' "$val")
        t-ref-same-val $incoming_dsc "$val"
 }
 
@@ -907,21 +1034,57 @@ t-make-badcommit () {
        t-expect-fsck-fail $badcommit
 }
 
+t-make-orig () {
+       # leaves ust set to filename of orig tarball
+       local p=$1
+       local v=$2
+       local tag=${3-v$2}
+       ust=${p}_${v}.orig.tar.gz
+       GZIP=-1 git archive -o $bpd/$ust --prefix=${p}-${v}/ $tag
+}
+
+t-merge-conflicted-stripping-conflict-markers () {
+       local otherbranch=$1
+       local file=$2
+
+       t-expect-fail F:"Merge conflict in $file" \
+       git merge $otherbranch
+
+       perl -i~ -ne 'print unless m{^(?:\<\<\<|\>\>\>|===)}' "$file"
+       git add "$file"
+       git commit --no-edit
+}
+
 t-commit () {
        local msg=$1
        v=${2:-${majorv:-1}.$revision}
-       dch --force-distribution -v$v --distribution ${3:-unstable} "$1"
+       $troot/tstunt/debchange \
+               --force-distribution -v$v --distribution ${3:-unstable} "$1"
        git add debian/changelog
        debcommit
        revision=$(( ${revision-0} + 1 ))
 }
 
+t-dch-r-rune () {
+       local cmd="$1"; shift
+       local suite=${1-unstable}
+       $cmd -r -D "$suite" ''
+}
+
+t-dch-commit-r () {
+       t-dch-r-rune t-dch-commit "$@"
+}
+
+t-dch-commit () {
+       $troot/tstunt/debchange "$@"
+       git commit -m "dch $*" debian/changelog
+}
+
 t-git-config () {
        git config --global "$@"
 }
 
 t-drs () {
-       export DGIT_TEST_TROOT=$troot
  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
@@ -974,7 +1137,9 @@ t-dsd () {
 }
 
 t-policy-admin () {
+       : '(((((((((((((((((((((((((((((((((((((((('
        ${DGIT_INFRA_PFX}dgit-repos-admin-debian --repos $tmp/git "$@"
+       : '))))))))))))))))))))))))))))))))))))))))'
 }
 
 t-policy-nonexist () {
@@ -1006,8 +1171,20 @@ t-debpolicy () {
 }
 
 t-policy-periodic () {
+       : '(((((((((((((((((((((((((((((((((((((((('
        ${DGIT_REPOS_SERVER_TEST-dgit-repos-server} \
                test-dummy $drs_dispatch '' --cron
+       : '))))))))))))))))))))))))))))))))))))))))'
+}
+
+t-buildproductsdir-config () {
+       bpd=$tmp/bpd
+       t-git-config dgit.default.build-products-dir $bpd
+       mkdir -p $bpd
+       cat <<END >>$tmp/.gbp.conf
+[buildpackage]
+export-dir = $bpd
+END
 }
 
 t-restrict () {
@@ -1035,7 +1212,13 @@ t-alt-test () {
        t-chain-test "${t#*-}"
 }
 
-case "$0" in
-*/gnupg) ;;
-*)     t-setup-import gnupg    ;;
-esac
+t-git-config dgit.default.old-dsc-distro test-dummy
+
+for import in ${autoimport-gnupg}; do
+       case "$0" in
+       */$import) ;;
+       *)
+               t-setup-import $import
+               ;;
+       esac
+done