X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=dgit.git;a=blobdiff_plain;f=tests%2Flib;h=e7ab334cc3daae7dc644ba5a8b9d8b1c94b768a2;hp=1d189a9203d05785cc0260f6d4fc668a3d06ee2d;hb=224c9211c06b084eb9583708860ca1fff0e456ad;hpb=1891cf0f12e32d647e24e7da6730e10d48d33fc3 diff --git a/tests/lib b/tests/lib index 1d189a92..e7ab334c 100644 --- a/tests/lib +++ b/tests/lib @@ -28,6 +28,8 @@ t-set-intree : ${DGIT_TEST_DEBUG=-D} export DGIT_TEST_DEBUG +: ${DGIT_TEST_DISTRO+ ${distro=${DGIT_TEST_DISTRO}}} + export GIT_COMMITTER_DATE='1440253867 +0100' export GIT_AUTHOR_DATE='1440253867 +0100' @@ -51,6 +53,7 @@ tmp=`pwd` t-set-using-tmp +test -f $tmp/.save-env || \ env -0 >$tmp/.save-env ln -f $troot/ssh ssh @@ -65,6 +68,7 @@ incoming = $tmp/incoming run_dinstall = 0 END +: ${t_archive_method:=aq} : ${tagpfx:=archive/test-dummy} : ${suitespecs:=sid:unstable} @@ -113,7 +117,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" "$@" @@ -190,14 +194,27 @@ 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 } +t-has-parent-or-is () { + # t-has-parent-or-is CHILD PARENT + local child=$1 + local parent=$2 + local parents + 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 @@ -214,6 +231,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 @@ -225,10 +245,10 @@ 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 -sf $suite $tmp/aq/dsc_in_suite/$sname @@ -255,7 +275,7 @@ END END } -t-archive-updated () { +t-aq-archive-updated () { local suite=$1 local p=$2 local suitedir=$tmp/aq/dsc_in_suite/$suite @@ -287,9 +307,16 @@ t-archive-process-incoming () { t-archive-query () { local suite=${1-sid} local dscf=main/${p}_${v}.dsc - local sha=`sha256sum <$tmp/mirror/pool/$dscf` + 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; 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 () { @@ -298,7 +325,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) @@ -326,6 +353,53 @@ t-git-dir-check () { esac } +t-expect-fsck-fail () { + echo >>$tmp/fsck.expected-errors "$1" +} + +t-git-fsck () { + set +e + LC_MESSAGES=C git fsck --no-dangling --strict 2>&1 \ + | tee dgit-test-fsck.errs + ps="${PIPESTATUS[*]}" + set -e + + local pats + if [ -f $tmp/fsck.expected-errors ]; then + pats=(-w -f $tmp/fsck.expected-errors) + else + test "$ps" = "0 0" + fi + pats+=(-e 'notice: HEAD points to an unborn branch') + pats+=(-e 'notice: No default references') + + set +e + grep -v "${pats[@]}" dgit-test-fsck.errs + rc=$? + set -e + case $rc in + 1) ;; # no unexpected errors + 0) fail "unexpected messages from git-fsck" ;; + *) fail "grep of git-fsck failed" ;; + esac +} + +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 } @@ -336,7 +410,9 @@ t-dgit () { : ' {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{' $dgit --dgit=$dgit --dget:-u --dput:--config=$tmp/dput.cf \ - -dtest-dummy $DGIT_TEST_OPTS $DGIT_TEST_DEBUG \ + ${dgit_config_debian_alias-"--config-lookup-explode=dgit-distro.debian.alias-canon"} \ + ${distro+${distro:+-d}}${distro--dtest-dummy} \ + $DGIT_TEST_OPTS $DGIT_TEST_DEBUG \ -k39B13D8A $t_dgit_xopts "$@" : '}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} ' @@ -459,35 +535,37 @@ 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 } 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 () { @@ -518,11 +596,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 @@ -534,11 +612,11 @@ 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 } @@ -575,6 +653,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 @@ -604,6 +683,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 @@ -695,6 +781,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 @@ -709,12 +801,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 @@ -726,6 +854,14 @@ t-tstunt-parsechangelog () { t-tstunt dpkg-parsechangelog Dpkg/Changelog/Parse.pm } +t-tstunt-lintian () { + t-tstunt lintian +} + +t-tstunt-debuild () { + t-tstunt debuild +} + t-incoming-dsc () { local dsc=${p}_${v}.dsc incoming_dsc=$tmp/incoming/$dsc @@ -733,8 +869,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" } @@ -809,10 +949,19 @@ t-gbp-example-prep () { remotes/dgit/dgit/sid } +t-make-badcommit () { + badcommit=$( + git cat-file commit HEAD | \ + perl -pe 's/^committer /commiter /' | \ + git hash-object -w -t commit --stdin + ) + t-expect-fsck-fail $badcommit +} + 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 )) @@ -876,7 +1025,9 @@ t-dsd () { } t-policy-admin () { + : '((((((((((((((((((((((((((((((((((((((((' ${DGIT_INFRA_PFX}dgit-repos-admin-debian --repos $tmp/git "$@" + : '))))))))))))))))))))))))))))))))))))))))' } t-policy-nonexist () { @@ -908,8 +1059,10 @@ t-debpolicy () { } t-policy-periodic () { + : '((((((((((((((((((((((((((((((((((((((((' ${DGIT_REPOS_SERVER_TEST-dgit-repos-server} \ test-dummy $drs_dispatch '' --cron + : '))))))))))))))))))))))))))))))))))))))))' } t-restrict () { @@ -937,6 +1090,8 @@ t-alt-test () { t-chain-test "${t#*-}" } +t-git-config dgit.default.old-dsc-distro test-dummy + case "$0" in */gnupg) ;; *) t-setup-import gnupg ;;