.PHONY: dev build clean release # v3 uses the GTK4/WebKitGTK 6.0 stack by default (same 2.52.x engine # generation as the v2 webkit2_41 build), so no build tags are needed. dev: wails3 dev -port 5173 build: wails3 build clean: rm -rf build/bin/* # Create a version commit (version bump, committed and pushed) plus an # annotated version tag carrying auto-generated release notes (git-cliff), # and push both. The tag push triggers .gitea/workflows/release.yml, which # verifies build/config.yml matches the tag, builds via `make build`, packages # AniTrack-.tar.gz from build/, and publishes a Gitea Release # named AniTrack- with the archive attached. Notes come entirely # from Conventional Commits — no hand-written message required. # # The single version source is build/config.yml info.version. `make release` # bumps it and regenerates version.go (the compiled-in copy) from it, so the # two can never drift; both ride the same bump commit. # # git-cliff's --latest needs the tag to exist to scope the notes, so we # create a throwaway lightweight tag, generate the notes, replace it with # an annotated tag, then push. --cleanup=verbatim keeps the markdown "###" # group headers (git's default cleanup would strip lines starting with "#"). # # Tags are plain versions (1.6.7) to match build/config.yml info.version and # the existing tag history. Pre-releases are created by tagging manually with # a suffix (e.g. 1.6.7-rc1 on top of the bumped commit) — the workflow marks # those as prerelease. Use ./release as a shortcut. # # Requires git-cliff: https://git-cliff.org/install # Usage: make release VERSION=1.6.7 release: @test -n "$(VERSION)" || { echo "Usage: make release VERSION=1.6.7"; exit 1; } @echo "$(VERSION)" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+$$' || { echo "VERSION must be plain semver like 1.6.7 (no v prefix, no AniTrack- prefix, no suffix)"; exit 1; } @command -v git-cliff >/dev/null 2>&1 || { echo "git-cliff not found — install: https://git-cliff.org/install"; exit 1; } @command -v python3 >/dev/null 2>&1 || { echo "python3 not found — required to bump versions"; exit 1; } @git diff --quiet && git diff --cached --quiet || { echo "Working tree dirty — commit or stash first"; exit 1; } @if git rev-parse "$(VERSION)" >/dev/null 2>&1; then echo "Tag $(VERSION) already exists locally — delete it first: git tag -d $(VERSION)"; exit 1; fi @echo "Bumping build/config.yml to $(VERSION)..." @python3 -c "import re; p='build/config.yml'; s=open(p).read(); m=re.search(r'^ version: \"([^\"]*)\"', s, flags=re.M); assert m, 'info.version not found'; print('build/config.yml', m.group(1), '-> $(VERSION)' if m.group(1) != '$(VERSION)' else '(already at version)'); open(p,'w').write(re.sub(r'^ version: \"[^\"]*\"', ' version: \"$(VERSION)\"', s, count=1, flags=re.M))" @echo "Regenerating version.go from build/config.yml..." @python3 -c "import re; v=re.search(r'^ version: \"([^\"]*)\"', open('build/config.yml').read(), flags=re.M).group(1); open('version.go','w').write('package main\n\n// Code generated by \`make release\` from build/config.yml info.version.\n// DO NOT EDIT.\nconst appVersionString = \"%s\"\n' % v)" @git add build/config.yml version.go @git diff --cached --quiet && echo "versions already at $(VERSION), skipping bump commit" || git commit -m "chore(release): bump version to $(VERSION)" @echo "Generating release notes for $(VERSION)..." @git tag "$(VERSION)" HEAD && \ (git cliff --latest --config cliff.toml > .release-notes.tmp && git tag -d "$(VERSION)" >/dev/null) || \ { git tag -d "$(VERSION)" >/dev/null 2>&1; rm -f .release-notes.tmp; echo "git-cliff failed"; exit 1; } @git tag -a --cleanup=verbatim -F .release-notes.tmp "$(VERSION)" HEAD && rm -f .release-notes.tmp @git push origin main "$(VERSION)" @echo "Pushed $(VERSION) — Gitea Actions will build, package, and publish AniTrack-$(VERSION).tar.gz."