X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=dgit.git;a=blobdiff_plain;f=tests%2Flib;h=9fc056e6d12455f321e53cc610f1b3aef54fed02;hp=4435b55c4b72825818643e88542e03b77e87e3d7;hb=d2c91253e64e144d17d0f5a0ce9c72661c43a29c;hpb=145b3af675c0738fc9c70bea4a7e7330da16292d diff --git a/tests/lib b/tests/lib index 4435b55c..9fc056e6 100644 --- a/tests/lib +++ b/tests/lib @@ -2,14 +2,11 @@ exec 2>&1 set -x +set -o pipefail -if [ "x$DGIT_TEST_INTREE" != x ]; then - : ${DGIT_TEST:=$DGIT_TEST_INTREE/dgit} - : ${DGIT_REPOS_SERVER_TEST:=$DGIT_TEST_INTREE/infra/dgit-repos-server} - : ${DGIT_SSH_DISPATCH_TEST:=$DGIT_TEST_INTREE/infra/dgit-ssh-dispatch} - : ${DGIT_INFRA_PFX:=$DGIT_TEST_INTREE${DGIT_TEST_INTREE:+/infra/}} - export DGIT_TEST DGIT_REPOS_SERVER_TEST DGIT_SSH_DISPATCH_TEST -fi +. tests/lib-core + +t-set-intree : ${DGIT_TEST_DEBUG:=-D} export DGIT_TEST_DEBUG @@ -28,14 +25,16 @@ fi cd $tmp tmp=`pwd` -export HOME=$tmp -export DGIT_TEST_DUMMY_DIR=$tmp + +t-set-using-tmp + ln -f $troot/ssh ssh mkdir -p $tmp/gnupg cp $troot/gnupg/* $tmp/gnupg chmod go-rw $tmp/gnupg/* -export GNUPGHOME=$tmp/gnupg + +export DEBCHANGE_VENDOR=dpkg mkdir -p $tmp/incoming cat <$tmp/dput.cf @@ -45,16 +44,73 @@ incoming = $tmp/incoming run_dinstall = 0 END -fail () { - echo >&2 "failed: $*" - exit 1 -} - t-expect-fail () { local mpat="$1"; shift + + local grepper=fgrep + case "$mpat" in + [A-Z]:*) + case "$mpat" in + E:*) grepper=egrep ;; + F:*) grepper=fgrep ;; + *) fail "bad mpat prefix in $mpat";; + esac + mpat=${mpat#[A-Z]:} + ;; + esac + + set +o pipefail LC_MESSAGES=C "$@" 2>&1 | tee $tmp/t.output - test ${PIPESTATUS[0]} != 0 - egrep "$mpat" $tmp/t.output ||false + local ps="${PIPESTATUS[*]}" + set -o pipefail + + case $ps in + "0 0") fail "command unexpectedly succeeded (instead of: $mpat)" ;; + *" 0") ;; + *) fail "tee failed" ;; + esac + + $grepper -e "$mpat" $tmp/t.output || + fail "error message not found" +} + +t-expect-push-fail () { + local mpat="$1"; shift + + local triedpush=`git rev-parse HEAD` + + t-reporefs pre-push + t-expect-fail "$mpat" "$@" + t-reporefs post-push + diff $tmp/show-refs.{pre,post}-push + + t-git-objects-not-present '' $triedpush + + eval "$t_expect_push_fail_hook" +} + +t-git-objects-not-present () { + # t-git-objects-not-present GITDIR|'' OBJID [...] + # specifying '' means the repo for package $p + local gitdir="${1-$tmp/git/$p.git}" + local obj + if ! [ -e "$gitdir" ]; then return; fi + for obj in "$@"; do + GIT_DIR=$gitdir \ + t-expect-fail 'unable to find' \ + git cat-file -t $obj + done +} + +t-reporefs () { + local whichoutput=$1; shift + local outputfile="$tmp/show-refs.$whichoutput" + (set -e + exec >"$outputfile" + if test -d $tmp/git/$p.git; then + cd $tmp/git/$p.git + git show-ref |sort + fi) } t-untar () { @@ -85,10 +141,14 @@ t-git-none () { (set -e; cd $tmp/git; tar xf $troot/git-template.tar) } +t-git-merge-base () { + git merge-base $1 $2 || test $? = 1 +} + t-has-ancestor () { local now=`git rev-parse HEAD` local ancestor=`git rev-parse $1^{}` - local mbase=`git merge-base $ancestor $now` + local mbase=`t-git-merge-base $ancestor $now` if [ x$mbase != x$ancestor ]; then fail "not ff $ancestor..$now, $mbase != $ancestor" fi @@ -99,23 +159,27 @@ t-prep-newpackage () { v=$2 t-archive-none $p t-git-none - v=3-1 t-worktree $v cd $p - git branch -m dgit/sid master - git remote rm dgit + if ! git show-ref --verify --quiet refs/heads/master; then + git branch -m dgit/sid master + git remote rm dgit + fi cd .. } t-archive-none () { p=$1 mkdir -p $tmp/aq $tmp/mirror/pool/main - mkdir -p $tmp/aq/dsc_in_suite $tmp/aq/dsc_in_suite/sid local suite=sid + >$tmp/aq/package.$suite.$p t-archive-updated $suite $p + >$tmp/aq/package.new.$p + t-archive-updated new $p + ln -s sid $tmp/aq/dsc_in_suite/unstable cat <<'END' >$tmp/aq/suites [ @@ -137,7 +201,9 @@ END t-archive-updated () { local suite=$1 local p=$2 - perl <$tmp/aq/package.$suite.$p >$tmp/aq/dsc_in_suite/$suite/$p -wne ' + local suitedir=$tmp/aq/dsc_in_suite/$suite + mkdir -p $suitedir + perl <$tmp/aq/package.$suite.$p >$suitedir/$p -wne ' use JSON; use strict; our @v; @@ -155,15 +221,17 @@ t-archive-updated () { } t-archive-process-incoming () { - mv incoming/${p}_${v}[._]* mirror/pool/main/ - t-archive-query + local suite=$1 + mv $tmp/incoming/${p}_${v}[._]* $tmp/mirror/pool/main/ + t-archive-query "$suite" } t-archive-query () { + local suite=${1-sid} local dscf=main/${p}_${v}.dsc - local sha=`sha256sum >$tmp/aq/package.sid.${p} - t-archive-updated sid $p + local sha=`sha256sum <$tmp/mirror/pool/$dscf` + echo "${v} ${sha% -} $dscf" >>$tmp/aq/package.$suite.${p} + t-archive-updated $suite $p } t-archive () { @@ -178,8 +246,35 @@ t-archive () { (set -e; cd $tmp/extract; dpkg-source -x ../mirror/pool/main/$dscf) } +t-git-dir-time-passes () { + touch -d 'last year' $tmp/git/$p.git +} + +t-git-dir-check () { + local gitdir=$tmp/git/$p.git + case "$1" in + enoent) + if test -e "$gitdir"; then fail "$gitdir exists"; fi + return + ;; + public) wantstat='7[75]5' ;; + secret) wantstat='7[70]0' ;; + *) fail "$1 t-git-dir-check ?" ;; + esac + gotstat=`stat -c%a $gitdir` + case "$gotstat" in + *$wantstat) return ;; + *) fail "$gitdir has mode $gotstat, expected $wantstat" ;; + esac +} + +t-rm-dput-dropping () { + rm -f $tmp/${p}_${v}_*.upload +} + t-dgit () { local dgit=${DGIT_TEST-dgit} + pwd : ' {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{' $dgit --dgit=$dgit --dget:-u --dput:--config=$tmp/dput.cf \ @@ -200,7 +295,7 @@ t-cloned-fetched-good () { t-refs-same \ refs/heads/dgit/sid \ refs/remotes/dgit/dgit/sid - t-refs-notexist dgit/unstable remotes/dgit/dgit/unstable + t-refs-notexist refs/dgit/unstable refs/remotes/dgit/dgit/unstable } t-output () { @@ -214,14 +309,34 @@ t-clean-on-branch () { t-output "## $1" git status -b --porcelain } +t-git-get-ref-exact () { + local ref=$1 + # does not dereference, unlike t-git-get-ref + case "$ref" in + refs/*) ;; + *) fail "t-git-get-ref-exact bad $ref" ;; + esac + git for-each-ref --format='%(objectname)' "[r]efs/${ref#refs/}" +} + t-git-get-ref () { local ref=$1 - git show-ref -d $1 | perl -ne ' + case "$ref" in + refs/*) ;; + *) fail "t-git-get-ref bad $ref" ;; + esac + (git show-ref -d $1 || test $? = 1) | perl -ne ' $x = $1 if m#^(\w+) \Q'$1'\E(?:\^\{\})?$#; END { print "$x\n" if length $x; } ' } +t-ref-same-exact () { + local name="$1" + local 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` @@ -258,7 +373,7 @@ t-refs-same () { t-refs-notexist () { local val for g in $*; do - val=`t-git-get-ref $g >$tmp/t.refx` + val=`t-git-get-ref $g` if [ "x$val" != x ]; then fail "ref $g unexpectedly exists ($val)" fi @@ -266,7 +381,16 @@ t-refs-notexist () { } t-v-tag () { - echo refs/tags/debian/${v//\~/_} + echo refs/tags/test-dummy/${v//\~/_} +} + +t-check-pushed-master () { + local 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` + if [ x$mbase = x$master ]; then fail "failed to ff master"; fi } t-pushed-good () { @@ -283,6 +407,7 @@ t-pushed-good () { t-refs-same \ refs/dgit/sid \ `t-v-tag` + ${t_check_pushed_master:- : NOT-DRS-NO-CHECK-PUSHED-MASTER} t-refs-notexist \ refs/dgit/unstable ) @@ -302,6 +427,44 @@ t-822-field () { ' <$file } +t-stunt-envvar () { + local var=$1 + local tstunt=$2 + eval ' + case "'$var'" in + "$tstunt:"*) ;; + *":$tstunt:"*) ;; + *) '$var'="$tstunt:$'$var'" ;; + esac + ' +} + +t-tstunt () { + local tstunt=$tmp/tstunt + t-stunt-envvar PATH $tstunt + t-stunt-envvar PERLLIB $tstunt + local f + for f in "$@"; do + f="./$f" + local d="$tstunt/${f%/*}" + mkdir -p $d + ln -sf "$troot/tstunt/$f" "$d"/. + done +} + +t-tstunt-parsechangelog () { + t-tstunt dpkg-parsechangelog Dpkg/Changelog/Parse.pm +} + +t-prep-mergechangelogs () { + local b=merge.dpkg-mergechangelogs + git config $b.name 'debian/changelog merge driver' + git config $b.driver 'dpkg-mergechangelogs -m %O %A %B %A' + mkdir -p .git/info + echo >>.git/info/attributes \ + 'debian/changelog merge=dpkg-mergechangelogs' +} + t-ref-dsc-dgit () { local dsc=${p}_${v}.dsc local val=`t-822-field $tmp/incoming/$dsc Dgit` @@ -312,8 +475,18 @@ t-ref-dsc-dgit () { t-apply-diff () { local v1=$1 local v2=$2 - (cd $troot/pkg-srcs; debdiff ${p}_${v1}.dsc ${p}_${v2}.dsc) \ - | patch -p1 -u + (cd $troot/pkg-srcs; + debdiff ${p}_${v1}.dsc ${p}_${v2}.dsc || test $? = 1) \ + | patch -p1 -u +} + +t-commit () { + local msg=$1 + v=${2-1.$revision} + dch -v$v --distribution unstable "$1" + git add debian/changelog + debcommit + revision=$(( ${revision-0} + 1 )) } t-git-config () { @@ -322,18 +495,24 @@ t-git-config () { t-drs () { export DGIT_TEST_TROOT=$troot - export DGIT_TEST_TMP=$tmp 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 - cp $root/tests/gnupg/{dd.gpg,dm.gpg,dm.txt} $tmp/. - cp $root/tests/suites $tmp/. + cp $troot/gnupg/{dd.gpg,dm.gpg,dm.txt} $tmp/. + cp $troot/suites $tmp/. + cp $troot/suites $tmp/suites-master + + export t_check_pushed_master=t-check-pushed-master drs_dispatch=$tmp/distro=test-dummy mkdir $drs_dispatch - ln -sf $root $drs_dispatch/dgit-live + + if [ "x$DGIT_TEST_INTREE" != x ]; then + ln -sf "$DGIT_TEST_INTREE" $drs_dispatch/dgit-live + fi + ln -sf $tmp/git $drs_dispatch/repos - ln -sf $tmp/suites $tmp/dm.txt $drs_dispatch/ + ln -sf $tmp/suites $tmp/suites-master $tmp/dm.txt $drs_dispatch/ mkdir -p $drs_dispatch/keyrings ln -sf $tmp/dd.gpg $drs_dispatch/keyrings/debian-keyring.gpg ln -sf $tmp/dm.gpg $drs_dispatch/keyrings/debian-maintainers.gpg @@ -361,16 +540,33 @@ t-policy-admin () { ${DGIT_INFRA_PFX}dgit-repos-admin-debian --repos $tmp/git "$@" } +t-policy-nonexist () { + ln -sf no-such-file-or-directory $drs_dispatch/policy-hook +} + +t-policy () { + local policyhook=$1 + policyhook=${DGIT_INFRA_PFX}$policyhook + case $policyhook in + */*) ;; + *) policyhook=`type -P $policyhook` ;; + esac + ln -sf "$policyhook" $drs_dispatch/policy-hook +} + t-debpolicy () { t-dsd - - ln -sf ${DGIT_INFRA_PFX}dgit-repos-policy-debian \ - $drs_dispatch/policy-hook + t-policy dgit-repos-policy-debian mkdir $tmp/git t-policy-admin create-db } +t-policy-periodic () { + ${DGIT_REPOS_SERVER_TEST-dgit-repos-server} \ + test-dummy $drs_dispatch '' --cron +} + t-chain-test () { local ct=$1 local d=${0%/*}