#!/bin/bash set -e projects_token=${1:-} github_token=${2:-} if [[ -z $github_token ]]; then echo "Usage: $0 [projects-token] [github-token]" exit 1 fi if [[ ! -f NEWS ]]; then echo "Missing NEWS file. Try running from root of repository." exit 1 fi version=$(head --lines=1 NEWS) if [[ $version =~ .*dev* ]]; then echo "Refusing to release a dev version: $version" exit 1 fi if ! git diff-index --quiet HEAD -- ; then echo "Refusing to release with local changes:" git status --porcelain exit 1 fi git tag $version git push origin $version git push github $version # Build borgmatic and publish to pypi. rm -fr dist uv build tarball_path="dist/borgmatic-$version.tar.gz" wheel_path=$(ls dist/borgmatic-*-py3-none-any.whl) twine upload -r pypi --username __token__ "$tarball_path" twine upload -r pypi --username __token__ "$wheel_path" # Build docs and extract HTML. scripts/export-docs-from-image docs_path=dist/borgmatic-docs.tar.gz # Build stand-alone binaries. uv venv --python 3.13 --clear binary source binary/bin/activate uv pip install -r binary_requirements.txt nuitka[onefile] nuitka --mode=onefile --enable-plugin=upx --include-package-data=borgmatic --include-data-dir=borgmatic.egg-info=borgmatic.egg-info --include-package=borgmatic.hooks --include-package=apprise --no-deployment-flag=self-execution borgmatic/commands/borgmatic.py rm -fr borgmatic.build borgmatic.dist standalone_binary_path="dist/borgmatic-${version}-binary-linux-glibc-x86_64" mv borgmatic.bin "$standalone_binary_path" nuitka --mode=onefile --enable-plugin=upx --include-package-data=borgmatic --include-data-dir=borgmatic.egg-info=borgmatic.egg-info --include-package=borgmatic.hooks --no-deployment-flag=self-execution borgmatic/commands/borgmatic.py rm -fr binary borgmatic.build borgmatic.dist deactivate standalone_minimal_binary_path="dist/borgmatic-${version}-minimal-binary-linux-glibc-x86_64" mv borgmatic.bin "$standalone_minimal_binary_path" # Set release changelogs on projects.torsion.org and GitHub. release_changelog="$(cat NEWS | sed '/^$/q' | grep -v '^\S')" escaped_release_changelog="$(echo "$release_changelog" | sed -z 's/\n/\\n/g' | sed -z 's/\"/\\"/g')" release_id=$(curl --silent --request POST \ "https://projects.torsion.org/api/v1/repos/borgmatic-collective/borgmatic/releases" \ --header "Authorization: token $projects_token" \ --header "Accept: application/json" \ --header "Content-Type: application/json" \ --data "{\"body\": \"$escaped_release_changelog\", \"draft\": false, \"name\": \"borgmatic $version\", \"prerelease\": false, \"tag_name\": \"$version\"}" \ | jq ".id") curl --silent --request POST \ "https://projects.torsion.org/api/v1/repos/borgmatic-collective/borgmatic/releases/$release_id/assets?name=$(basename $wheel_path)" \ --header "Authorization: token $projects_token" \ --header "Accept: application/json" \ --form attachment=@"$wheel_path" curl --silent --request POST \ "https://projects.torsion.org/api/v1/repos/borgmatic-collective/borgmatic/releases/$release_id/assets?name=$(basename $tarball_path)" \ --header "Authorization: token $projects_token" \ --header "Accept: application/json" \ --form attachment=@"$tarball_path" curl --silent --request POST \ "https://projects.torsion.org/api/v1/repos/borgmatic-collective/borgmatic/releases/$release_id/assets?name=$(basename $docs_path)" \ --header "Authorization: token $projects_token" \ --header "Accept: application/json" \ --form attachment=@"$docs_path" curl --silent --request POST \ "https://projects.torsion.org/api/v1/repos/borgmatic-collective/borgmatic/releases/$release_id/assets?name=$(basename $standalone_binary_path)" \ --header "Authorization: token $projects_token" \ --header "Accept: application/json" \ --form attachment=@"$standalone_binary_path" curl --silent --request POST \ "https://projects.torsion.org/api/v1/repos/borgmatic-collective/borgmatic/releases/$release_id/assets?name=$(basename $standalone_minimal_binary_path)" \ --header "Authorization: token $projects_token" \ --header "Accept: application/json" \ --form attachment=@"$standalone_minimal_binary_path" github-release create --token="$github_token" --owner=witten --repo=borgmatic --tag="$version" --target_commit="main" \ --name="borgmatic $version" --body="$release_changelog"