Package: git-debpush Version: 9.3 Tags: patch Hello,
Please find attached patches to make git-debpush support forcing individual checks. Also available in branch 'git-debpush-force-check-v1' of repo <https://git.spwhitton.name/dgit>. The tagupl, tagupl-baredebian and tagupl-native checks pass under tests/using-intree. -- Sean Whitton
From 01e082f0dc1bb5fcb2b3de8258db93904f0004aa Mon Sep 17 00:00:00 2001 From: Sean Whitton <spwhit...@spwhitton.name> Date: Fri, 19 Jul 2019 16:22:50 +0100 Subject: [PATCH 1/3] git-debpush(1): Correct description of --force Checks are still performed, but turned from errors into warnings. Signed-off-by: Sean Whitton <spwhit...@spwhitton.name> --- git-debpush.1.pod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/git-debpush.1.pod b/git-debpush.1.pod index 0cd274d7..242bf677 100644 --- a/git-debpush.1.pod +++ b/git-debpush.1.pod @@ -148,7 +148,7 @@ Just tag, don't push. =item B<--force>|B<-f> -Don't perform checks designed to prevent broken uploads. +Ignore the results of all checks designed to prevent broken uploads. =item B<-u> I<keyid> -- 2.20.1
From a9a967bac26667eaa6bb235bba1a181d781f3e54 Mon Sep 17 00:00:00 2001 From: Sean Whitton <spwhit...@spwhitton.name> Date: Fri, 19 Jul 2019 16:33:01 +0100 Subject: [PATCH 2/3] git-debpush: Subheaders No functional change. Signed-off-by: Sean Whitton <spwhit...@spwhitton.name> --- git-debpush | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/git-debpush b/git-debpush index 0ddbfc47..e2ea2b64 100755 --- a/git-debpush +++ b/git-debpush @@ -35,7 +35,7 @@ set -o pipefail # mode; if there is a previous tag, and no quilt mode provided, assume # same quilt mode as in previous tag created by this script -# ---- Helper functions and variables +# **** Helper functions and variables **** us="$(basename $0)" @@ -86,7 +86,7 @@ find_last_tag () { set -o pipefail } -# ---- Parse command line +# **** Parse command line **** getopt=$(getopt -s bash -o 'nfu:' \ -l 'no-push,force,branch:,remote:,distro:,upstream:,quilt:,gbp,dpm,\ @@ -137,7 +137,7 @@ case "$quilt_mode" in *) badusage "invalid quilt mode: $quilt_mode" ;; esac -# ---- Gather git information +# **** Gather git information **** remoteconfigs=() to_push=() @@ -186,7 +186,7 @@ if $pushing && [ "x$remote" = "x" ]; then fi fi -# ---- Gather source package information +# **** Gather source package information **** temp=$(mktemp -d) trap cleanup EXIT @@ -216,7 +216,7 @@ case "$format" in ;; esac -# ---- Gather git history information +# **** Gather git history information **** last_debian_tag=$(find_last_tag "debian/") last_archive_tag=$(find_last_tag "archive/debian/") @@ -247,12 +247,16 @@ if $upstream; then to_push+=("$upstream_tag") fi -# ---- Useful sanity checks +# **** Useful sanity checks **** + +# ---- UNRELEASED suite if [ "$target" = "UNRELEASED" ]; then fail_check "UNRELEASED changelog" fi +# ---- Pushing dgit view to maintainer view + if ! [ "x$last_debian_tag" = "x" ] && ! [ "x$last_archive_tag" = "x" ]; then last_debian_tag_c=$(git rev-parse "$last_debian_tag"^{}) last_archive_tag_c=$(git rev-parse "$last_archive_tag"^{}) @@ -264,6 +268,8 @@ if ! [ "x$last_debian_tag" = "x" ] && ! [ "x$last_archive_tag" = "x" ]; then fi fi +# ---- Targeting different suite + if ! [ "x$last_debian_tag" = "x" ]; then temp=$(mktemp -d) trap cleanup EXIT @@ -279,6 +285,8 @@ if ! [ "x$last_debian_tag" = "x" ]; then fi fi +# ---- Upstream tag is not ancestor of $branch + if ! [ "x$upstream_tag" = "x" ] \ && ! git merge-base --is-ancestor "$upstream_tag" "$branch" \ && ! [ "$quilt_mode" = "baredebian" ]; then @@ -286,12 +294,13 @@ if ! [ "x$upstream_tag" = "x" ] \ "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" fi -# ---- Create the git tag +# **** Create the git tag **** # convert according to DEP-14 rules git_version=$(echo $version | tr ':~' '%_' | sed 's/\.(?=\.|$|lock$)/.#/g') @@ -330,7 +339,7 @@ $source release $version for $target [dgit please-upload$upstream_info] EOF -# ---- Do a git push +# **** Do a git push **** if $pushing; then git push "$remote" "${to_push[@]}" -- 2.20.1
From d4eb98459932da1925744297fdf8ddf1cb80642e Mon Sep 17 00:00:00 2001 From: Sean Whitton <spwhit...@spwhitton.name> Date: Fri, 19 Jul 2019 17:11:22 +0100 Subject: [PATCH 3/3] git-debpush: Support forcing individual checks While using git-debpush interactively, if the user sees that checks have failed which they know to be safe to override, they typically just use --force or -f. However, it is useful for scripts to be able to skip single checks, and if the user knows that a check will fail in advance of running git-debpush, it is convenient to be able to specify that but still see whether other checks fail, where those failures were unexpected. This can avoid the user having to run git-debpush more than once. The list of any checks which failed but were overridden is not stored in the generated tag. git-debpush's checks are for the convenience of the local user only, and the list of failed but overridden checks is not considered to be metadata for the upload. Not recording failed but overridden checks in the git tag keeps git-debpush's checking independent of its wrapping of git-tag and git-push, which makes git-debpush simpler and easier to understand. The complexity is on the server side, in tag2upload. git-debpush(1): We want the list of checks that can be overridden to be at the bottom of the list of options because most users will not need to look at it. We also want the description of --force|-f to be adjacent to the description of --force=<check>. So move the description of --force|-f to the end of the list of options. Signed-off-by: Sean Whitton <spwhit...@spwhitton.name> --- git-debpush | 48 +++++++++++++++++++++++++++++++++++++--------- git-debpush.1.pod | 38 ++++++++++++++++++++++++++++++++---- tests/tests/tagupl | 9 ++++++++- 3 files changed, 81 insertions(+), 14 deletions(-) diff --git a/git-debpush b/git-debpush index e2ea2b64..86e94621 100755 --- a/git-debpush +++ b/git-debpush @@ -65,7 +65,17 @@ get_file_from_ref () { failed_check=false fail_check () { - if $force; then + local check=$1; shift + local check_is_forced=false + + for c in "${force[@]}"; do + if [ "$c" = "$check" ]; then + check_is_forced=true + break + fi + done + + if $force_all || $check_is_forced; then echo >&2 "$us: warning: $*" else echo >&2 "$us: $*" @@ -89,7 +99,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 +107,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 +117,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 +132,20 @@ 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 + 'suite'|'upstream-nonancestor'|'unreleased'|'dgit-view') + force+=("$2") ;; + '') + force_all=true ;; + *) + fail "invalid name of check to force: $2" ;; + esac + shift 2; continue ;; + '--') shift; break ;; *) badusage "unknown option $1" ;; esac @@ -252,7 +277,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 +288,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 +305,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,13 +315,18 @@ 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 +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 checks failed; you can override with --force" fi diff --git a/git-debpush.1.pod b/git-debpush.1.pod index 242bf677..ab0e75a4 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> + +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 3b0a7a09..b16367a1 100755 --- a/tests/tests/tagupl +++ b/tests/tests/tagupl @@ -29,7 +29,14 @@ 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 "invalid name of check to force: upstream" \ +t-tagupl-test --quilt=gbp --force=upstream --upstream=$upstreamtag + +t-expect-fail "upstream tag $upstreamtag is not an ancestor of refs/heads/master" \ +t-tagupl-test --quilt=gbp --force=suite --upstream=$upstreamtag + +t-tagupl-test --quilt=gbp --force=suite --force=upstream-nonancestor --upstream=$upstreamtag t-pushed-good master # todo: test each miss/rejection -- 2.20.1
signature.asc
Description: PGP signature