This is an automated email from the git hooks/post-receive script. infinity0 pushed a commit to branch pu/debsign-buildinfo in repository devscripts.
commit 75958305e940d00cf7e3e2b0038e167b5d5468f0 Author: Ximin Luo <[email protected]> Date: Thu Feb 16 17:24:35 2017 +0100 Refactor code and add support for signing .buildinfo files directly --- scripts/debsign.sh | 246 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 149 insertions(+), 97 deletions(-) diff --git a/scripts/debsign.sh b/scripts/debsign.sh index 91dd9b7..c409b50 100755 --- a/scripts/debsign.sh +++ b/scripts/debsign.sh @@ -27,6 +27,8 @@ set -e PRECIOUS_FILES=0 PROGNAME=`basename $0` MODIFIED_CONF_MSG='Default settings modified by devscripts configuration files:' +HAVE_SIGNED="" +NUM_SIGNED=0 # Temporary directories signingdir="" @@ -160,11 +162,14 @@ mustsetvar () { # of dpkg-buildpackage, because we do not know all of the necessary # information when this function is read first. signfile () { + local type=$1 + local file=$2 + local signas=$3 local savestty=$(stty -g 2>/dev/null) || true mksigningdir - UNSIGNED_FILE="$signingdir/$(basename "$1")" + UNSIGNED_FILE="$signingdir/$(basename "$file")" ASCII_SIGNED_FILE="${UNSIGNED_FILE}.asc" - (cat "$1" ; echo "") > "$UNSIGNED_FILE" + (cat "$file" ; echo "") > "$UNSIGNED_FILE" gpgversion=`$signcommand --version | head -n 1 | cut -d' ' -f3` gpgmajorversion=`echo $gpgversion | cut -d. -f1` @@ -172,7 +177,7 @@ signfile () { if [ $gpgmajorversion -gt 1 -o $gpgminorversion -ge 4 ] then - $signcommand --local-user "$2" --clearsign \ + $signcommand --local-user "$signas" --clearsign \ --list-options no-show-policy-urls \ --armor --textmode --output "$ASCII_SIGNED_FILE"\ "$UNSIGNED_FILE" || \ @@ -182,7 +187,7 @@ signfile () { exit $SAVESTAT } else - $signcommand --local-user "$2" --clearsign \ + $signcommand --local-user "$signas" --clearsign \ --no-show-policy-url \ --armor --textmode --output "$ASCII_SIGNED_FILE" \ "$UNSIGNED_FILE" || \ @@ -195,7 +200,9 @@ signfile () { stty $savestty 2>/dev/null || true echo PRECIOUS_FILES=$(($PRECIOUS_FILES + 1)) - movefile "$ASCII_SIGNED_FILE" "$1" + HAVE_SIGNED="${HAVE_SIGNED:+${HAVE_SIGNED}, }$type" + NUM_SIGNED=$((NUM_SIGNED + 1)) + movefile "$ASCII_SIGNED_FILE" "$file" } withecho () { @@ -381,7 +388,10 @@ ensure_local_copy() { local type="$4" if [ -n "$remotehost" ] then - withecho scp "$remotehost:$remotefile" "$file" + if [ ! -f "$file" ] + then + withecho scp "$remotehost:$remotefile" "$file" + fi fi if [ ! -f "$file" -o ! -r "$file" ] @@ -487,6 +497,106 @@ guess_signas() { echo "${signkey:-$maintainer}" } +maybesign_dsc() { + local signas="$1" + local remotehost="$2" + local remotedsc="$3" + local dsc="$4" + + ensure_local_copy "$remotehost" "$remotedsc" "$dsc" dsc + if check_already_signed "$dsc" dsc; then + echo "Leaving current signature unchanged." >&2 + return + fi + + withecho signfile dsc "$dsc" "$signas" + + if [ -n "$remotehost" ] + then + withecho scp "$dsc" "$remotehost:$remotedsc" + PRECIOUS_FILES=$(($PRECIOUS_FILES - 1)) + fi +} + +maybesign_buildinfo() { + local signas="$1" + local remotehost="$2" + local remotebuildinfo="$3" + local buildinfo="$4" + local remotedsc="$5" + local dsc="$6" + + ensure_local_copy "$remotehost" "$remotebuildinfo" "$buildinfo" buildinfo + if check_already_signed "$buildinfo" "buildinfo"; then + echo "Leaving current signature unchanged." >&2 + return + fi + + if grep -q `basename "$dsc"` "$buildinfo"; then + maybesign_dsc "$signas" "$remotehost" "$remotedsc" "$dsc" + withtempfile buildinfo "$buildinfo" fixup_buildinfo "$dsc" + fi + + withecho signfile buildinfo "$buildinfo" "$signas" + + if [ -n "$remotehost" ] + then + withecho scp "$buildinfo" "$remotehost:$remotebuildinfo" + PRECIOUS_FILES=$(($PRECIOUS_FILES - 1)) + fi +} + +maybesign_changes() { + local signas="$1" + local remotehost="$2" + local remotechanges="$3" + local changes="$4" + local remotebuildinfo="$5" + local buildinfo="$6" + local remotedsc="$7" + local dsc="$8" + + ensure_local_copy "$remotehost" "$remotechanges" "$changes" changes + if check_already_signed "$changes" "changes"; then + echo "Leaving current signature unchanged." >&2 + return + fi + + hasdsc="$(to_bool grep -q `basename "$dsc"` "$changes")" + hasbuildinfo="$(to_bool grep -q `basename "$buildinfo"` "$changes")" + + if $hasbuildinfo; then + # assume that this will also sign the same dsc if it's available + maybesign_buildinfo "$signas" "$remotehost" \ + "$remotebuildinfo" "$buildinfo" \ + "$remotedsc" "$dsc" + elif $hasdsc; then + maybesign_dsc "$signas" "$remotehost" "$remotedsc" "$dsc" + fi + + if $hasdsc; then + withtempfile changes "$changes" fixup_changes dsc "$dsc" + fi + if $hasbuildinfo; then + withtempfile changes "$changes" fixup_changes buildinfo "$buildinfo" + fi + withecho signfile changes "$changes" "$signas" + + if [ -n "$remotehost" ] + then + withecho scp "$changes" "$remotehost:$remotechanges" + PRECIOUS_FILES=$(($PRECIOUS_FILES - 1)) + fi +} + +report_signed() { + if [ $NUM_SIGNED -eq 1 ]; then + echo "Successfully signed $HAVE_SIGNED file" + elif [ $NUM_SIGNED -gt 0 ]; then + echo "Successfully signed $HAVE_SIGNED files" + fi +} + dosigning() { # Do we have to download the changes file? if [ -n "$remotehost" ] @@ -504,22 +614,13 @@ dosigning() { dsc=`basename "$dsc"` commands=`basename "$commands"` - if [ -n "$changes" ] - then - if [ ! -f "$changes" ] - then - withecho scp "$remotehost:$remotechanges" . - fi - elif [ -n "$dsc" ] - then withecho scp "$remotehost:$remotedsc" "$dsc" - else withecho scp "$remotehost:$remotecommands" "$commands" - fi - if [ -n "$changes" ] && echo "$changes" | egrep -q '[][*?]' then + withecho scp "$remotehost:$remotechanges" . for changes in $changes do printf "\n" + buildinfo="${remotedir+$remotedir/}${changes%.changes}.buildinfo" dsc=`echo "${remotedir+$remotedir/}$changes" | \ perl -pe 's/\.changes$/.dsc/; s/(.*)_(.*)_(.*)\.dsc/\1_\2.dsc/'` dosigning; @@ -528,71 +629,7 @@ dosigning() { fi fi - if [ -n "$changes" ] - then - signas="$(guess_signas "$changes")" - hasdsc="$(to_bool grep -q `basename "$dsc"` "$changes")" - hasbuildinfo="$(to_bool grep -q `basename "$buildinfo"` "$changes")" - - ensure_local_copy "" "" "$changes" changes - if check_already_signed "$changes" "changes"; then - echo "Leaving current signature unchanged." >&2 - else - - if $hasbuildinfo; then - ensure_local_copy "$remotehost" "$remotebuildinfo" "$buildinfo" buildinfo - if check_already_signed "$buildinfo" "buildinfo"; then - echo "Leaving current signature unchanged." >&2 - else - if $hasdsc; then - ensure_local_copy "$remotehost" "$remotedsc" "$dsc" dsc - check_already_signed "$dsc" dsc || withecho signfile "$dsc" "$signas" - withtempfile "buildinfo" "$buildinfo" fixup_buildinfo "$dsc" - withtempfile "changes" "$changes" fixup_changes dsc "$dsc" - fi - withecho signfile "$buildinfo" "$signas" - withtempfile "changes" "$changes" fixup_changes buildinfo "$buildinfo" - fi - elif $hasdsc; then - ensure_local_copy "$remotehost" "$remotedsc" "$dsc" dsc - check_already_signed "$dsc" dsc || withecho signfile "$dsc" "$signas" - withtempfile "changes" "$changes" fixup_changes dsc "$dsc" - fi - - withecho signfile "$changes" "$signas" - fi - - case "$hasdsc $hasbuildinfo" in - "false false") - filetypes="changes file" - filessigned=1 - withecho_scp() { withecho scp "$changes" "$@"; } - ;; - "true false") - filetypes="dsc and changes files" - filessigned=2 - withecho_scp() { withecho scp "$changes" "$dsc" "$@"; } - ;; - "false true") - filetypes="buildinfo and changes files" - filessigned=2 - withecho_scp() { withecho scp "$changes" "$buildinfo" "$@"; } - ;; - "true true") - filetypes="dsc, buildinfo and changes files" - filessigned=3 - withecho_scp() { withecho scp "$changes" "$buildinfo" "$dsc" "$@"; } - ;; - esac - - if [ -n "$remotehost" ] - then - withecho_scp "$remotehost:$remotedir" - PRECIOUS_FILES=$(($PRECIOUS_FILES - filessigned)) - fi - - echo "Successfully signed $filetypes" - elif [ -n "$commands" ] # sign .commands file + if [ -n "$commands" ] # sign .commands file then if [ ! -f "$commands" -o ! -r "$commands" ] then @@ -600,6 +637,7 @@ dosigning() { exit 1 fi + ensure_local_copy "$remotehost" "$remotecommands" "$commands" commands check_already_signed "$commands" commands && { echo "Leaving current signature unchanged." >&2 return @@ -651,7 +689,7 @@ for valid format" >&2; signas="${signkey:-$maintainer}" - withecho signfile "$commands" "$signas" + withecho signfile commands "$commands" "$signas" if [ -n "$remotehost" ] then @@ -659,24 +697,31 @@ for valid format" >&2; PRECIOUS_FILES=$(($PRECIOUS_FILES - 1)) fi - echo "Successfully signed commands file" - else # only a dsc file to sign; much easier + report_signed + + elif [ -n "$changes" ] + then signas="$(guess_signas "$changes")" + maybesign_changes "$signas" "$remotehost" \ + "$remotechanges" "$changes" \ + "$remotebuildinfo" "$buildinfo" \ + "$remotedsc" "$dsc" + report_signed - ensure_local_copy "" "" "$dsc" dsc - check_already_signed "$dsc" dsc && { - echo "Leaving current signature unchanged." >&2 - return - } - withecho signfile "$dsc" "$signas" + elif [ -n "$buildinfo" ] + then + signas="$(guess_signas "$changes")" + maybesign_buildinfo "$signas" "$remotehost" \ + "$remotebuildinfo" "$buildinfo" \ + "$remotedsc" "$dsc" + report_signed - if [ -n "$remotehost" ] - then - withecho scp "$dsc" "$remotehost:$remotedsc" - PRECIOUS_FILES=$(($PRECIOUS_FILES - 1)) - fi + else # only a dsc file to sign; much easier + signas="$(guess_signas "$changes")" + maybesign_dsc "$signas" "$remotehost" \ + "$remotedsc" "$dsc" + report_signed - echo "Successfully signed dsc file" fi } @@ -752,6 +797,13 @@ case $# in dsc=$1 commands= ;; + *.buildinfo) + changes= + buildinfo=$1 + dsc=`echo $buildinfo | \ + perl -pe 's/\.buildinfo$/.dsc/; s/(.*)_(.*)_(.*)\.dsc/\1_\2.dsc/'` + commands= + ;; *.changes) changes=$1 buildinfo="${changes%.changes}.buildinfo" -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/collab-maint/devscripts.git _______________________________________________ devscripts-devel mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/devscripts-devel
