+check_treesame () {
+ local first=$1
+ local second=$2
+ shift 2
+
+ set +e
+ git diff --quiet --exit-code "$first".."$second" -- . "$@"
+ git_diff_rc=$?
+ set -e
+
+ # show the user what the difference was
+ if [ $git_diff_rc = 1 ]; then
+ git diff --compact-summary "$first".."$second" -- . "$@"
+ fi
+
+ if [ $git_diff_rc -le 1 ]; then
+ return $git_diff_rc
+ else
+ fail "'git diff' exited with unexpected code $git_diff_rc"
+ fi
+}
+
+check_patches_apply () {
+ local should_match_branch="$1"
+
+ local playground="$(git rev-parse --git-dir)/gdp"
+ local playtree="$playground/apply-patches"
+ local git_apply_rc=0
+
+ rm -rf "$playground"
+ mkdir -p "$playtree"
+ local pwd="$(pwd)"
+ cd "$playtree"
+ "$git_playtree_setup" .
+
+ # checking out the upstream source and then d/patches on top
+ # ensures this check will work for a variety of quilt modes
+ git checkout -b upstream "$upstream_committish"
+ git checkout "$branch_commit" -- debian
+
+ if [ -s "debian/patches/series" ]; then
+ while read patch; do
+ shopt -s extglob; patch="${patch%%?( )#*}"; shopt -u extglob
+ if [ -z "$patch" ]; then continue; fi
+ set +e
+ git apply --index "debian/patches/$patch"
+ git_apply_rc=$?
+ set -e
+ if ! [ $git_apply_rc = 0 ]; then
+ fail_check patches-applicable \
+ "'git apply' failed to apply patch $patch"
+ break
+ fi
+ done <debian/patches/series
+
+ if $should_match_branch && [ $git_apply_rc = 0 ]; then
+ git commit -q -a -m"commit result of applying all patches"
+ check_treesame HEAD "$branch_commit" ':!debian' \
+ || fail_check patches-applicable \
+ "applying all patches does not yield $branch"
+ fi
+ fi
+
+ cd "$pwd"
+ rm -rf "$playground"
+}
+
+# **** Parse command line ****