X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=dgit.git;a=blobdiff_plain;f=tests%2Flib;h=ddef5f021a37e9d4dbb7a16f87b9374b44806ad5;hp=48bc237347fe00a525110bc5d8f788b2f1dd6ebd;hb=6ce82b29dc651abd46de2cc36c07f41f02c159ed;hpb=e336da03c1d9568dc889e18659c483d5eb047c99 diff --git a/tests/lib b/tests/lib index 48bc2373..ddef5f02 100644 --- a/tests/lib +++ b/tests/lib @@ -7,6 +7,20 @@ set -o pipefail . tests/lib-core . tests/lib-restricts +t-report-failure () { + set +x + rc=$1 + cat <&2 +TEST FAILED +funcs: ${FUNCNAME[*]} +lines: ${BASH_LINENO[*]} +files: ${BASH_SOURCE[*]} +END + exit 16 +} + +trap 'test $? = 0 || t-report-failure' EXIT + t-set-intree : ${DGIT_TEST_DEBUG=-D} @@ -22,6 +36,7 @@ testname="${DGIT_TEST_TESTNAME-${0##*/}}" tmp=$ADTTMP if [ x"$tmp" = x ]; then mkdir -p tests/tmp + tmpbase=$troot/tmp tmp=tests/tmp/$testname rm -rf $tmp mkdir $tmp @@ -32,6 +47,8 @@ tmp=`pwd` t-set-using-tmp +env -0 >$tmp/.save-env + ln -f $troot/ssh ssh mkdir -p $tmp/gnupg @@ -48,6 +65,9 @@ incoming = $tmp/incoming run_dinstall = 0 END +: ${tagpfx:=test-dummy} +: ${suitespecs:=sid:unstable} + t-git-next-date () { GIT_COMMITTER_DATE="$(( ${GIT_COMMITTER_DATE%% *} + 1 )) ${GIT_COMMITTER_DATE#* }" GIT_AUTHOR_DATE="$GIT_COMMITTER_DATE" @@ -192,30 +212,43 @@ t-prep-newpackage () { t-archive-none () { t-select-package $1 - mkdir -p $tmp/aq $tmp/mirror/pool/main + mkdir -p $tmp/aq/dsc_in_suite $tmp/mirror/pool/main - local suite=sid + : >$tmp/aq/suites + local jsondelim="[" - >$tmp/aq/package.$suite.$p - t-archive-updated $suite $p + local suitespec + for suitespec in $suitespecs; do + local suite=${suitespec%%:*} + local sname=${suitespec#*:} + + >$tmp/aq/package.$suite.$p + t-archive-updated $suite $p - >$tmp/aq/package.new.$p - t-archive-updated new $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 -[ + ln -s $suite $tmp/aq/dsc_in_suite/$sname + + cat <>$tmp/aq/suites +$jsondelim { "archive" : "ftp-master", - "codename" : "sid", + "codename" : "$suite", "components" : [ "main", "contrib", "non-free" ], - "name" : "unstable", - "dakname" : "unstable" - } + "name" : "$sname", + "dakname" : "$sname" +END + + jsondelim=" }," + + done + cat <>$tmp/aq/suites + } ] END } @@ -237,7 +270,8 @@ t-archive-updated () { "filename" => "$4", }; END { - print to_json \@v or die $!; + my $json = JSON->new->canonical(); + print $json->encode(\@v) or die $!; } ' } @@ -301,7 +335,7 @@ t-dgit () { {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{' $dgit --dgit=$dgit --dget:-u --dput:--config=$tmp/dput.cf \ -dtest-dummy $DGIT_TEST_OPTS $DGIT_TEST_DEBUG \ - -k39B13D8A "$@" + -k39B13D8A $t_dgit_xopts "$@" : '}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} ' } @@ -330,7 +364,7 @@ t-cloned-fetched-good () { } t-output () { - printf "%s\n" "$1" >$tmp/t.want + printf "%s${1:+\n}" "$1" >$tmp/t.want shift "$@" >$tmp/t.got diff $tmp/t.want $tmp/t.got @@ -340,6 +374,64 @@ t-clean-on-branch () { t-output "## $1" git status -b --porcelain } +t-setup-done () { + local savevars=$1 + local savedirs=$2 + local importeval=$3 + + exec 4>$tmp/IMPORT.new + + local vn + for vn in $savevars; do + perl >&4 -I. -MDebian::Dgit -e ' + printf "%s=%s\n", $ARGV[0], shellquote $ARGV[1] + ' $vn "$(eval "printf '%s\n' \"\$$vn\"")" + done + + (set -e; cd $tmp; tar cf IMPORT.tar $savedirs) + + printf >&4 "\n%s\n" "$importeval" + + mv -f $tmp/IMPORT.new $tmp/IMPORT +} + +t-setup-import () { + local setupname=$1 + + local setupsrc + local lock + if [ "x$tmpbase" = x ]; then + # ADTTMP was set on entry to tests/lib, so we + # are not sharing tmp area between tests + setupsrc="$tmp" + lock="$tmp/.dummy.lock" + else + setupsrc="$tmpbase/$setupname" + lock="$setupsrc.lock" + fi + + local simport="$setupsrc/IMPORT" + + if ! [ -e "$simport" ]; then + with-lock-ex -w "$lock" \ + xargs -0 -a $tmp/.save-env \ + bash -xec ' + cd "$1"; shift + setupname="$1"; shift + simport="$1"; shift + if [ -e "$simport" ]; then exit 0; fi + env - "$@" \ + "tests/setup/$setupname" + ' x "$root" "$setupname" "$simport" + fi + + if [ "x$setupsrc" != "x$tmp" ]; then + (set -e; cd $tmp; tar xf "$simport.tar") + fi + + . "$simport" +} + t-git-get-ref-exact () { local ref=$1 # does not dereference, unlike t-git-get-ref @@ -385,7 +477,8 @@ t-ref-same-val () { case "$t_ref_val" in '') ;; "$val") ;; - *) fail "ref varies: $name: $val != $t_ref_val" ;; + *) fail "ref varies: $name:\ + ${val:-nothing} != ${t_ref_val:-nothing}" ;; esac t_ref_val="$val" } @@ -412,7 +505,29 @@ t-refs-notexist () { } t-v-tag () { - echo refs/tags/test-dummy/${v//\~/_} + echo refs/tags/$tagpfx/${v//\~/_} +} + +t-format-ref () { + git log -n1 --pretty=format:"$1" "$2" +} + +t-sametree-parent () { + local ref=$1 + local parent + local 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") + if [ "x$ptree" = "x$ctree" ]; then + psame+=" $parent" + fi + done + case "$psame" in ""|" * *") break ;; esac + ref="${psame# }" + done + echo "$ref" } t-check-pushed-master () { @@ -426,17 +541,23 @@ t-check-pushed-master () { t-pushed-good () { local branch=$1 + local suite=${2:-sid} + t-refs-same \ + refs/heads/$branch + t-pushed-good-core +} + +t-pushed-good-core () { t-ref-dsc-dgit t-refs-same \ - refs/heads/$branch \ `t-v-tag` \ - refs/remotes/dgit/dgit/sid + refs/remotes/dgit/dgit/$suite t-refs-notexist \ refs/heads/dgit/unstable \ refs/remotes/dgit/dgit/unstable (set -e; cd $dgitrepo t-refs-same \ - refs/dgit/sid \ + refs/dgit/$suite \ `t-v-tag` ${t_check_pushed_master:- : NOT-DRS-NO-CHECK-PUSHED-MASTER} t-refs-notexist \ @@ -445,6 +566,85 @@ t-pushed-good () { git verify-tag `t-v-tag` } +t-gbp-pushed-good--unpack () { + cd $tmp + rm -rf t-unpack + mkdir t-unpack + cd t-unpack + ln -s $tmp/mirror/pool/main/*.orig*.tar* . + ln -s $incoming_dsc . + ln -s ${incoming_dsc/.dsc/.debian.tar}* . + dpkg-source "$@" -x *.dsc + cd */. + git init + git fetch ../../$p "refs/tags/*:refs/tags/*" +} + +t-gbp-pushed-good--checkprep () { + git add -Af . + git rm --cached -r --ignore-unmatch .pc +} + +t-gbp-pushed-good--checkdiff () { + local tag=$1 + t-gbp-pushed-good--checkprep + t-output "" git diff --stat --cached $tag +} + +t-gbp-pushed-good () { + local suite=${1:-sid} + local dep14tag=refs/tags/test-dummy/${v//\~/_} + local dgittag=$(t-v-tag) + t-output "" git status --porcelain + t-ref-head + t-refs-same $dep14tag + (set -e; cd $dgitrepo; t-refs-same $dep14tag) + git merge-base --is-ancestor $dep14tag $dgittag + + t-refs-same-start + t-pushed-good-core + + t-incoming-dsc + + t-gbp-pushed-good--unpack + t-gbp-pushed-good--checkdiff $dgittag + + # Right, now we want to check that the maintainer tree and + # the dgit tree differ in exactly the ways we expect. We + # achieve this by trying to reconstruct the maintainer tree + # from the dgit tree. + + # So, unpack it withut the patches applied + t-gbp-pushed-good--unpack --skip-patches + + # dgit might have added a .gitignore patch, which we need to + # drop and remove + perl -i -pe ' + next unless $_ eq "auto-gitignore\n"; + die if $counter++; + chomp; + rename "debian/patches/$_", "../t-auto-gitignore" or die $!; + $_ = ""; + ' debian/patches/series + + # Now the result should differ only in non-debian/ .gitignores + t-gbp-pushed-good--checkprep + git diff --cached --name-only $dep14tag >../changed + perl -ne ' + next if !m#^debian/# && m#(^|/)\.gitignore#; + die "$_ mismatch"; + ' <../changed + + # If we actually apply the gitignore patch by hand, it + # should be perfect: + if [ -f ../t-auto-gitignore ]; then + patch --backup-if-mismatch -p1 -u <../t-auto-gitignore + fi + t-gbp-pushed-good--checkdiff $dep14tag + + cd $tmp/$p +} + t-commit-build-push-expect-log () { local msg=$1 local mpat=$2 @@ -497,11 +697,16 @@ t-tstunt-parsechangelog () { t-tstunt dpkg-parsechangelog Dpkg/Changelog/Parse.pm } -t-ref-dsc-dgit () { +t-incoming-dsc () { local dsc=${p}_${v}.dsc - local val=`t-822-field $tmp/incoming/$dsc Dgit` - perl -e '$_=shift @ARGV; die "$dsc Dgit $_ ?" unless m/^\w+\b/;' "$val" - t-ref-same-val $dsc "$val" + incoming_dsc=$tmp/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" + t-ref-same-val $incoming_dsc "$val" } t-apply-diff () { @@ -512,10 +717,57 @@ t-apply-diff () { | patch -p1 -u } +t-gbp-unapplied-pq2qc () { + # does `gbp pq export' + # commits the resulting debian/patches on qc/BRANCH + # leaves us on qc/BRANCH (eg "qc/quilt-tip")) + # qc/BRANCH is not fast-forwarding + + gbp pq export + + branch=`git symbolic-ref HEAD` + branch=${branch#refs/heads/} + + case "$branch" in + */*) fail "unexpected branch $branch" ;; + esac + + git branch -f qc/$branch + git checkout qc/$branch + git add debian/patches + git commit -m 'Commit patch queue' +} + +t-gbp-example-prep () { + t-tstunt-parsechangelog + t-archive example 1.0-1 + t-git-none + t-worktree 1.0 + + cd example + + t-dgit fetch + + git-checkout -b patch-queue/quilt-tip-2 patch-queue/quilt-tip + gbp pq rebase + + echo '/* some comment */' >>src.c + git add src.c + git commit -m 'Add a comment to an upstream file' + + t-gbp-unapplied-pq2qc + + t-commit 'some updates' 1.0-2 + + git merge -s ours \ + -m 'Pseudo-merge to make descendant of archive' \ + remotes/dgit/dgit/sid +} + t-commit () { local msg=$1 - v=${2-1.$revision} - dch -v$v --distribution unstable "$1" + v=${2:-${majorv:-1}.$revision} + dch -v$v --distribution ${3:-unstable} "$1" git add debian/changelog debcommit revision=$(( ${revision-0} + 1 )) @@ -530,6 +782,7 @@ t-drs () { 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 old,new cp $troot/gnupg/{dd.gpg,dm.gpg,dm.txt} $tmp/. cp $troot/suites $tmp/. cp $troot/suites $tmp/suites-master @@ -551,6 +804,14 @@ 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 +} +t-oldtag () { + 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"