mirror of
https://github.com/keymanapp/keyman.git
synced 2026-08-06 00:45:32 +00:00
With this change we wait two seconds after creating the PR before trying to get the number of the PR so that GitHub can catch up. Previously recently it wasn't able to get the PR#. Also adjust the commit message and use the new header for skipping tests.
163 lines
5.1 KiB
Bash
Executable file
163 lines
5.1 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
set -eu
|
|
|
|
usage()
|
|
{
|
|
cat - <<- END
|
|
|
|
${0} -k <Debian signing key> [-n] [--push]
|
|
|
|
Create source package for latest stable or beta release and upload to Debian,
|
|
and update (and optionally push) changelog file.
|
|
|
|
-k <key> The PGP key used to sign the source package
|
|
-n Simulate upload
|
|
--push Push changelog changes to GitHub
|
|
--beta Deploy beta release. Default: latest stable release.
|
|
--stable Deploy latest stable release.
|
|
--debian-revision <revision>
|
|
The debian revision to use. Default: 1
|
|
--help Display usage help
|
|
|
|
Requires an entry in ~/.dput.cf:
|
|
[mentors]
|
|
fqdn = mentors.debian.net
|
|
incoming = /upload
|
|
method = https
|
|
allow_unsigned_uploads = 0
|
|
progress_indicator = 2
|
|
allowed_distributions = .*
|
|
END
|
|
}
|
|
|
|
## START STANDARD BUILD SCRIPT INCLUDE
|
|
# adjust relative paths as necessary
|
|
THIS_SCRIPT="$(readlink -f "${BASH_SOURCE[0]}")"
|
|
. "${THIS_SCRIPT%/*}/../../resources/build/build-utils.sh"
|
|
## END STANDARD BUILD SCRIPT INCLUDE
|
|
|
|
. "$KEYMAN_ROOT/resources/shellHelperFunctions.sh"
|
|
|
|
NOOP=
|
|
PUSH=
|
|
DEBKEYID=
|
|
REVISION=1
|
|
IS_BETA=false
|
|
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
|
|
|
|
while (( $# )); do
|
|
case $1 in
|
|
-k) shift
|
|
if [[ ! $# -eq 0 ]]; then
|
|
DEBKEYID=$1
|
|
else
|
|
builder_die "Error: The -k argument is missing a value. Exiting."
|
|
fi;;
|
|
-n) NOOP=: ;;
|
|
--help) usage ; exit 0 ;;
|
|
--push) PUSH=1 ;;
|
|
--beta) IS_BETA=true ;;
|
|
--stable) IS_BETA=false ;;
|
|
--debian-revision)
|
|
shift
|
|
if [[ ! $# -eq 0 ]]; then
|
|
REVISION=$1
|
|
else
|
|
builder_die "Error: The --debian-revision argument is missing a value. Exiting."
|
|
fi;;
|
|
*) builder_die "Error: Unexpected argument \"$1\". Exiting." ;;
|
|
esac
|
|
shift || builder_die "Error: The last argument is missing a value. Exiting."
|
|
done
|
|
|
|
if [[ -z ${DEBKEYID} ]]; then
|
|
usage
|
|
exit 2
|
|
fi
|
|
|
|
if ! git diff --quiet; then
|
|
builder_die "You have changed files in your git working directory. Exiting."
|
|
fi
|
|
|
|
function get_latest_stable_branch_name() {
|
|
# Get the list of stable branches and take the one with the highest number.
|
|
# Extract `origin/stable-16.0` from ` origin/stable-16.0`
|
|
local branches stable_branch
|
|
branches=$(git branch -r | grep origin/stable-)
|
|
stable_branch=$(echo "${branches}" | sort | tail -1)
|
|
if [[ -z ${stable_branch} ]]; then
|
|
builder_die "Can't find stable-* branch" > /dev/stderr
|
|
exit 2
|
|
fi
|
|
echo "${stable_branch##* }"
|
|
}
|
|
|
|
# Push the changelog changes to GitHub and create a PR. Returns the PR#
|
|
# in the environment variable PR_NUMBER.
|
|
function push_to_github_and_create_pr() {
|
|
local BRANCH=$1 # `chore/linux/changelog` or `chore/linux/cherry-pick/changelog`
|
|
local BASE=$2 # stable branch, `beta` or `master`
|
|
local PR_TITLE=$3 # `Update debian changelog`
|
|
local PR_BODY=$4 # `@keymanapp-test-bot skip`
|
|
|
|
if [[ -n "${PUSH}" ]]; then
|
|
# Push to origin. We force push to reset the branch the commit we just made.
|
|
# There shouldn't be any other commits on ${BRANCH} except the one we want to replace
|
|
# (if any).
|
|
${NOOP} git push --force origin "${BRANCH}"
|
|
PR_NUMBER=$(gh pr list --draft --search "${PR_TITLE}" --base "${BASE}" --json number --jq '.[].number')
|
|
if [[ -n ${PR_NUMBER} ]]; then
|
|
builder_echo "PR #${PR_NUMBER} already exists"
|
|
else
|
|
${NOOP} gh pr create --draft --base "${BASE}" --title "${PR_TITLE}" --body "${PR_BODY}"
|
|
sleep 2s
|
|
PR_NUMBER=$(gh pr list --draft --search "${PR_TITLE}" --base "${BASE}" --json number --jq '.[].number')
|
|
fi
|
|
else
|
|
PR_NUMBER=""
|
|
fi
|
|
}
|
|
|
|
builder_heading "Fetching latest changes"
|
|
git fetch -p origin
|
|
|
|
if ${IS_BETA}; then
|
|
DEPLOY_BRANCH=origin/beta
|
|
else
|
|
# shellcheck disable=2311
|
|
DEPLOY_BRANCH=$(get_latest_stable_branch_name)
|
|
fi
|
|
|
|
# Checkout stable/beta branch so that `scripts/debian.sh` picks up correct version
|
|
git checkout "${DEPLOY_BRANCH#origin/}"
|
|
git pull origin "${DEPLOY_BRANCH#origin/}"
|
|
|
|
builder_heading "Building source package"
|
|
cd "${KEYMAN_ROOT}/linux"
|
|
DIST=unstable DEBREVISION=${REVISION} scripts/debian.sh
|
|
cd debianpackage/
|
|
builder_heading "Signing source package"
|
|
debsign -k"${DEBKEYID}" --re-sign ./*.changes
|
|
builder_heading "Uploading packages to mentors.debian.net"
|
|
${NOOP} dput mentors ./*.changes
|
|
cd ..
|
|
|
|
builder_heading "Updating changelog"
|
|
|
|
# base changelog branch on remote stable/beta branch
|
|
git checkout -B chore/linux/changelog "${DEPLOY_BRANCH}"
|
|
cp debianpackage/keyman-*/debian/changelog debian/
|
|
git add debian/changelog
|
|
COMMIT_MESSAGE="chore(linux): Update debian changelog"
|
|
git commit -m "${COMMIT_MESSAGE}"
|
|
push_to_github_and_create_pr chore/linux/changelog "${DEPLOY_BRANCH#origin/}" "${COMMIT_MESSAGE} 🏠" "Test-bot: skip"
|
|
|
|
# Create cherry-pick on master branch
|
|
git checkout -B chore/linux/cherry-pick/changelog origin/master
|
|
git cherry-pick -x chore/linux/changelog
|
|
push_to_github_and_create_pr chore/linux/cherry-pick/changelog master "${COMMIT_MESSAGE} 🍒" \
|
|
"Cherry-pick-of: #${PR_NUMBER}
|
|
Test-bot: skip"
|
|
|
|
builder_heading "Finishing"
|
|
git checkout "${CURRENT_BRANCH}"
|