# **** Helper functions and variables ****
us="$(basename $0)"
-git_playtree_create=git-playtree-create ###substituted###
+git_playtree_setup=git-playtree-setup ###substituted###
+git_playtree_setup=${DEBPUSH_GIT_PLAYTREE_SETUP-$git_playtree_setup}
cleanup() {
if [ -d "$temp" ]; then
shift 2
set +e
- git diff --exit-code "$first".."$second" -- . "$@"
+ 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
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 ****
getopt=$(getopt -s bash -o 'nfu:' \
*) badusage "invalid quilt mode: $quilt_mode" ;;
esac
+# **** Early sanity check ****
+
+if [ "$branch" = "HEAD" ] \
+ && ! git symbolic-ref --quiet HEAD >/dev/null; then
+ fail_check detached \
+ "HEAD is detached; you probably don't want to debpush it"
+fi
+
# **** Gather git information ****
remoteconfigs=()
;;
esac
+# resolve $branch to a commit
+branch_commit="$(git rev-parse --verify ${branch}^{commit})"
+
# also check, if the branch does not have its own pushRemote or
# remote, whether there's a default push remote configured
remoteconfigs+=(remote.pushDefault)
'3.0 (quilt)') upstream=true ;;
'3.0 (native)') upstream=false ;;
'1.0'|'')
- if get_file_from_ref debian/source/options | grep '^-sn *$'; then
+ if get_file_from_ref debian/source/options | grep -q '^-sn *$'; then
upstream=false
- elif get_file_from_ref debian/source/options | grep '^-sk *$'; then
+ elif get_file_from_ref debian/source/options | grep -q '^-sk *$'; then
upstream=true
else
fail 'please see "SOURCE FORMAT 1.0" in git-debpush(1)'
"upstream tag $upstream_tag is not an ancestor of $branch; probably a mistake"
fi
-# ---- Upstream tag tree nonidentical
+# ---- Quilt mode-specific checks
case "$quilt_mode" in
gbp)
check_treesame "$upstream_tag" "$branch" ':!debian' ':!**.gitignore' \
|| fail_check_upstream_nonidentical
+ check_patches_apply false
;;
unapplied)
check_treesame "$upstream_tag" "$branch" ':!debian' \
|| fail_check_upstream_nonidentical
+ check_patches_apply false
+ ;;
+ baredebian)
+ check_patches_apply false
+ ;;
+ dpm|nofix)
+ check_patches_apply true
;;
esac
+# ---- git-debrebase branch format checks
+
+# only check branches, since you can't run `git debrebase conclude` on
+# non-branches
+case "$branch" in
+ refs/heads/*)
+ # see "STITCHING, PSEUDO-MERGES, FFQ RECORD" in git-debrebase(5)
+ ffq_prev_ref="refs/ffq-prev/${branch#refs/}"
+ if git show-ref --quiet --verify "$ffq_prev_ref"; then
+ fail_check unstitched \
+ "this looks like an unstitched git-debrebase branch, which should not be pushed"
+ fi
+esac
+
# ---- Summary
if $failed_check; then
fi
fi
-git tag "${git_tag_opts[@]}" -s -F- "$debian_tag" "$branch" <<EOF
-$source release $version for $target
+tagmessage="$source release $version for $target
[dgit distro=$distro split$quilt_mode_text]
[dgit please-upload$upstream_info]
-EOF
+"
+
+git tag "${git_tag_opts[@]}" -s -m "$tagmessage" "$debian_tag" "$branch"
# **** Do a git push ****