+}
+
+t-gdr-good () {
+ local state=$1
+ local beforetag=$2 # say HEAD to skip this check
+ # state should be one of
+ # laundered
+ # stitched
+ # patches
+
+ git diff --quiet ${beforetag-t.before} -- ':.' ':!debian/patches'
+
+ local etype netype bwtip
+
+ case $state in
+ laundered)
+ etype=Upstream
+ bwtip=Y:`t-git-debrebase breakwater`
+ ;;
+ stitched) etype=Pseudomerge ;;
+ pushed) etype=AddPatches; netype=Pseudomerge ;;
+ esac
+
+ t-git-debrebase analyse >../anal.check
+ expect=`git rev-parse HEAD`
+ exec <../anal.check
+ local cid ctype info nparents
+ while read cid ctype info; do
+ : ===== $cid $ctype $info =====
+ test $cid = $expect
+ local cetype=$etype
+ if [ "x$ctype" = "x$etype" ]; then cetype=SAME; fi
+ local parents="`git log -n1 --pretty=format:%P $cid`"
+ expect="$parents"
+ enparents=1
+ : "$ctype/$cetype" "$parents"
+
+ case "$ctype/$cetype" in
+ Pseudomerge/SAME) ;;
+ Packaging/SAME) ;;
+ Packaging/Upstream) ;;
+ AddPatches/SAME) ;;
+ Changelog/Packaging) ;;
+ Changelog/Upstream) ;;
+ Upstream/SAME) ;;
+ BreakwaterUpstreamMerge/Upstream) ;;
+ BreakwaterUpstreamMerge/Packaging) ;;
+ *)
+ fail "etype=$etype ctype=$ctype cetype=$cetype $cid"
+ ;;
+ esac
+
+ case "$ctype/$etype" in
+ Packaging/Upstream|\
+ Changelog/Upstream)
+ if [ "x$bwtip" != x ]; then
+ test "$bwtip" = "Y:$cid"
+ bwtip=''
+ fi
+ esac
+
+ case "$ctype" in
+ Pseudomerge)
+ expect=${info#Contributor=}
+ expect=${expect%% *}
+ enparents=2
+ git diff --quiet $expect..$cid
+ etype=Upstream
+ ;;
+ Packaging)
+ git diff --quiet $expect..$cid -- ':.' ':!debian'
+ git diff --quiet $expect..$cid -- ':debian/patches'
+ etype=Packaging
+ ;;
+ AddPatches)
+ git diff --quiet $expect..$cid -- \
+ ':.' ':!debian/patches'
+ etype=$netype
+ netype=Upstream
+ ;;
+ Changelog)
+ git diff --quiet $expect..$cid -- \
+ ':.' ':!debian/changelog'
+ etype=Packaging
+ ;;
+ Upstream/SAME)
+ git diff --quiet $expect..$cid -- ':debian'
+ ;;
+ BreakwaterUpstreamMerge)
+ break
+ ;;
+ esac
+
+ local cnparents=`printf "%s" "$parents" | wc -w`
+ test $cnparents = $enparents
+
+ case "$parents" in
+ *"$expect"*) ;;
+ *) fail 'unexpected parent' ;;
+ esac
+
+ done
+}
+
+t-some-changes () {
+ local token=$1
+
+ t-git-next-date
+
+ echo >>debian/zorkmid "// debian $token"
+ git add debian/zorkmid
+ git commit -m "DEBIAN add zorkmid ($token)"
+
+ echo >>src.c "// upstream $token"
+ git commit -a -m "UPSTREAM edit src.c ($token)"
+
+ for f in debian/zorkmid src.c; do
+ echo "// both! $token" >>$f
+ git add $f
+ done
+ git commit -m "MIXED add both ($token)"
+
+ t-git-next-date
+}
+
+t-make-new-upstream-tarball () {
+ local uv=$1
+ git checkout make-upstream
+ # leaves ust set to filename of orig tarball
+ echo "upstream $uv" >>docs/README
+ git commit -a -m "upstream $uv tarball"
+ ust=example_$uv.orig.tar.gz
+ git archive -o ../$ust --prefix=example-2.0/ make-upstream