From 11d5cd20a6981a7921e3755e91f690225f3bc74f Mon Sep 17 00:00:00 2001 From: Amos Jeffries Date: Tue, 1 Jul 2025 05:59:38 +1200 Subject: [PATCH 1/4] Import Squid X.Y.Z release script Co-Author: kinkie@squid-cache.org --- release/mk-release-package.sh | 261 ++++++++++++++++++++++++++++++++++ 1 file changed, 261 insertions(+) create mode 100644 release/mk-release-package.sh diff --git a/release/mk-release-package.sh b/release/mk-release-package.sh new file mode 100644 index 0000000..d1d6508 --- /dev/null +++ b/release/mk-release-package.sh @@ -0,0 +1,261 @@ +#!/usr/bin/env bash + +set -u -o pipefail +repo="" +origin="origin" +upstream="upstream" +backfill="" +push="" +savedargs=$@ +changelog_file=${changelog_file:-ChangeLog} +# sets SIGNKEY, EMAIL, GPGHOME. May set other variables +test -f "$HOME/.squidrelease.rc" && . "$HOME/.squidrelease.rc" + +# args: variable and tool name. if variable is empty, bail +require() { if [ -z "$1" ]; then echo "$2 is required"; exit 1; fi } + +# test for tools +SED="${SED:-`which gsed`}"; SED="${SED:-`which sed`}"; require "${SED:-}" sed +FGREP=${FGREP:-`which fgrep`}; FGREP="${FGREP:-`which fgrep`}"; require "${FGREP:-}" fgrep +GPG=${GPG:-`which gpg`}; require "${GPG:-}" gpg +GH=${GH:-`which gh`}; require "${GH:-}" gh + +require "${SIGNKEY:-}" "SIGNKEY setting" +require "${EMAIL:-}" "EMAIL setting" + +po2html=`which po2html` +if test -z "$po2html" ; then + echo "cannot find po2html" + exit 1 +fi +po2txt=`which po2txt` +if test -z "$po2txt" ; then + echo "cannot find po2txt" + exit 1 +fi + +usage() { +cat <<_EOF +use: + $0 [options] + options: + -R to use for PRs + -o : (git) remote repository for pushing PR branches + default "origin" + -u : (git) remote repository with public sources to use + default "upstream" + -b : this is a backfill. Create a release for using + preexisting tags + -p : push, do not ask to push + -g : + +If no ChangeLog entry exists for the new version, prepares one +and helps prepare it for merge. + +_EOF +} + +# argument: a tag. Returns 0 if the tag exists, 1 if it doesn't +have_tag() { + git tag -l "$1" | $FGREP -q "$1" + return $? +} + +have_branch() { + git branch -l "$1" | $FGREP -q "$1" + return $? +} + +# as a side effect, set variables with timestamps. +# gets as argument a tag; if the tag exists, then +# use it as a timestamp, otherwise use the current date. +setup_release_timestamps() { + test -n "${release_timestamp:-}" && return 0 + if have_tag $1; then + release_timestamp=`git show --pretty=%ct --no-patch $1` + else + release_timestamp=`date +%s` + fi + release_timedate=`date -R -u -d @${release_timestamp}` + release_date=`date -u '+%d %b %Y' -d @${release_timestamp}` +} + +# argument: the files to be signed +# uses GPG, SIGNKEY, EMAIL, GPGHOME +signfiles() { + setup_release_timestamps $new_tag + for file; do + size="`stat $file | awk '/Size:/ {print $2;}'`" + md5="`md5sum -b $file | awk '{print $1;}'`" + sha1="`sha1sum -b $file | awk '{print $1;}'`" + sha256="`sha256sum -b $file | awk '{print $1;}'`" + fingerprint=`$GPG --fingerprint $SIGNKEY | grep -v -E "^[up]" | grep -v -E "^$"` + ( + cat < $file.asc + done +} + +package_release() { + # actually prep the release + setup_release_timestamps $new_tag + + git clean -fdx + ./bootstrap.sh + $SED -i~ "s@${new_version}-\(VCS\|CVS\)@${new_version}@" configure.ac && rm configure.ac~ + $SED -i~ "s@${new_version}-\(VCS\|CVS\)@${new_version}@" configure && rm configure~ + $SED -i~ "s@squid_curreleasedate@${release_timestamp}@" include/version.h && rm include/version.h~ + rm -rf libltdl/config-h.in~ libltdl/configure~ .github + # git add -f '**' # ignore .gitignore + + ./configure --silent --enable-translation + make -j`nproc` -l`nproc` dist-all + + # prep changelog + export new_version + awk "/^Changes (in|to) squid-${new_version} /{flag=2} /^$/{flag=flag-1} flag>0" ${changelog_file} >$release_changelog_file + local push_tag + if [ -z "$backfill" ] ; then push_tag="$new_tag" ; fi + # relevant metadata files: ChangeLog CONTRIBUTORS COPYING CREDITS README SPONSORS.list doc/release-notes/release-*.html + signfiles squid-${new_version}.tar.* + declare -a filelist + filelist=() + for f in *.tar.?? *.tar.??? + do + filelist+=(" '${f}#Bootstrapped sources: ${f}'") + filelist+=(" '${f}.asc#Signature for ${f}'") + done + + pushcmd="$GH $repo release create $new_tag -F $release_changelog_file --title "v${new_version}" ${filelist[@]}" + if [ "$push" = "yes" ] ; then + eval $pushcmd + echo "pushed! command:" + else + echo "Ready for pushing. To do it, run: " + fi + echo $pushcmd +} + +while getopts "hR:o:u:bpg:" optchar ; do + case "${optchar}" in + h) usage; exit 0;; + R) repo="-R ${OPTARG}";; + o) origin="$OPTARG";; + u) upstream="$OPTARG";; + b) backfill="yes";; + p) push="yes";; + g) GPGHOME="$OPTARG";; + -) break;; + esac +done +shift $((OPTIND -1)) + +if [ $# -lt 2 ]; then + usage + exit 2 +fi + +new_version="$1" +old_version="$2" + +new_tag=SQUID_`echo $new_version | tr . _` +old_tag=SQUID_`echo $old_version | tr . _` + + +current_branch=`git branch --show-current` +release_prep_branch="prep-v${new_version}" +tmp_changelog_file="ChangeLog-$new_version" +release_changelog_file="/tmp/${tmp_changelog_file}" + +echo "new: $new_tag old: $old_tag" +echo "repository: $repo" + +# check that old tag exists +# TODO: move to new-release only +if false && ! have_tag "$old_tag" ; then + echo "could not find tag $old_tag" + usage + exit 2 +fi + +## TODO: REDO BACKFILL starting from tarball +if [ -n "$backfill" ]; then + if ! have_tag "$new_tag" ; then + echo "Error: backfill requested but missing tag $new_tag" + exit 2 + fi + git reset --hard "$new_tag" + git clean -fdx + + # TODO: here + package_release + exit 0 +fi + +# not a backfill. Wipe tags +have_tag "$new_tag" && git tag -d "$new_tag" + + + +# if the ChangeLog is not ready, prepare one and bail +setup_release_timestamps $new_tag +if ! fgrep -q "Changes in squid-${new_version}" ${changelog_file}; then + if have_branch "$release_prep_branch" ; then + git branch -D "$release_prep_branch" + git push -d "$origin" "$release_prep_branch" || true # ignore errors + fi + echo "Please prepare the ChangeLog and remove this line" >>$tmp_changelog_file + echo "Changes in squid-${new_version} (${release_date}):" >>$tmp_changelog_file + echo "" >>$tmp_changelog_file + git log --no-decorate --oneline ${old_tag}.. | $SED 's@^[^ ]* @ - @;s@(#[0-9]*)$@@;s@ *$@@g' >>$tmp_changelog_file + echo >> $tmp_changelog_file + cat ChangeLog >> $tmp_changelog_file + mv $tmp_changelog_file ChangeLog + ${EDITOR:-vi} ChangeLog + git checkout -b $release_prep_branch $current_branch + git add ChangeLog + git commit -m "Prep for v$new_version" + git push -d $origin $release_prep_branch + git push $origin + $GH $repo pr create --base $current_branch --title "Prep for v$new_version" + git switch $current_branch + + echo + echo "now merge the ChangeLog PR and then run again" + echo "$0 $savedargs" + exit 0 +fi + + +# TODO: if have_tag $new_release, then get to that point in releasedate and +# skip fixing changelog +# check that the release in configure.ac is what we expect it to be +if ! $FGREP -q "AC_INIT([Squid Web Proxy],[${new_version}-VCS],[https://bugs.squid-cache.org/],[squid])" configure.ac ; then + if ! $FGREP -q "AC_INIT([Squid Web Proxy],[${old_version}-VCS],[https://bugs.squid-cache.org/],[squid])" configure.ac ; then + echo "old version $old_version not found in configure.ac" + exit 2 + fi +fi + +# update release version in configure.ac +$SED -i~ "s@${old_version}-VCS@${new_version}-VCS@" configure.ac + +git add configure.ac +git commit -m "v$new_version" +git push "$upstream" +git tag $new_tag +git push "$upstream" HEAD $new_tag + +package_release From 6b4273fbac319c03fd98289da41d01a3171f59ac Mon Sep 17 00:00:00 2001 From: Amos Jeffries Date: Tue, 1 Jul 2025 06:30:32 +1200 Subject: [PATCH 2/4] Update mk-release-package.sh --- release/mk-release-package.sh | 28 +++++----------------------- 1 file changed, 5 insertions(+), 23 deletions(-) diff --git a/release/mk-release-package.sh b/release/mk-release-package.sh index d1d6508..35ab551 100644 --- a/release/mk-release-package.sh +++ b/release/mk-release-package.sh @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/bin/sh set -u -o pipefail repo="" @@ -12,7 +12,7 @@ changelog_file=${changelog_file:-ChangeLog} test -f "$HOME/.squidrelease.rc" && . "$HOME/.squidrelease.rc" # args: variable and tool name. if variable is empty, bail -require() { if [ -z "$1" ]; then echo "$2 is required"; exit 1; fi } +require() { if test -z "$1"; then echo "$2 is required"; exit 1; fi } # test for tools SED="${SED:-`which gsed`}"; SED="${SED:-`which sed`}"; require "${SED:-}" sed @@ -127,7 +127,7 @@ package_release() { export new_version awk "/^Changes (in|to) squid-${new_version} /{flag=2} /^$/{flag=flag-1} flag>0" ${changelog_file} >$release_changelog_file local push_tag - if [ -z "$backfill" ] ; then push_tag="$new_tag" ; fi + if test -z "$backfill"; then push_tag="$new_tag" ; fi # relevant metadata files: ChangeLog CONTRIBUTORS COPYING CREDITS README SPONSORS.list doc/release-notes/release-*.html signfiles squid-${new_version}.tar.* declare -a filelist @@ -139,7 +139,7 @@ package_release() { done pushcmd="$GH $repo release create $new_tag -F $release_changelog_file --title "v${new_version}" ${filelist[@]}" - if [ "$push" = "yes" ] ; then + if test "x$push" = "xyes"; then eval $pushcmd echo "pushed! command:" else @@ -190,25 +190,9 @@ if false && ! have_tag "$old_tag" ; then exit 2 fi -## TODO: REDO BACKFILL starting from tarball -if [ -n "$backfill" ]; then - if ! have_tag "$new_tag" ; then - echo "Error: backfill requested but missing tag $new_tag" - exit 2 - fi - git reset --hard "$new_tag" - git clean -fdx - - # TODO: here - package_release - exit 0 -fi - # not a backfill. Wipe tags have_tag "$new_tag" && git tag -d "$new_tag" - - # if the ChangeLog is not ready, prepare one and bail setup_release_timestamps $new_tag if ! fgrep -q "Changes in squid-${new_version}" ${changelog_file}; then @@ -238,9 +222,7 @@ if ! fgrep -q "Changes in squid-${new_version}" ${changelog_file}; then exit 0 fi - -# TODO: if have_tag $new_release, then get to that point in releasedate and -# skip fixing changelog +# TODO: if have_tag $new_release, then get to that point in releasedate and skip fixing changelog # check that the release in configure.ac is what we expect it to be if ! $FGREP -q "AC_INIT([Squid Web Proxy],[${new_version}-VCS],[https://bugs.squid-cache.org/],[squid])" configure.ac ; then if ! $FGREP -q "AC_INIT([Squid Web Proxy],[${old_version}-VCS],[https://bugs.squid-cache.org/],[squid])" configure.ac ; then From 370327b9058e9d6fa3bcad566e5eceafe9d470b9 Mon Sep 17 00:00:00 2001 From: Amos Jeffries Date: Tue, 1 Jul 2025 06:46:45 +1200 Subject: [PATCH 3/4] Update mk-release-package.sh --- release/mk-release-package.sh | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/release/mk-release-package.sh b/release/mk-release-package.sh index 35ab551..fdb131e 100644 --- a/release/mk-release-package.sh +++ b/release/mk-release-package.sh @@ -19,21 +19,12 @@ SED="${SED:-`which gsed`}"; SED="${SED:-`which sed`}"; require "${SED:-}" sed FGREP=${FGREP:-`which fgrep`}; FGREP="${FGREP:-`which fgrep`}"; require "${FGREP:-}" fgrep GPG=${GPG:-`which gpg`}; require "${GPG:-}" gpg GH=${GH:-`which gh`}; require "${GH:-}" gh +po2html=`which po2html`; require "$po2html" po2html +po2txt=`which po2txt`; require "$po2txt" po2txt require "${SIGNKEY:-}" "SIGNKEY setting" require "${EMAIL:-}" "EMAIL setting" -po2html=`which po2html` -if test -z "$po2html" ; then - echo "cannot find po2html" - exit 1 -fi -po2txt=`which po2txt` -if test -z "$po2txt" ; then - echo "cannot find po2txt" - exit 1 -fi - usage() { cat <<_EOF use: @@ -55,13 +46,20 @@ and helps prepare it for merge. _EOF } +nuclearFallout () +{ + # wipeout the staging area and branch + + exit 1 +} + # argument: a tag. Returns 0 if the tag exists, 1 if it doesn't -have_tag() { +have_tag () { git tag -l "$1" | $FGREP -q "$1" return $? } -have_branch() { +have_branch () { git branch -l "$1" | $FGREP -q "$1" return $? } @@ -69,7 +67,7 @@ have_branch() { # as a side effect, set variables with timestamps. # gets as argument a tag; if the tag exists, then # use it as a timestamp, otherwise use the current date. -setup_release_timestamps() { +setup_release_timestamps () { test -n "${release_timestamp:-}" && return 0 if have_tag $1; then release_timestamp=`git show --pretty=%ct --no-patch $1` @@ -82,7 +80,7 @@ setup_release_timestamps() { # argument: the files to be signed # uses GPG, SIGNKEY, EMAIL, GPGHOME -signfiles() { +signfiles () { setup_release_timestamps $new_tag for file; do size="`stat $file | awk '/Size:/ {print $2;}'`" @@ -108,7 +106,7 @@ EOF done } -package_release() { +package_release () { # actually prep the release setup_release_timestamps $new_tag @@ -173,7 +171,6 @@ old_version="$2" new_tag=SQUID_`echo $new_version | tr . _` old_tag=SQUID_`echo $old_version | tr . _` - current_branch=`git branch --show-current` release_prep_branch="prep-v${new_version}" tmp_changelog_file="ChangeLog-$new_version" From ef4e8170519206a88f2ded8df9818ee05d21f20b Mon Sep 17 00:00:00 2001 From: Amos Jeffries Date: Tue, 1 Jul 2025 07:10:46 +1200 Subject: [PATCH 4/4] Update mk-release-package.sh --- release/mk-release-package.sh | 117 ++++++++++++++++++++-------------- 1 file changed, 68 insertions(+), 49 deletions(-) diff --git a/release/mk-release-package.sh b/release/mk-release-package.sh index fdb131e..5688850 100644 --- a/release/mk-release-package.sh +++ b/release/mk-release-package.sh @@ -1,6 +1,7 @@ #!/bin/sh set -u -o pipefail + repo="" origin="origin" upstream="upstream" @@ -11,20 +12,6 @@ changelog_file=${changelog_file:-ChangeLog} # sets SIGNKEY, EMAIL, GPGHOME. May set other variables test -f "$HOME/.squidrelease.rc" && . "$HOME/.squidrelease.rc" -# args: variable and tool name. if variable is empty, bail -require() { if test -z "$1"; then echo "$2 is required"; exit 1; fi } - -# test for tools -SED="${SED:-`which gsed`}"; SED="${SED:-`which sed`}"; require "${SED:-}" sed -FGREP=${FGREP:-`which fgrep`}; FGREP="${FGREP:-`which fgrep`}"; require "${FGREP:-}" fgrep -GPG=${GPG:-`which gpg`}; require "${GPG:-}" gpg -GH=${GH:-`which gh`}; require "${GH:-}" gh -po2html=`which po2html`; require "$po2html" po2html -po2txt=`which po2txt`; require "$po2txt" po2txt - -require "${SIGNKEY:-}" "SIGNKEY setting" -require "${EMAIL:-}" "EMAIL setting" - usage() { cat <<_EOF use: @@ -46,10 +33,64 @@ and helps prepare it for merge. _EOF } +while getopts "hR:o:u:bpg:" optchar ; do + case "${optchar}" in + h) usage; exit 0;; + R) repo="-R ${OPTARG}";; + o) origin="$OPTARG";; + u) upstream="$OPTARG";; + b) backfill="yes";; + p) push="yes";; + g) GPGHOME="$OPTARG";; + -) break;; + esac +done +shift $((OPTIND -1)) + +if test $# -lt 2; then + usage + exit 2 +fi + +staging_branch="staging-v$new_version" + +# args: variable and tool name. if variable is empty, bail +require() { if test -z "$1"; then echo "$2 is required"; exit 1; fi } + +basedir=`mktemp -d`; require "$basedir" "safe staging area" + +# test for tools +SED="${SED:-`which gsed`}"; SED="${SED:-`which sed`}"; require "${SED:-}" sed +FGREP=${FGREP:-`which fgrep`}; FGREP="${FGREP:-`which fgrep`}"; require "${FGREP:-}" fgrep +GPG=${GPG:-`which gpg`}; require "${GPG:-}" gpg +GH=${GH:-`which gh`}; require "${GH:-}" gh +po2html=`which po2html`; require "$po2html" po2html +po2txt=`which po2txt`; require "$po2txt" po2txt + +require "${SIGNKEY:-}" "SIGNKEY setting" +require "${EMAIL:-}" "EMAIL setting" + +new_version="$1" +old_version="$2" + +new_tag=SQUID_`echo $new_version | tr . _` +old_tag=SQUID_`echo $old_version | tr . _` + +current_branch=`git branch --show-current` +release_prep_branch="prep-v${new_version}" +tmp_changelog_file="ChangeLog-$new_version" +release_changelog_file="/tmp/${tmp_changelog_file}" + +echo "new: $new_tag old: $old_tag" +echo "repository: $repo" + + nuclearFallout () { # wipeout the staging area and branch - + rm -rf "$basedir" + git branch -dD "v${new_version}-staging" && git push --repo squid-cache/squid -d "v${new_version}-staging" + exit 1 } @@ -64,6 +105,17 @@ have_branch () { return $? } +setup_staging () { + echo " . Creating Squid-$new_version release staging area ..." + git clone git@github.com:squidadm/squid.git $basedir/squid-$new_version || nuclearFallout + cd $basedir/squid-$new_version || nuclearFallout + git remote add $upstream git@github.com:squid-cache/squid.git || nuclearFallout + + echo " .. Create staging branch ..." + git checkout --repo squid-cache/squid -b v${new_version}-staging && + git push -u squid-cache/squid +v${new_version}-staging || nuclearFallout +} + # as a side effect, set variables with timestamps. # gets as argument a tag; if the tag exists, then # use it as a timestamp, otherwise use the current date. @@ -108,9 +160,9 @@ EOF package_release () { # actually prep the release + setup_staging setup_release_timestamps $new_tag - git clean -fdx ./bootstrap.sh $SED -i~ "s@${new_version}-\(VCS\|CVS\)@${new_version}@" configure.ac && rm configure.ac~ $SED -i~ "s@${new_version}-\(VCS\|CVS\)@${new_version}@" configure && rm configure~ @@ -146,39 +198,6 @@ package_release () { echo $pushcmd } -while getopts "hR:o:u:bpg:" optchar ; do - case "${optchar}" in - h) usage; exit 0;; - R) repo="-R ${OPTARG}";; - o) origin="$OPTARG";; - u) upstream="$OPTARG";; - b) backfill="yes";; - p) push="yes";; - g) GPGHOME="$OPTARG";; - -) break;; - esac -done -shift $((OPTIND -1)) - -if [ $# -lt 2 ]; then - usage - exit 2 -fi - -new_version="$1" -old_version="$2" - -new_tag=SQUID_`echo $new_version | tr . _` -old_tag=SQUID_`echo $old_version | tr . _` - -current_branch=`git branch --show-current` -release_prep_branch="prep-v${new_version}" -tmp_changelog_file="ChangeLog-$new_version" -release_changelog_file="/tmp/${tmp_changelog_file}" - -echo "new: $new_tag old: $old_tag" -echo "repository: $repo" - # check that old tag exists # TODO: move to new-release only if false && ! have_tag "$old_tag" ; then