Skip to content

Instantly share code, notes, and snippets.

@mlt
Created February 26, 2026 08:00
Show Gist options
  • Select an option

  • Save mlt/2820399eff6d2ecf4a6ee19e033b09c3 to your computer and use it in GitHub Desktop.

Select an option

Save mlt/2820399eff6d2ecf4a6ee19e033b09c3 to your computer and use it in GitHub Desktop.
Automatic updater for msys2 packages
#!/bin/sh
# https://github.com/msys2/MINGW-packages/discussions/28078
set -e
if [ "$#" -ne 1 ]; then
echo "Error: This script requires exactly 1 argument." >&2
echo "Usage: $0 <path/to/PKGBUILD>" >&2
exit 1
fi
pkgbuild=$1
upstream=msys2/MINGW-packages
source $pkgbuild
echo -e "\e[36mChecking on new releases for $_realname ($pkgver)\e[0m"
# from https://github.com/$repo
for entry in "${msys2_references[@]}"; do
if [[ $entry == anitya:* ]]; then
value="${entry#*: }"
echo "Using https://release-monitoring.org/project/$value/"
version=$(curl -s https://release-monitoring.org/api/v2/versions/?project_id=$value | jq -r .latest_version)
break
fi
done
gh_regex='github\.com/([^/]+/[^/]+)'
if [[ -z "$version" && "${source[0]}" =~ $gh_regex ]]; then
# fallback for projects with GitHub releases
repo=${BASH_REMATCH[1]}
tag=$(gh release view --repo $repo --json tagName --template '{{.tagName}}')
version=${tag##*-} # Remove everything before/including last hyphen
version=${version#v} # Remove leading 'v'
fi
# second chance for GitHub in msys2_repository_url
if [[ -z "$version" && "${msys2_repository_url}" =~ $gh_regex ]]; then
# fallback for projects with GitHub releases
repo=${BASH_REMATCH[1]}
tag=$(gh release view --repo $repo --json tagName --template '{{.tagName}}') || true
if [[ -z "$tag" ]]; then
echo "hello"
# maybe tags if not releases
tag=$(gh api graphql -f query='
query($owner: String!, $name: String!) {
repository(owner: $owner, name: $name) {
refs(refPrefix: "refs/tags/", last: 1, orderBy: {field: TAG_COMMIT_DATE, direction: ASC}) {
nodes { name }
}
}
}' -f owner="${repo%/*}" -f name="${repo#*/}" --jq '.data.repository.refs.nodes[].name')
fi
version=${tag##*-} # Remove everything before/including last hyphen
version=${version#v} # Remove leading 'v'
fi
if [[ -z "$version" ]]; then
echo -e "\e[31mI don't know how to check for new release of $_realname.\e[0m"
exit
fi
# makepkg --printsrcinfo | grep pkgver | awk '{print $3}'
if [[ "$pkgver" != "$version" ]]; then
echo "New release $version!"
sed -i -e "s/^pkgver=.*/pkgver=$version/;s/^pkgrel=.*/pkgrel=1/" $pkgbuild
updpkgsums $pkgbuild
( cd "${pkgbuild%/*}" && makepkg-mingw )
branch=$(git branch --show-current)
# git worktree add
if [[ "$branch" == "master" && $(git diff --cached --exit-code) ]]; then
echo -e "\e[32mWe are on master branch without staged changes."
echo -e "Let's commit into a new branch and open PR.'\e[0m"
git switch -c $_realname
git add $pkgbuild
git commit -m "$_realname: update to $version"
# FIXME externalize that in an env as all updates will be pushed to same remote
# remote=$(git remote -v | awk -v user=$(gh api user -q ".login") '$0 ~ user {print $1; exit}')
remote=$(git config --get-regexp '^remote\..*\.url$' "/$(gh api user -q .login)/" | cut -d. -f2)
# overwrite previous version bumps if any
git push $remote $realname --force
git switch -
gh pr create --draft --fill-first --base master --head $_realname --repo $upstream
# --title "$_realname: update to $version" --body "Everything works again"
else
echo -e "\e[31mLooks like you are doing something at the moment in the repo. Can't do much more.\e[0m"
fi
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment