X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=dgit.git;a=blobdiff_plain;f=tests%2Flib;h=7cd8062cae3c7d1b6671832bce1197a9d35a587a;hp=34281898f1def77f8b07cf730c2eea4dc444b1cc;hb=5339e3c5dcc53b10ea981c106ad7211b5a701ee1;hpb=68fecefcb822012c8eaef19c4368a674111df509 diff --git a/tests/lib b/tests/lib index 34281898..7cd8062c 100644 --- a/tests/lib +++ b/tests/lib @@ -2,6 +2,7 @@ exec 2>&1 set -x +set -o pipefail . tests/lib-core @@ -24,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 @@ -43,9 +46,71 @@ END t-expect-fail () { local mpat="$1"; shift + + 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 + + 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 + + $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-$dgitrepo}" + 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 $dgitrepo; then + cd $dgitrepo + git show-ref |sort + fi) } t-untar () { @@ -63,8 +128,13 @@ t-worktree () { t-untar $troot/worktrees/${p}_$1 } -t-git () { +t-select-package () { p=$1 + dgitrepo=$tmp/git/$p.git +} + +t-git () { + t-select-package $1 v=$2 mkdir -p $tmp/git local gs=$troot/git-srcs/${p}_$v.git @@ -76,30 +146,35 @@ 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 } t-prep-newpackage () { - p=$1 + t-select-package $1 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 + t-select-package $1 mkdir -p $tmp/aq $tmp/mirror/pool/main local suite=sid @@ -151,15 +226,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 () { @@ -174,8 +251,35 @@ t-archive () { (set -e; cd $tmp/extract; dpkg-source -x ../mirror/pool/main/$dscf) } +t-git-dir-time-passes () { + touch -d 'last year' $dgitrepo +} + +t-git-dir-check () { + local gitdir=$dgitrepo + 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 \ @@ -196,7 +300,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 () { @@ -210,14 +314,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` @@ -254,7 +378,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 @@ -262,7 +386,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 () { @@ -275,10 +408,11 @@ t-pushed-good () { t-refs-notexist \ refs/heads/dgit/unstable \ refs/remotes/dgit/dgit/unstable - (set -e; cd $tmp/git/$p.git + (set -e; cd $dgitrepo 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 ) @@ -298,6 +432,35 @@ 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-ref-dsc-dgit () { local dsc=${p}_${v}.dsc local val=`t-822-field $tmp/incoming/$dsc Dgit` @@ -308,8 +471,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 () { @@ -318,18 +491,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 @@ -357,16 +536,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%/*}