chiark / gitweb /
Test suite: quilt-gbp: Provide and use t-gbp-pushed-good
[dgit.git] / tests / lib
index 9b8894ef74b60569b77c46da8753c5bab0474bd2..bf3237dc549e33a78d692f63b2b57ff9b7a494fd 100644 (file)
--- a/tests/lib
+++ b/tests/lib
@@ -364,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
@@ -508,6 +508,28 @@ t-v-tag () {
        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 () {
        local master=`t-git-get-ref refs/heads/master`
        if [ x$master = x$t_ref_val ]; then return; fi
@@ -520,9 +542,14 @@ 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/$suite
        t-refs-notexist \
@@ -539,6 +566,84 @@ 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
+       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
@@ -591,11 +696,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 () {