summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rwxr-xr-xtests/enumerate-tests18
-rw-r--r--tests/lib23
-rw-r--r--tests/lib-core1
-rw-r--r--tests/lib-gdr277
-rwxr-xr-xtests/setup/gdr-convert-gbp100
-rwxr-xr-xtests/setup/gdr-convert-gbp-noarchive9
-rwxr-xr-xtests/tests/gdr-diverge-nmu61
-rwxr-xr-xtests/tests/gdr-diverge-nmu-dgit55
-rwxr-xr-xtests/tests/gdr-edits40
-rwxr-xr-xtests/tests/gdr-import-dgit68
-rwxr-xr-xtests/tests/gdr-newupstream-v065
-rwxr-xr-xtests/tests/gdr-subcommands226
-rwxr-xr-xtests/tests/gdr-viagit40
13 files changed, 976 insertions, 7 deletions
diff --git a/tests/enumerate-tests b/tests/enumerate-tests
index 2c00f97..5a4d235 100755
--- a/tests/enumerate-tests
+++ b/tests/enumerate-tests
@@ -42,15 +42,29 @@ finish- () {
test-begin-gencontrol () {
restrictions=''
- dependencies=''
+ dependencies='dgit, dgit-infrastructure, devscripts, debhelper (>=8), fakeroot, build-essential, chiark-utils-bin'
}
restriction-gencontrol () {
restrictions+=" $r"
}
+gencontrol-add-deps () {
+ for dep in "$@"; do
+ dependencies+="${dependencies:+, }$dep"
+ done
+}
+
dependencies-gencontrol () {
- dependencies+=", $deps"
+ for dep in "$deps"; do
+ case "$dep" in
+ NO-DGIT) dependencies='chiark-utils-bin' ;;
+ GDR) gencontrol-add-deps \
+ git-debrebase git-buildpackage faketime
+ ;;
+ *) gencontrol-add-deps "$dep" ;;
+ esac
+ done
}
test-done-gencontrol () {
diff --git a/tests/lib b/tests/lib
index e4554e3..bd06d20 100644
--- a/tests/lib
+++ b/tests/lib
@@ -31,8 +31,8 @@ export DGIT_TEST_DEBUG
: ${DGIT_TEST_DISTRO+ ${distro=${DGIT_TEST_DISTRO}}}
-export GIT_COMMITTER_DATE='1440253867 +0100'
-export GIT_AUTHOR_DATE='1440253867 +0100'
+export GIT_COMMITTER_DATE='1515000000 +0100'
+export GIT_AUTHOR_DATE='1515000000 +0100'
root=`pwd`
troot=$root/tests
@@ -189,6 +189,13 @@ t-git-none () {
(set -e; cd $tmp/git; tar xf $troot/git-template.tar)
}
+t-salsa-add-remote () {
+ local d=$tmp/salsa/$p
+ mkdir -p $d
+ (set -e; cd $d; git init --bare)
+ git remote add ${1-origin} $d
+}
+
t-git-merge-base () {
git merge-base $1 $2 || test $? = 1
}
@@ -415,9 +422,10 @@ t-dgit () {
{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{'
$dgit --dgit=$dgit --dget:-u --dput:--config=$tmp/dput.cf \
${dgit_config_debian_alias-"--config-lookup-explode=dgit-distro.debian.alias-canon"} \
+ ${DGIT_GITDEBREBASE_TEST+--git-debrebase=}${DGIT_GITDEBREBASE_TEST} \
${distro+${distro:+-d}}${distro--dtest-dummy} \
$DGIT_TEST_OPTS $DGIT_TEST_DEBUG \
- -k39B13D8A $t_dgit_xopts "$@"
+ -kBCD22CD83243B79D3DFAC33EA3DBCBC039B13D8A $t_dgit_xopts "$@"
: '}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
'
}
@@ -472,12 +480,12 @@ t-setup-done () {
local savedirs=$2
local importeval=$3
- local import=IMPORT.${0##*/}
+ local import=IMPORT.${DGIT_TEST_TESTNAME-${0##*/}}
exec 4>$tmp/$import.new
local vn
for vn in $savevars; do
- perl >&4 -I. -MDebian::Dgit -e '
+ perl >&4 -"I$root" -MDebian::Dgit -e '
printf "%s=%s\n", $ARGV[0], shellquote $ARGV[1]
' $vn "$(eval "printf '%s\n' \"\$$vn\"")"
done
@@ -997,6 +1005,11 @@ t-commit () {
revision=$(( ${revision-0} + 1 ))
}
+t-dch-commit () {
+ faketime @"${GIT_AUTHOR_DATE% *}" dch "$@"
+ git commit -m "dch $*" debian/changelog
+}
+
t-git-config () {
git config --global "$@"
}
diff --git a/tests/lib-core b/tests/lib-core
index d65a1ff..c3a04cb 100644
--- a/tests/lib-core
+++ b/tests/lib-core
@@ -12,6 +12,7 @@ t-set-intree () {
: ${DGIT_REPOS_SERVER_TEST:=$DGIT_TEST_INTREE/infra/dgit-repos-server}
: ${DGIT_SSH_DISPATCH_TEST:=$DGIT_TEST_INTREE/infra/dgit-ssh-dispatch}
: ${DGIT_INFRA_PFX:=$DGIT_TEST_INTREE${DGIT_TEST_INTREE:+/infra/}}
+ : ${DGIT_GITDEBREBASE_TEST:=$DGIT_TEST_INTREE/git-debrebase}
export DGIT_TEST DGIT_BADCOMMIT_FIXUP
export DGIT_REPOS_SERVER_TEST DGIT_SSH_DISPATCH_TEST
export PERLLIB="$DGIT_TEST_INTREE${PERLLIB:+:}${PERLLIB}"
diff --git a/tests/lib-gdr b/tests/lib-gdr
new file mode 100644
index 0000000..9eb7537
--- /dev/null
+++ b/tests/lib-gdr
@@ -0,0 +1,277 @@
+#
+
+: ${GDR_TEST_DEBUG=-D}
+export GDR_TEST_DEBUG
+
+t-git-debrebase () {
+ local gdr=${DGIT_GITDEBREBASE_TEST-git-debrebase}
+ : '
+{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{'
+ $gdr $GDR_TEST_OPTS $GDR_TEST_DEBUG $t_gdr_xopts "$@"
+ : '}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
+'
+}
+
+t-gdr-good () {
+ local state=$1
+ local beforetag=$2 # say HEAD to skip this check
+ # state should be one of
+ # laundered
+ # stitched
+ # pushed
+
+ git diff --quiet ${beforetag-t.before} -- ':.' ':!debian/patches'
+
+ local etypes bwtip
+
+ LC_MESSAGES=C t-git-debrebase status >../status.check
+ case $state in
+ laundered)
+ egrep '^ *branch is laundered' ../status.check
+ ;;
+ stitched|pushed)
+ egrep \
+ '^ *branch contains furniture|^ *branch is unlaundered|^ *branch needs laundering' ../status.check
+ egrep '^ stitched$' ../status.check
+ ;;
+ esac
+
+ # etypes is either a type,
+ # or PseudoMerge-<more etypes>
+ # or AddPatches-<more etypes>
+
+ case $state in
+ laundered)
+ etypes=Upstream
+ bwtip=Y:`t-git-debrebase breakwater`
+ ;;
+ stitched) etypes=Pseudomerge-Upstream ;;
+ pushed) etypes=AddPatches-Pseudomerge-Upstream ;;
+ pushed-interop) etypes=Pseudomerge-AddPatchesInterop-Upstream ;;
+ 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=${etypes%%-*}
+ if [ "x$ctype" = "x$cetype" ]; 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) ;;
+ AddPatches/AddPatchesInterop) ;;
+ Changelog/Packaging) ;;
+ Changelog/Upstream) ;;
+ Upstream/SAME) ;;
+ Anchor/Upstream) ;;
+ Anchor/Packaging) ;;
+ *)
+ fail "etypes=$etypes ctype=$ctype cetype=$cetype $cid"
+ ;;
+ esac
+
+ case "$ctype/$etypes" in
+ Packaging/Upstream|\
+ Changelog/Upstream)
+ if [ "x$bwtip" != x ]; then
+ test "$bwtip" = "Y:$cid"
+ bwtip=''
+ fi
+ esac
+
+ case "$cetype" in
+ AddPatchesInterop)
+ git log -n1 --pretty=format:%B \
+ | grep '^\[git-debrebase[ :]'
+ ;;
+ esac
+
+ case "$ctype" in
+ Pseudomerge)
+ expect=${info#Contributor=}
+ expect=${expect%% *}
+ enparents=2
+ git diff --quiet $expect..$cid
+ etypes=${etypes#*-}
+
+ : 'reject pointless pseudomerges'
+ local overwritten=${parents/$expect/}
+ overwritten=${overwritten// /}
+ t-git-debrebase analyse $overwritten >../anal.overwr
+ local ocid otype oinfo
+ read <../anal.overwr ocid otype oinfo
+ case "$otype" in
+ Pseudomerge) test "x$info" != "x$oinfo" ;;
+ esac
+ ;;
+ Packaging)
+ git diff --quiet $expect..$cid -- ':.' ':!debian'
+ git diff --quiet $expect..$cid -- ':debian/patches'
+ etypes=Packaging
+ ;;
+ AddPatches)
+ git diff --quiet $expect..$cid -- \
+ ':.' ':!debian/patches'
+ etypes=${etypes#*-}
+ ;;
+ Changelog)
+ git diff --quiet $expect..$cid -- \
+ ':.' ':!debian/changelog'
+ etypes=Packaging
+ ;;
+ Upstream/SAME)
+ git diff --quiet $expect..$cid -- ':debian'
+ ;;
+ Anchor)
+ break
+ ;;
+ esac
+
+ local cnparents=`printf "%s" "$parents" | wc -w`
+ test $cnparents = $enparents
+
+ local cndparents=`
+ for f in $parents; do echo $f; done | sort -u | wc -w
+ `
+ test $cndparents = $cnparents
+
+ 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
+}
+
+t-nmu-upload-1 () {
+ # usage:
+ # v=<full version>
+ # nmu-upload-1 <nmubranch>
+ # gbp pq import or perhaps other similar things
+ # nmu-upload-2
+ # maybe make some dgit-covertible commits
+ # nmu-upload-3
+
+ t-git-next-date
+ nmubranch=$1
+ git checkout -f -b $nmubranch
+ t-git-debrebase
+ t-git-debrebase convert-to-gbp
+ t-git-next-date
+ # now we are on a gbp patched-unapplied branch
+}
+
+
+t-nmu-upload-2 () {
+ t-git-next-date
+ t-dch-commit -v $v -m "nmu $nmubranch $v"
+}
+
+t-nmu-upload-3 () {
+ t-dch-commit -r sid
+
+ t-dgit -wgf build-source
+
+ cd ..
+ c=${p}_${v}_source.changes
+ debsign -kBCD22CD83243B79D3DFAC33EA3DBCBC039B13D8A $c
+ dput -c $tmp/dput.cf test-dummy $c
+
+ t-archive-process-incoming sid
+ t-git-next-date
+ cd $p
+ git checkout master
+}
+
+t-nmu-commit-an-upstream-change () {
+ echo >>newsrc.c "// more upstream"
+ git add newsrc.c
+ git commit -m 'UPSTREAM NMU'
+}
+
+t-maintainer-commit-some-changes () {
+ t-dch-commit -v$v -m "start $v"
+
+ t-some-changes "maintainer $v"
+ t-git-debrebase
+ t-git-debrebase stitch
+
+ git branch did.maintainer
+
+ t-git-next-date
+}
+
+t-nmu-causes-ff-fail () {
+ t-dgit fetch
+
+ t-expect-fail E:'Not.*fast-forward' \
+ git merge --ff-only dgit/dgit/sid
+
+ t-expect-fail E:'-fdiverged.*refs/remotes/dgit/dgit/sid' \
+ t-git-debrebase
+}
+
+t-nmu-reconciled-good () {
+ local nmutree=$1
+
+ : 'check that what we have is what is expected'
+
+ git checkout -b compare.nmu origin/master~0
+ git checkout $nmutree .
+ git rm -rf debian/patches
+ git commit -m 'rm patches nmu'
+
+ git checkout -b compare.maintainer origin/master~0
+ git checkout did.maintainer .
+ git rm -rf --ignore-unmatch debian/patches
+ git commit --allow-empty -m 'rm patches maintainer'
+
+ git merge compare.nmu
+ git diff --quiet master
+
+ : 'check that dgit still likes it'
+
+ git checkout master
+ t-dgit -wgf quilt-fixup
+}
diff --git a/tests/setup/gdr-convert-gbp b/tests/setup/gdr-convert-gbp
new file mode 100755
index 0000000..0b525c8
--- /dev/null
+++ b/tests/setup/gdr-convert-gbp
@@ -0,0 +1,100 @@
+#!/bin/bash
+set -e
+. tests/lib
+. $troot/lib-gdr
+
+t-dependencies GDR
+
+t-tstunt-parsechangelog
+
+not-gdr-processable () {
+ t-git-debrebase analyse | grep 'Unknown Unprocessable'
+}
+
+p=example
+t-worktree 1.1
+
+cd example
+
+: 'fake up some kind of upstream'
+git checkout -b upstream quilt-tip
+rm -rf debian
+mkdir debian
+echo junk >debian/rules
+git add debian
+git commit -m "an upstream retcon ($0)"
+
+: 'fake up that our quilt-tip was descended from upstream'
+git checkout quilt-tip
+git merge --no-edit -s ours upstream
+
+: 'fake up that our quilt-tip had the patch queue in it'
+git checkout patch-queue/quilt-tip
+gbp pq export
+git add debian/patches
+git commit -m "patch queue update ($0)"
+
+not-gdr-processable
+
+: 'fake up an upstream 2.0'
+git branch make-upstream upstream
+t-make-new-upstream-tarball 2.0
+
+: 'make branch names more conventional'
+git branch -D master
+git branch -m quilt-tip master
+
+for b in \
+ quilt-tip-2 \
+ gitish-only \
+ quilt-tip-1.1 \
+ patch-queue/quilt-tip \
+ indep-arch \
+; do
+ git branch -D $b
+done
+
+: 'see what gbp import-orig does'
+git checkout master
+gbp import-orig --upstream-version=2.0 ../$ust
+
+not-gdr-processable
+
+t-dch-commit -v 2.0-1 -m 'new upstream (did gbp import-orig)'
+t-dch-commit -r sid
+
+$ifarchive t-archive-none $p
+$ifarchive t-git-none
+$ifarchive t-dgit -wgf --gbp push-source --new
+
+t-salsa-add-remote
+git push --set-upstream origin master
+
+# OK now this looks like something more normal.
+# We have:
+# maintainer (gbp) view dgit view
+# master
+# debian/2.0-1 archive/debian/2.0-1
+# remotes/origin/master remotes/dgit/dgit/sid
+
+t-git-debrebase -fupstream-has-debian convert-from-gbp
+
+v=2.0-2
+t-dch-commit -v $v -m 'switch to git-debrebase, no other changes'
+t-dch-commit -r sid
+
+$ifarchive t-dgit -wgf push-source --new --overwrite
+git push
+
+cd ..
+
+$ifarchive t-archive-process-incoming sid
+
+t-setup-done '' "$(echo $p*) salsa $($ifarchive echo git mirror aq)" '
+ . $troot/lib-gdr
+ t-tstunt-parsechangelog
+ p=example
+ t-git-next-date
+'
+
+t-ok
diff --git a/tests/setup/gdr-convert-gbp-noarchive b/tests/setup/gdr-convert-gbp-noarchive
new file mode 100755
index 0000000..dfeea3b
--- /dev/null
+++ b/tests/setup/gdr-convert-gbp-noarchive
@@ -0,0 +1,9 @@
+#!/bin/bash
+set -e
+. tests/lib
+. $troot/lib-gdr
+
+t-dependencies GDR
+
+export ifarchive=:
+t-chain-test gdr-convert-gbp
diff --git a/tests/tests/gdr-diverge-nmu b/tests/tests/gdr-diverge-nmu
new file mode 100755
index 0000000..15bf901
--- /dev/null
+++ b/tests/tests/gdr-diverge-nmu
@@ -0,0 +1,61 @@
+#!/bin/bash
+set -e
+. tests/lib
+
+t-dependencies GDR
+
+t-setup-import gdr-convert-gbp
+
+cd $p
+
+t-dgit setup-mergechangelogs
+
+: 'maintainer'
+
+v=2.0-3
+t-maintainer-commit-some-changes
+
+t-git-next-date
+
+: 'non-dgit upload (but we prepare it with dgit anyway)'
+
+t-git-next-date
+git checkout origin/master
+
+v=2.0-2+nmu1
+t-nmu-upload-1 nmu
+gbp pq import
+t-nmu-upload-2
+t-nmu-commit-an-upstream-change
+t-nmu-upload-3
+
+: 'ad hocery'
+
+t-git-next-date
+git checkout master
+t-nmu-causes-ff-fail
+
+git cherry-pick 'dgit/dgit/sid^{/UPSTREAM NMU}'
+
+t-expect-fail 'Automatic merge failed; fix conflicts' \
+git merge --squash -m 'Incorporate NMU' dgit/dgit/sid
+
+git rm -rf debian/patches
+git commit -m 'Incorporate NMU'
+
+git merge -s ours -m 'Declare incorporate NMU' dgit/dgit/sid
+
+: 'right, how are we'
+
+t-git-next-date
+
+t-git-debrebase
+t-gdr-good laundered
+
+t-git-debrebase stitch
+t-gdr-good stitched
+
+
+t-nmu-reconciled-good patch-queue/nmu
+
+t-ok
diff --git a/tests/tests/gdr-diverge-nmu-dgit b/tests/tests/gdr-diverge-nmu-dgit
new file mode 100755
index 0000000..4b5907a
--- /dev/null
+++ b/tests/tests/gdr-diverge-nmu-dgit
@@ -0,0 +1,55 @@
+#!/bin/bash
+set -e
+. tests/lib
+
+t-dependencies GDR
+
+t-setup-import gdr-convert-gbp
+
+cd $p
+
+t-dgit setup-mergechangelogs
+
+: 'maintainer'
+
+git checkout master
+
+v=2.0-3
+t-maintainer-commit-some-changes
+
+t-git-next-date
+
+: 'nmu'
+
+git checkout -b nmu origin/master~0
+
+t-git-next-date
+
+v=2.0-2+nmu1
+t-nmu-commit-an-upstream-change
+t-dch-commit -v$v -m finalise
+t-dch-commit -r sid
+
+t-dgit -wgf push-source
+
+t-archive-process-incoming sid
+
+: 'rebase nmu onto our branch'
+
+t-git-next-date
+git checkout master
+t-nmu-causes-ff-fail
+
+git checkout dgit/dgit/sid # detach
+
+t-expect-fail 'E:CONFLICT.*Commit Debian 3\.0 \(quilt\) metadata' \
+git rebase master
+git rebase --skip
+
+git push . HEAD:master
+git checkout master
+
+
+t-nmu-reconciled-good nmu
+
+t-ok
diff --git a/tests/tests/gdr-edits b/tests/tests/gdr-edits
new file mode 100755
index 0000000..6c77184
--- /dev/null
+++ b/tests/tests/gdr-edits
@@ -0,0 +1,40 @@
+#!/bin/bash
+set -e
+. tests/lib
+
+t-dependencies GDR
+
+t-setup-import gdr-convert-gbp
+
+cd $p
+
+v=2.0-3
+t-dch-commit -v $v -m testing
+
+t-git-debrebase analyse |tee ../anal.1
+cat ../anal.1
+
+t-some-changes edits
+
+t-dch-commit -r sid
+
+git tag t.before
+
+t-git-debrebase
+t-gdr-good laundered
+
+t-dgit push-source
+t-gdr-good pushed-interop
+
+git branch before-noop
+
+t-git-next-date
+t-git-debrebase
+t-git-debrebase stitch
+t-gdr-good pushed-interop
+
+t-refs-same-start
+t-ref-same refs/heads/before-noop
+t-ref-head
+
+t-ok
diff --git a/tests/tests/gdr-import-dgit b/tests/tests/gdr-import-dgit
new file mode 100755
index 0000000..19918d8
--- /dev/null
+++ b/tests/tests/gdr-import-dgit
@@ -0,0 +1,68 @@
+#!/bin/bash
+set -e
+. tests/lib
+
+t-dependencies GDR
+
+t-setup-import gdr-convert-gbp
+
+cd $p
+
+: 'non-dgit upload (but we prepare it with dgit anyway)'
+
+v=2.0-2+nmu1
+t-nmu-upload-1 nmu
+gbp pq import
+t-nmu-upload-2
+t-some-changes $numbranch
+t-nmu-upload-3
+
+: 'done the nmu, switching back to the maintainer hat'
+
+nmu-fold () {
+ t-git-next-date
+ t-dgit fetch
+ t-git-next-date
+ git merge --ff-only dgit/dgit/sid
+
+ git diff --exit-code patch-queue/$nmubranch
+
+ git branch unlaundered.$nmubranch
+
+ t-git-debrebase
+ t-gdr-good laundered
+
+ t-git-debrebase stitch
+ t-gdr-good stitched
+}
+
+nmu-fold
+
+v=2.0-3
+t-dch-commit -v $v -m "incorporate nmu"
+t-dch-commit -r sid
+t-dgit -wgf push-source
+
+: 'now test a new upstream'
+
+t-make-new-upstream-tarball 2.1
+
+git checkout master
+v=2.1-0+nmu1
+t-nmu-upload-1 nmu2
+
+gbp import-orig --upstream-version=2.1 --debian-branch=nmu2 ../$ust
+t-dch-commit -v $v -m "new upstream $v"
+gbp pq import
+
+#t-dgit -wgf build-source
+
+t-nmu-upload-2
+t-some-changes $numbranch
+t-nmu-upload-3
+
+: 'done the nmu, back to the maintainer'
+
+nmu-fold
+
+t-ok
diff --git a/tests/tests/gdr-newupstream-v0 b/tests/tests/gdr-newupstream-v0
new file mode 100755
index 0000000..e866edc
--- /dev/null
+++ b/tests/tests/gdr-newupstream-v0
@@ -0,0 +1,65 @@
+#!/bin/bash
+set -e
+. tests/lib
+
+t-dependencies NO-DGIT GDR
+
+t-setup-import gdr-convert-gbp-noarchive
+
+cd $p
+
+: 'upstream hat'
+
+new-upstream () {
+ uv=$1
+ t-git-next-date
+ git checkout make-upstream
+ git reset --hard upstream
+ t-make-new-upstream-tarball $uv
+ git push . make-upstream:upstream
+ git checkout master
+ t-git-next-date
+}
+
+new-upstream 2.1
+
+: 'maintainer hat'
+
+git branch startpoint
+v=2.1-1
+
+git checkout master
+
+t-expect-fail F:'Could not determine appropriate upstream commitish' \
+t-git-debrebase new-upstream-v0 $v
+
+git tag v2.1 upstream
+
+t-git-debrebase new-upstream-v0 $v
+t-gdr-good laundered
+
+t-git-debrebase stitch
+t-gdr-good stitched
+
+git branch ordinary
+
+: 'with --anchor'
+
+git reset --hard startpoint
+
+t-git-debrebase analyse >../anal.anch
+anchor=$(perl <../anal.anch -ne '
+ next unless m/^(\w+) Anchor\s/;
+ print $1,"\n";
+ exit;
+')
+
+t-git-debrebase --anchor=$anchor -fanchor-treated new-upstream-v0 $v upstream
+t-gdr-good laundered
+
+t-git-debrebase stitch
+t-gdr-good stitched
+
+git diff --quiet ordinary
+
+t-ok
diff --git a/tests/tests/gdr-subcommands b/tests/tests/gdr-subcommands
new file mode 100755
index 0000000..e59fc07
--- /dev/null
+++ b/tests/tests/gdr-subcommands
@@ -0,0 +1,226 @@
+#!/bin/bash
+set -e
+. tests/lib
+
+t-dependencies GDR
+
+t-setup-import gdr-convert-gbp
+
+cd $p
+
+t-dgit setup-mergechangelogs
+
+mix-it () {
+ t-git-next-date
+
+ local m=$(git symbolic-ref HEAD)
+ t-some-changes "subcommands $m 1"
+
+ # we want patches mde by dgit, not gdr, for our test cases
+ t-dgit --git-debrebase=true -wgf quilt-fixup
+ t-git-next-date
+
+ t-some-changes "subcommands $m 2"
+ t-git-next-date
+}
+
+git checkout -b stitched-laundered master
+mix-it
+t-git-debrebase quick
+t-gdr-good stitched HEAD
+
+git checkout -b stitched-mixed master
+mix-it
+
+git checkout -b unstitched-laundered master
+mix-it
+t-git-debrebase
+t-gdr-good laundered
+
+git checkout -b unstitched-mixed master
+t-git-debrebase
+mix-it
+
+t-git-next-date
+
+git show-ref
+
+subcmd () {
+ local subcmd=$1
+ shift
+ for startbranch in {stitched,unstitched}-{laundered,mixed}; do
+ work="work-$subcmd-$startbranch"
+
+ : "---------- $subcmd $startbranch ----------"
+
+ git for-each-ref "**/$startbranch"{,/**} \
+ --format='create %(refname) %(objectname)' \
+ | sed "s/$startbranch/$work/" \
+ | git update-ref --stdin
+
+ git checkout $work
+ checkletters=$1; shift
+
+ before=before-$work
+ git branch $before
+
+ local xopts=''
+
+ case "$checkletters" in
+ XX*)
+ fail "$checkletters" # for debugging
+ ;;
+ esac
+
+ case "$checkletters" in
+ X*)
+ t-expect-fail E:'snags: [0-9]* blockers' \
+ t-git-debrebase $xopts $subcmd
+ xopts+=' --force'
+ next_checkletter
+ ;;
+ esac
+
+ case "$checkletters" in
+ N*)
+ t-expect-fail E:. \
+ t-git-debrebase $xopts $subcmd
+ xopts+=' --noop-ok'
+ next_checkletter
+ ;;
+ esac
+
+ case "$checkletters" in
+ [EF]:*)
+ t-expect-fail "$checkletters" \
+ t-git-debrebase $xopts $subcmd
+ continue
+ ;;
+ *)
+ t-git-debrebase $xopts $subcmd
+ ;;
+ esac
+
+ peel=peel-$subcmd-$startbranch
+ git checkout -b $peel
+ t-clean-on-branch $peel
+
+ : "---------- $subcmd $startbranch $checkletters ----------"
+
+ while [ "x$checkletters" != x ]; do
+ : "---- $subcmd $startbranch ...$checkletters ----"
+ make_check "$checkletters"
+ checkletters="${checkletters#?}"
+ done
+ done
+
+}
+
+next_checkletter () {
+ checkletters="${checkletters#?}"
+}
+
+make_check () {
+ case "$1" in
+ [Nn]*)
+ t-refs-same-start
+ t-refs-same refs/heads/$before refs/heads/$work
+ ;;
+ U*)
+ t-refs-same-start
+ t-refs-same refs/heads/$before refs/ffq-prev/heads/$work
+ make_check u
+ ;;
+ u*)
+ t-git-get-ref refs/ffq-prev/heads/$work
+ t-refs-notexist refs/debrebase-last/heads/$work
+ ;;
+ V*)
+ t-refs-same-start
+ t-refs-same refs/ffq-prev/heads/$work \
+ refs/ffq-prev/heads/$startbranch
+ t-refs-notexist refs/debrebase-last/heads/$work
+ ;;
+ s*)
+ t-refs-notexist refs/ffq-prev/heads/$work
+ t-refs-same-start
+ t-refs-same refs/debrebase-last/heads/$work \
+ refs/debrebase-last/heads/$startbranch
+ t-has-ancestor HEAD refs/debrebase-last/heads/$work
+ ;;
+ S*)
+ t-refs-notexist refs/ffq-prev/heads/$work
+ t-refs-same-start refs/debrebase-last/heads/$work
+ t-ref-head
+ git diff --quiet HEAD^1
+ git diff HEAD^2 | grep $startbranch
+ git reset --hard HEAD^1
+ ;;
+ P*)
+ t-dgit -wgf --quilt=nofix quilt-fixup
+ git diff HEAD~ debian/patches | egrep .
+ git diff --quiet HEAD~ -- ':.' ':!debian/patches'
+ git reset --hard HEAD~
+ ;;
+ l*)
+ git diff --quiet HEAD refs/heads/$before -- ':.' ':!debian/patches'
+ t-gdr-good laundered
+ ;;
+ t*)
+ git diff --quiet HEAD refs/heads/$before
+ ;;
+ f*)
+ t-has-ancestor HEAD refs/heads/$before
+ ;;
+ *)
+ fail "$1"
+ ;;
+ esac
+}
+
+Ec="F:No ongoing git-debrebase session"
+Ep="F:Patch export produced patch amendments"
+
+# input state:
+# stitched? st'd st'd unst'd unst'd
+# laundered? laund'd mixed laund'd mixed
+#
+# "mixed" means an out of order branch
+# containing mixed commits and patch additions,
+# but which needs even more patches
+#
+subcmd '' Ult Ull Vlt Vl
+subcmd stitch Ns Nu Sltf Stf
+subcmd prepush Ns Nu Sltf Stf
+subcmd quick ns Sl Sltf Sl
+subcmd conclude "$Ec" "$Ec" Sltf Sl
+subcmd make-patches sPft "$Ep" uPft "$Ep"
+#subcmd dgit-upload-hook Psft "$Ep" SPft "$Ep"
+#
+# result codes, each one is a check:
+# E:$pat } this is an error (must come first)
+# F:$pat } arg is passed to expect-fail
+#
+# X should fail due to snags, but succeed when forced
+# XX crash out of script for manual debugging
+#
+# N this is a noop, error unless --noop-ok
+# n this is a silent noop
+# both of these imply tf; but, specify also one of u s
+#
+# should normally specify one of these:
+# U just unstiched: ffq-prev is exactly previous HEAD; implies u
+# u result is unstitched
+# V ffq-prev remains unchanged; implies also u
+# s result is stitched, debrebase-last exists and is unchanged
+# S result is stitch just made, remaining letters apply to result~
+#
+# P result is add-patches, remaining letters apply to result~
+#
+# should normally specify one or both of these:
+# l result is laundered, tree is same as before minus d/patches
+# t tree is exactly same as before
+#
+# f result is ff from previous HEAD
+
+t-ok
diff --git a/tests/tests/gdr-viagit b/tests/tests/gdr-viagit
new file mode 100755
index 0000000..644d2d4
--- /dev/null
+++ b/tests/tests/gdr-viagit
@@ -0,0 +1,40 @@
+#!/bin/bash
+set -e
+. tests/lib
+
+t-dependencies NO-DGIT GDR
+
+t-setup-import gdr-convert-gbp-noarchive
+
+: 'set up so t-git-debrebase runs gdr via git'
+
+case "$DGIT_GITDEBREBASE_TEST" in
+''|git-debrebase) ;;
+*)
+ t-tstunt
+ st=$tmp/tstunt/git-debrebase
+ export DGIT_GITDEBREBASE_TEST_REAL="$DGIT_GITDEBREBASE_TEST"
+ cat <<'END' >$st
+#!/bin/sh
+set -x
+exec "$DGIT_GITDEBREBASE_TEST_REAL" "$@"
+END
+ chmod +x $st
+ ;;
+esac
+
+DGIT_GITDEBREBASE_TEST='git debrebase'
+
+: 'do a simple test'
+
+cd $p
+
+t-some-changes
+
+t-git-debrebase
+t-gdr-good laundered
+
+t-git-debrebase stitch --prose=wombat
+t-gdr-good stitched
+
+t-ok