Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 36 additions & 2 deletions .github/workflows/build-loremaster.yml
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,7 @@ jobs:
pnpm test:items
pnpm test:updates
pnpm test:skin-updates
pnpm test:rc-backup

- name: Fetch stock-layout reference commit
shell: bash
Expand Down Expand Up @@ -378,6 +379,7 @@ jobs:
pnpm test:fixtures
pnpm build
pnpm test:gear
pnpm test:rc-backup

- name: Verify installer selftest
run: python3 installer/spinui_installer.py --selftest
Expand All @@ -397,9 +399,34 @@ jobs:
| grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+([-+][0-9A-Za-z.-]+)?$'; then
version="$(node -p "require('./package.json').version")"
fi
# A candidate has to install beside the live release rather than
# replace it. Gear Lever keys on the desktop entry, so productName
# (Name=) and desktopName (the .desktop filename, and StartupWMClass)
# both have to differ -- app-builder-lib reads desktopName first and
# only falls back to executableName, so overriding executableName
# alone leaves the entry named loremaster.desktop and the collision
# unfixed. desktopName sits at the top level of package.json, which
# is why it goes through extraMetadata rather than -c.linux.
#
# name is deliberately never overridden: userData comes from it, and
# a candidate shares the live settings on purpose so bugs surface
# against real data.
identity=()
if printf '%s' "$version" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+-'; then
identity=(
"-c.productName=Loremaster RC"
"-c.appId=com.spinui.loremaster.rc"
"-c.extraMetadata.desktopName=loremaster-rc.desktop"
"-c.linux.executableName=loremaster-rc"
# Single quoted: these are electron-builder templates, and bash
# would expand them to empty strings.
'-c.linux.artifactName=Loremaster-RC-${version}-${arch}.${ext}'
)
echo "building release candidate identity: Loremaster RC ($version)"
fi
pnpm build
pnpm exec electron-builder --linux AppImage tar.gz --x64 \
--publish never "-c.extraMetadata.version=$version"
--publish never "-c.extraMetadata.version=$version" "${identity[@]}"
env:
RELEASE_TAG: ${{ github.event.release.tag_name || inputs.release_tag }}

Expand Down Expand Up @@ -549,6 +576,13 @@ jobs:
# marker has to sit at column zero and so cannot be indented inside
# this step.
$version = $tag -replace '^v', ''
# A candidate ships under its own name so it can sit beside the live
# release, so the notes have to point at that file, not the other one.
$appImage = if ($prerelease) {
"Loremaster-RC-$version-x86_64.AppImage"
} else {
"Loremaster-$version-x86_64.AppImage"
}
$changelog = python tools/release_notes.py --version $tag
if ($LASTEXITCODE -ne 0) { throw "no changelog entry for $tag" }
$notes = @()
Expand All @@ -561,7 +595,7 @@ jobs:
"",
"## Installing",
"",
"**Linux** -- download ``Loremaster-$version-x86_64.AppImage``, ``chmod +x`` it, and run it. There is no self-update on Linux, so new builds always come from this page.",
"**Linux** -- download ``$appImage``, ``chmod +x`` it, and run it. There is no self-update on Linux, so new builds always come from this page.",
"",
"**Windows** -- ``Loremaster.exe`` is the portable build. It is unsigned, so antivirus machine-learning heuristics sometimes flag it; see the README's Troubleshooting section.",
"",
Expand Down
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,11 @@ that came with it.
discarded the first kill when two raid targets died before you confirmed a
difficulty, which is exactly what happens when a raid clears several at
once. Each kill now keeps its own zone, character and clear time.
- **Release candidates install beside the release** — a candidate now builds as
"Loremaster RC" with its own desktop entry, so a tool like Gear Lever can hold
it and the live release at the same time instead of treating them as one app.
It shares the live settings on purpose, so bugs show up against real data, and
it copies those settings aside once per candidate before it can touch them.

### Removed

Expand Down
11 changes: 11 additions & 0 deletions docs/RELEASING.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,3 +72,14 @@ a manual download. The SpinUI **skin** updater does run on Linux, and it
follows full releases only, exactly like the app updater.

That is why testing a candidate on Linux is a manual install by design.

## Installing a candidate alongside the live release

A candidate builds and installs as "Loremaster RC", with its own desktop
entry, so it sits beside the live release instead of replacing it. It shares
the live settings directory on purpose -- bugs surface against real data that
way -- so before it can write to anything, it snapshots settings and progress
once per candidate to `<appData>/spins-loremaster-rc-backups/<version>/` (on
Linux, `~/.config/spins-loremaster-rc-backups/<version>/`). If a candidate
damages something, recovery is a manual copy of that snapshot back into
`~/.config/spins-loremaster`.
Loading