+failed_check=false
+fail_check () {
+ local check=$1; shift
+ local check_is_forced=false
+
+ case ",$force," in
+ *",$check,"*) check_is_forced=true ;;
+ esac
+ if $force_all || $check_is_forced; then
+ echo >&2 "$us: warning: $* ('$check' check)"
+ else
+ echo >&2 "$us: $* ('$check' check)"
+ failed_check=true
+ fi
+}
+
+fail_check_upstream_nonidentical () {
+ fail_check upstream-nonidentical \
+ "the upstream source in tag $upstream_tag is not identical to the upstream source in $branch"
+}
+
+find_last_tag () {
+ local prefix=$1
+
+ set +o pipefail # perl will SIGPIPE git-log(1) here
+ git log --pretty=format:'%D' --decorate=full "$branch" \
+ | perl -wne 'use Dpkg::Version;
+ @pieces = split /, /, $_;
+ @debian_tag_vs = sort { version_compare($b, $a) }
+ map { m|tag: refs/tags/'"$prefix"'(.+)| ? $1 : () } @pieces;
+ if (@debian_tag_vs) { print "'"$prefix"'$debian_tag_vs[0]\n"; exit }'
+ set -o pipefail
+}
+
+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
+}
+
+# **** Parse command line ****