summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xgit-debpush48
-rw-r--r--git-debpush.1.pod38
-rwxr-xr-xtests/tests/tagupl8
3 files changed, 77 insertions, 17 deletions
diff --git a/git-debpush b/git-debpush
index e2ea2b6..dee358b 100755
--- a/git-debpush
+++ b/git-debpush
@@ -65,10 +65,16 @@ get_file_from_ref () {
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
}
@@ -89,7 +95,7 @@ find_last_tag () {
# **** 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"
@@ -97,7 +103,8 @@ set -e$DGIT_TEST_DEBPUSH_DEBUG
git_tag_opts=()
pushing=true
-force=false
+force_all=false
+force=""
distro=debian
quilt_mode=""
branch="HEAD"
@@ -106,7 +113,7 @@ while true; do
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 ;;
@@ -121,6 +128,18 @@ while true; do
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
@@ -252,7 +271,7 @@ fi
# ---- UNRELEASED suite
if [ "$target" = "UNRELEASED" ]; then
- fail_check "UNRELEASED changelog"
+ fail_check unreleased "UNRELEASED changelog"
fi
# ---- Pushing dgit view to maintainer view
@@ -263,7 +282,7 @@ if ! [ "x$last_debian_tag" = "x" ] && ! [ "x$last_archive_tag" = "x" ]; then
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
@@ -280,7 +299,7 @@ if ! [ "x$last_debian_tag" = "x" ]; then
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
@@ -290,14 +309,19 @@ 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 ****
diff --git a/git-debpush.1.pod b/git-debpush.1.pod
index 242bf67..429148d 100644
--- a/git-debpush.1.pod
+++ b/git-debpush.1.pod
@@ -146,10 +146,6 @@ upload your package.
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).
@@ -182,6 +178,40 @@ git would use if you typed "git push BRANCH".
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
diff --git a/tests/tests/tagupl b/tests/tests/tagupl
index e11ea5a..09ca53a 100755
--- a/tests/tests/tagupl
+++ b/tests/tests/tagupl
@@ -29,7 +29,13 @@ tagname=test-dummy/$v
t-expect-fail "upstream tag $upstreamtag is not an ancestor of refs/heads/master" \
t-tagupl-test --quilt=gbp --upstream=$upstreamtag
-t-tagupl-test --quilt=gbp --force --upstream=$upstreamtag
+
+t-expect-fail "upstream tag $upstreamtag is not an ancestor of refs/heads/master" \
+t-tagupl-test --quilt=gbp --force=suite --force=no-such-force-option --upstream=$upstreamtag
+
+t-tagupl-test --quilt=gbp --force=suite --force=no-such-force-option-1 \
+ --force=upstream-nonancestor,no-such-force-option-2 \
+ --upstream=$upstreamtag
t-pushed-good master
# todo: test each miss/rejection