summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Jackson <ijackson@chiark.greenend.org.uk>2018-04-22 22:14:55 +0100
committerIan Jackson <ijackson@chiark.greenend.org.uk>2018-06-16 22:40:12 +0100
commitdc6bcd256e972c2bc8a65e077c27ed57745c76eb (patch)
treed8fac30d13d1f67753f5a0d61455c03f4f496802
parent38d74ac90781b75e2239440c6430db00d909164a (diff)
git-debrebase: test suite: New test for subcommands
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
-rw-r--r--debian/tests/control2
-rwxr-xr-xtests/tests/gdr-subcommands192
2 files changed, 193 insertions, 1 deletions
diff --git a/debian/tests/control b/debian/tests/control
index ff8ae85..ee9b7d7 100644
--- a/debian/tests/control
+++ b/debian/tests/control
@@ -16,7 +16,7 @@ Tests-Directory: tests/tests
Depends: dgit, dgit-infrastructure, devscripts, debhelper (>=8), fakeroot, build-essential, chiark-utils-bin
Restrictions: x-dgit-intree-only x-dgit-git-only
-Tests: gdr-diverge-nmu gdr-diverge-nmu-dgit gdr-edits gdr-import-dgit gdr-newupstream-v0 gdr-viagit
+Tests: gdr-diverge-nmu gdr-diverge-nmu-dgit gdr-edits gdr-import-dgit gdr-newupstream-v0 gdr-subcommands gdr-viagit
Tests-Directory: tests/tests
Depends: dgit, dgit-infrastructure, devscripts, debhelper (>=8), fakeroot, build-essential, chiark-utils-bin, git-buildpackage, libfile-fnmatch-perl, faketime
diff --git a/tests/tests/gdr-subcommands b/tests/tests/gdr-subcommands
new file mode 100755
index 0000000..6232112
--- /dev/null
+++ b/tests/tests/gdr-subcommands
@@ -0,0 +1,192 @@
+#!/bin/bash
+set -e
+. tests/lib
+
+t-dependencies git-buildpackage libfile-fnmatch-perl faketime
+
+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"
+ t-dgit -wgf quilt-fixup
+ t-some-changes "subcommands $m 2"
+}
+
+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
+
+ case "$checkletters" in
+ N*)
+ t-expect-fail E:. \
+ t-git-debrebase $subcmd
+ t-git-debrebase --noop-ok $subcmd
+ ;;
+ [EF]:*)
+ t-expect-fail "$checkletters" \
+ t-git-debrebase $subcmd
+ continue
+ ;;
+ *)
+ t-git-debrebase $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=check 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
+ ;;
+ esac
+}
+
+Ec="F:xxxdunno"
+
+# 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 pre-push Ns Nu Sltf Stf
+subcmd quick ns Sl Sltf Sl
+#subcmd conclude "$Ec" "$Ec" Sltf Sl
+#subcmd make-patches sPft sPft uPft uPft
+#subcmd dgit-upload-hook Psft Psft SPft SPft
+#
+# result codes, each one is a check:
+# E:$pat } this is an error (must come first)
+# F:$pat } arg is passed to expect-fail
+#
+# 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