failed_check=false
fail_check () {
- if $force; then
- echo >&2 "$us: warning: $*"
+ 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: $*"
+ echo >&2 "$us: $* ('$check' check)"
failed_check=true
fi
}
# **** Parse command line ****
getopt=$(getopt -s bash -o 'nfu:' \
- -l 'no-push,force,branch:,remote:,distro:,upstream:,quilt:,gbp,dpm,\
+ -l 'no-push,force::,branch:,remote:,distro:,upstream:,quilt:,gbp,dpm,\
baredebian,baredebian+git,baredebian+tarball' \
-n "$us" -- "$@")
eval "set - $getopt"
git_tag_opts=()
pushing=true
-force=false
+force_all=false
+force=""
distro=debian
quilt_mode=""
branch="HEAD"
case "$1" in
'-n'|'--no-push') pushing=false; shift; continue ;;
'-u') git_tag_opts+=(-u "$2"); shift 2; continue ;;
- '-f'|'--force') force=true; shift; continue ;;
+ '-f') force_all=true; shift; continue ;;
'--gbp') quilt_mode='gbp'; shift; continue ;;
'--dpm') quilt_mode='dpm'; shift; continue ;;
'--branch') branch=$2; shift 2; continue ;;
fail "--baredebian+tarball quilt mode not supported"
;;
+ # we require the long form of the option to skip individual
+ # checks, not permitting `-f check`, to avoid problems if we
+ # later want to introduce positional args
+ '--force')
+ case "$2" in
+ '')
+ force_all=true ;;
+ *)
+ force="$force,$2" ;;
+ esac
+ shift 2; continue ;;
+
'--') shift; break ;;
*) badusage "unknown option $1" ;;
esac
# ---- UNRELEASED suite
if [ "$target" = "UNRELEASED" ]; then
- fail_check "UNRELEASED changelog"
+ fail_check unreleased "UNRELEASED changelog"
fi
# ---- Pushing dgit view to maintainer view
if ! [ "$last_debian_tag_c" = "$last_archive_tag_c" ] \
&& git merge-base --is-ancestor \
"$last_debian_tag" "$last_archive_tag"; then
- fail_check \
+ fail_check dgit-view \
"looks like you might be trying to push the dgit view to the maintainer branch?"
fi
fi
trap - EXIT
if ! [ "$prev_target" = "$target" ] && ! [ "$target" = "UNRELEASED" ]; then
- fail_check \
+ fail_check suite \
"last upload targeted $prev_target, now targeting $target; might be a mistake?"
fi
fi
if ! [ "x$upstream_tag" = "x" ] \
&& ! git merge-base --is-ancestor "$upstream_tag" "$branch" \
&& ! [ "$quilt_mode" = "baredebian" ]; then
- fail_check \
+ fail_check upstream-nonancestor \
"upstream tag $upstream_tag is not an ancestor of $branch; probably a mistake"
fi
# ---- Summary
-if ! $force && $failed_check; then
- fail "some checks failed; you can override with --force"
+if $failed_check; then
+ # We don't mention the --force=check options here as those are
+ # mainly for use by scripts, or when you already know what check
+ # is going to fail before you invoke git-debpush. Keep the
+ # script's terminal output as simple as possible. No "see the
+ # manpage"!
+ fail "some check(s) failed; you can pass --force to ignore them"
fi
# **** Create the git tag ****
Just tag, don't push.
-=item B<--force>|B<-f>
-
-Ignore the results of all checks designed to prevent broken uploads.
-
=item B<-u> I<keyid>
Passed on to git-tag(1).
What distribution name to embed in the signed tag. Defaults to
"debian".
+=item B<--force>|B<-f>
+
+Ignore the results of all checks designed to prevent broken uploads.
+
+=item B<--force>=I<check>[,I<check>] ...
+
+Override individual checks designed to prevent broken uploads. May be
+specified more than once. Valid values for I<check> are:
+
+=over 4
+
+=item B<suite>
+
+Permit uploading to a different suite than the target of the most
+recent upload made with B<git-debpush> (e.g. when uploading to
+Debian unstable after uploading to Debian experimental).
+
+=item B<upstream-nonancestor>
+
+Ignore the fact that the upstream tag is not an ancestor of the branch
+to be tagged (skipping this check is implied by B<--quilt=baredebian>).
+
+=item B<unreleased>
+
+Permit upload to a suite called UNRELEASED.
+
+=item B<dgit-view>
+
+Ignore apparently pushing the dgit view of a package (as produced by
+B<dgit clone>) to the maintainer branch, where the dgit view and the
+maintainer view of the package are not identical.
+
+=back
+
=back
=head1 SEE ALSO