X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=tests%2Flib;h=749509c4fc240d301d77cb56c8d33adbb263362d;hb=HEAD;hp=1def3d36394892aabc9ca6774444aa5fedc90950;hpb=5fe16b89fe3b3b5cbdde241e5665e7dac2999ffa;p=dgit.git diff --git a/tests/lib b/tests/lib index 1def3d36..749509c4 100644 --- a/tests/lib +++ b/tests/lib @@ -12,14 +12,33 @@ t-report-failure () { rc=$1 cat <&2 TEST FAILED +cwd: $PWD funcs: ${FUNCNAME[*]} lines: ${BASH_LINENO[*]} files: ${BASH_SOURCE[*]} END + t-save-artifacts + exit 16 } -trap 'test $? = 0 || t-report-failure' EXIT +trap ' + rc=$? + set +x + test $rc = 0 || echo " +%%%%%%%%%%%%%%%%%%%% EXITING $rc %%%%%%%%%%%%%%%%%%%% + + Most relevant logs are just before assignment rc=$rc + Will now do cleanup etc. +" + set -x + set +e + pwd + [ "x$DGIT_TEST_KEEP_MUSTCLEAN" != x ] || \ + [ "x$DGIT_TEST_TMP" = x ] || rm -rf $DGIT_TEST_TMP/must-clean + set -e + test $rc = 0 || t-report-failure +' EXIT t-filter-out-git-hyphen-dir @@ -28,15 +47,26 @@ 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_DEBPUSH_DEBUG=x} +export DGIT_TEST_DEBPUSH_DEBUG + +: ${DGIT_TEST_DISTRO+ ${distro=${DGIT_TEST_DISTRO}}} + +export GIT_COMMITTER_DATE='1530000000 +0100' +export GIT_AUTHOR_DATE='1530000000 +0100' + +export LC_CTYPE=C.UTF-8 +unset CDPATH 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 +81,19 @@ 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/must-clean +# must-clean is usually removed after each test, on success or failure. +# But this must not be relied on for correctness, only for garbage +# collection etc. mkdir -p $tmp/incoming cat <$tmp/dput.cf @@ -65,6 +103,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} @@ -78,7 +119,9 @@ t-expect-fail () { local mpat="$1"; shift set +o pipefail - LC_MESSAGES=C "$@" 2>&1 | tee $tmp/t.output + LC_MESSAGES=${expect_fail_lcmessages-C} \ + LANGUAGE=${expect_fail_lcmessages-C} \ + "$@" 2>&1 | tee $tmp/t.output local ps="${PIPESTATUS[*]}" set -o pipefail @@ -147,7 +190,7 @@ t-reporefs () { exec >"$outputfile" if test -d $whichrepo; then cd $whichrepo - git show-ref |sort + git show-ref |t-sort fi) } @@ -184,6 +227,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 } @@ -321,7 +371,8 @@ 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/ + ${t_archive_ln_s-ln -s} \ + $troot/pkg-srcs/${p}_${2%-*}* $tmp/mirror/pool/main/ t-archive-query $suite rm -rf $tmp/extract mkdir $tmp/extract @@ -355,9 +406,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 @@ -371,7 +424,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 @@ -381,11 +434,18 @@ 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 ) @@ -393,28 +453,63 @@ t-fscks () { 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 \ ${dgit_config_debian_alias-"--config-lookup-explode=dgit-distro.debian.alias-canon"} \ - ${distro--dtest-dummy} ${distro+${distro:+-d}${distro}} \ + ${DGIT_GITDEBREBASE_TEST+--git-debrebase=}${DGIT_GITDEBREBASE_TEST} \ + ${distro+${distro:+-d}}${distro--dtest-dummy} \ $DGIT_TEST_OPTS $DGIT_TEST_DEBUG \ - -k39B13D8A $t_dgit_xopts "$@" + -kBCD22CD83243B79D3DFAC33EA3DBCBC039B13D8A $t_dgit_xopts "$@" : '}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} ' } +t-non-dgit-upload () { + t-dgit -wgf build-source + + cd .. + c=${p}_${v}_source.changes + debsign -kBCD22CD83243B79D3DFAC33EA3DBCBC039B13D8A $c + dput -c $tmp/dput.cf test-dummy $c + + t-archive-process-incoming sid + t-git-next-date + cd $p +} + +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 $* } @@ -454,16 +549,24 @@ 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 + perl >&4 -"I$root" -MDebian::Dgit -we ' + foreach my $vn (grep m/^DGIT_TEST_REAL_/, keys %ENV) { + print STDERR "saving-exporting $vn\n"; + printf "export %s=%s\n", $vn, shellquote $ENV{$vn} + or die $!; + } + ' + (set -e; cd $tmp; tar cf $import.tar $savedirs) printf >&4 "\n%s\n" "$importeval" @@ -505,6 +608,8 @@ t-setup-import () { (set -e; cd $tmp; tar xf "$simport.tar") fi + mkdir -p $tmp/must-clean + . "$simport" } @@ -617,6 +722,27 @@ t-check-pushed-master () { 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} @@ -644,6 +770,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 @@ -653,6 +785,7 @@ t-splitbrain-pushed-good--unpack () { ln -s $tmp/incoming/*.orig*.tar* . ||: ln -s $incoming_dsc . ln -s ${incoming_dsc/.dsc/.debian.tar}* . + ln -s ${incoming_dsc/.dsc/.tar}* . ||: dpkg-source "$@" -x *.dsc cd */. git init @@ -681,11 +814,12 @@ t-splitbrain-pushed-good-start () { t-refs-same-start t-ref-same refs/heads/split.p - case "$(t-git-get-ref refs/heads/split.b)" in + local split_b=$(t-git-get-ref refs/heads/split.b) + case "$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' ;; + *) fail "bad b/p (b=$split_b)" ;; esac t-pushed-good-core @@ -699,16 +833,21 @@ t-splitbrain-pushed-good-end-made-dep14 () { cd $tmp/$p } -t-splitbrain-rm-gitignore-patch () { +t-splitbrain-rm-1-patch () { + local patchname=$1 perl -i -pe ' - next unless $_ eq "auto-gitignore\n"; + next unless $_ eq "'"$patchname"'\n"; die if $counter++; chomp; - rename "debian/patches/$_", "../t-auto-gitignore" or die $!; + rename "debian/patches/$_", "../t-'"$patchname"'" or die $!; $_ = ""; ' debian/patches/series } +t-splitbrain-rm-gitignore-patch () { + t-splitbrain-rm-1-patch auto-gitignore +} + t-gbp-pushed-good () { local suite=${1:-sid} t-splitbrain-pushed-good-start @@ -743,18 +882,27 @@ t-gbp-pushed-good () { } t-unapplied-pushed-good () { + local suite=${1:-sid} t-splitbrain-pushed-good-start t-splitbrain-pushed-good--unpack --skip-patches t-splitbrain-pushed-good-end-made-dep14 } t-dpm-pushed-good () { + local suite=${1:-sid} t-splitbrain-pushed-good-start t-splitbrain-pushed-good--unpack t-splitbrain-rm-gitignore-patch t-splitbrain-pushed-good-end-made-dep14 } +t-split-unchanged-pushed-good () { + local suite=${1:-sid} + t-splitbrain-pushed-good-start + t-splitbrain-pushed-good--unpack + t-splitbrain-pushed-good-end-made-dep14 +} + t-commit-build-push-expect-log () { local msg=$1 local mpat=$2 @@ -778,6 +926,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 @@ -801,7 +955,14 @@ t-tstunt--save-real () { local rc local real set +e - real=$(type -p "$f") + real=$( + p=":$PATH:" + p="${p/:"$tmp/tstunt":/:}" + p="${p%:}" + p="${p#:}" + PATH="$p" + type -p "$f" + ) rc=$? set -e @@ -904,7 +1065,6 @@ t-git-pseudo-merge () { } t-gbp-example-prep-no-ff () { - t-tstunt-parsechangelog t-archive example 1.0-1 t-git-none t-worktree 1.0 @@ -942,25 +1102,60 @@ 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 - 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 @@ -982,15 +1177,6 @@ t-drs () { ln -sf /bin/true $drs_dispatch/policy-hook } -t-newtag () { - export tagpfx=archive/test-dummy - 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 -} - t-dsd () { t-drs t-git-config dgit-distro.test-dummy.ssh "$troot/dsd-ssh" @@ -1009,7 +1195,9 @@ t-dsd () { } t-policy-admin () { + : '((((((((((((((((((((((((((((((((((((((((' ${DGIT_INFRA_PFX}dgit-repos-admin-debian --repos $tmp/git "$@" + : '))))))))))))))))))))))))))))))))))))))))' } t-policy-nonexist () { @@ -1036,13 +1224,65 @@ t-debpolicy () { t-dsd t-policy dgit-repos-policy-debian - mkdir $tmp/git + mkdir -p $tmp/git t-policy-admin create-db } t-policy-periodic () { + : '((((((((((((((((((((((((((((((((((((((((' ${DGIT_REPOS_SERVER_TEST-dgit-repos-server} \ test-dummy $drs_dispatch '' --cron + : '))))))))))))))))))))))))))))))))))))))))' +} + +t-tagupl-settings () { + export DGIT_DRS_EMAIL_NOREPLY=noreply@example.org + export DGIT_DRS_SENDMAIL=$troot/tstunt/sendmail + export DGIT_DRS_DGIT=$troot/tstunt/dgit + t-chain-test-somehow + + mkdir ../pretend-salsa + (set -e; cd ../pretend-salsa; git init --bare) + git remote add salsa $tmp/pretend-salsa + # git branch --set-upstream-to complains, so + git config branch.master.remote salsa + git config branch.master.merge refs/heads/master +} + +t-tagupl-run-drs () { + local source=$1 + cd .. + cd tagupl + + DGIT_DRS_ANY_URL=1 \ + DGIT_DRS_MODE="tag2upload $source $tagname" \ + $troot/drs-git-ext + + cd $tmp/$p +} + +t-tagupl-test () { + ${DGIT_DEBPUSH_TEST-git debpush} \ + --distro=test-dummy -u Senatus "$@" + + mkdir ../tagupl + t-tagupl-run-drs $tmp/pretend-salsa + + cd ../pretend-salsa + t-refs-same refs/heads/master + cd ../$p + + t-dgit fetch +} + +t-buildproductsdir-config () { + bpd=$tmp/bpd + t-git-config dgit.default.build-products-dir $bpd + mkdir -p $bpd + cat <>$tmp/.gbp.conf +[buildpackage] +export-dir = $bpd +END } t-restrict () { @@ -1054,13 +1294,17 @@ t-dependencies () { : "Hopefully installed: $*" } +t-chain-test-somehow () { + export DGIT_TEST_TESTNAME="$testname" + export DGIT_TEST_TMPBASE="$tmpbase" + export ADTTMP=$tmp +} + t-chain-test () { + t-chain-test-somehow local ct=$1 local d=${0%/*} cd $root - export DGIT_TEST_TESTNAME="$testname" - export DGIT_TEST_TMPBASE="$tmpbase" - export ADTTMP=$tmp exec "$d/$ct" } @@ -1070,7 +1314,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