chiark / gitweb /
Test suite: Add t-tstunt-parsechangelog to a couple of tests
[dgit.git] / tests / lib
index 6b31c9d8635504862328ffbb750e677b4c4da42e..ddef5f021a37e9d4dbb7a16f87b9374b44806ad5 100644 (file)
--- a/tests/lib
+++ b/tests/lib
@@ -36,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
@@ -46,6 +47,8 @@ tmp=`pwd`
 
 t-set-using-tmp
 
+env -0 >$tmp/.save-env
+
 ln -f $troot/ssh ssh
 
 mkdir -p $tmp/gnupg
@@ -62,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"
@@ -206,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 <<END >>$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 <<END >>$tmp/aq/suites
+    }
 ]
 END
 }
@@ -251,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 $!;
                }
        '
 }
@@ -315,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 "$@"
        : '}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
 '
 }
@@ -344,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
@@ -354,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
@@ -399,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"
 }
@@ -426,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 () {
@@ -440,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 \
@@ -459,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
@@ -511,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 () {
@@ -548,6 +739,7 @@ t-gbp-unapplied-pq2qc () {
 }
 
 t-gbp-example-prep () {
+       t-tstunt-parsechangelog
        t-archive example 1.0-1
        t-git-none
        t-worktree 1.0
@@ -574,8 +766,8 @@ t-gbp-example-prep () {
 
 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 ))
@@ -590,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
@@ -611,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"