Woodpecker hands every step a forge credential for cloning — an access token of the repository's owner — and a one-off diagnostic in the check step confirmed it is there. scripts/ci-upload.sh now uses it when no `gitea_token` secret is set, so publishing a release needs nothing configured. Gitea takes such a credential as `token …` or `Bearer …` depending on how Woodpecker was set up, so the script probes which of the two `/user` accepts rather than assuming, and says which one it used. The secret mapping is gone from the step as well: referencing a secret that does not exist is a failure mode of its own, and the fallback is the normal path now. Adding a `gitea_token` secret and mapping it back in is how you publish as somebody else. Documents the release flow the pipeline now implements: push a vX.Y.Z tag, the pipeline builds Linux and Windows and creates the release with them in it, and `make release` from a Mac pushes the macOS package onto the same release. Either half can go first. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
92 lines
4.6 KiB
Markdown
92 lines
4.6 KiB
Markdown
# WarpEngine Store 1.4.0
|
|
|
|
**A store no longer needs a repository of its own.** Until now every store in the
|
|
registry pointed at a repository holding its `config.json`, and the client read that
|
|
file to know what to install. It turns out almost nothing in there was necessary: the
|
|
store engine's built-in defaults already cover the host-to-asset mapping, the install
|
|
modes, the platforms and the behaviour. What defaults cannot know is *identity* — a
|
|
slug, a name and a catalog URL — and that is exactly what a registry record carries.
|
|
|
|
So `storeRepositoryUrl` is now optional. A record with a name and a catalog URL is a
|
|
complete store: the client derives the slug from the catalog host
|
|
(`teletypegames.org` → `teletypegames`), writes a small config and installs. Given a
|
|
repository it still reads it, and that file remains the authority on how the store
|
|
behaves — which platforms it offers, which statuses it shows, where things land. A
|
|
repository without a `config.json` is treated as no repository at all.
|
|
|
|
With the defaults, games land in a folder named after the store id and released,
|
|
archived **and demo** titles are listed: a catalog that publishes a demo means it to
|
|
be played.
|
|
|
|
The site's registry endpoint changed to match — `storeRepositoryUrl` answers `null`
|
|
when there is none — and adding a store is now genuinely one database row with two
|
|
fields filled in.
|
|
|
|
**The "Install all" button is gone.** Titles are installed one at a time from their
|
|
own cards.
|
|
|
|
**No footer.** The window carried a bar at the bottom at all times — a toggle and a
|
|
line of absolute paths — for something most sessions never need. The log is still
|
|
there, with the two folder buttons in it, but it lives behind a quiet switch at the
|
|
bottom of the side menu and takes no room until it is opened. The grid gets the height
|
|
back.
|
|
|
|
**The repository is now `warp-engine-client`.** The app has always been called
|
|
WarpEngine Store; `warp-engine-desktop-gui` described the role rather than the
|
|
product, and the host-specific engines keep their own shape
|
|
(`warp-engine-desktop-store`, `-retroarch-store`, `-batocera-store`). Gitea keeps a
|
|
redirect from the old path, and the releases and tags moved with the repository, so
|
|
existing links and clones still resolve.
|
|
|
|
### Three things a screenshot found
|
|
|
|
Photographing the setup screen — which no automated count had ever looked at — turned
|
|
up three faults that every check had passed:
|
|
|
|
- the store badge in the bar rendered as an empty pill when no store was open;
|
|
- the gate's store picker showed as an empty dropdown stub, because an explicit
|
|
`display` in the stylesheet beats the browser's own `[hidden]` rule;
|
|
- the gate went up while the *"No installable titles in the catalog"* line stayed on
|
|
screen underneath it.
|
|
|
|
The last one was a design fault, not a typo: whether the gate is up was an imperative
|
|
call on a view rather than state, so the gate and the grid could disagree. The setup
|
|
screen is now a field in the state store, and that one field decides which of the two
|
|
is drawn. The window test's gate assertion was wrong too — it demanded a store picker,
|
|
which only appears when the registry offers more than one store, so a perfectly good
|
|
window failed it.
|
|
|
|
### Linux and Windows packages now come from CI
|
|
|
|
A `vX.Y.Z` tag now starts the pipeline, which builds the AppImage, the deb, the NSIS
|
|
installer and the portable exe — Windows through Wine — **creates this release** and
|
|
attaches all four. macOS stays a local build, because Apple's toolchain and its signing
|
|
exist only on a Mac, so `make release` from a Mac pushes that package onto the same
|
|
release afterwards. No secret is involved: the pipeline publishes with the forge
|
|
credential Woodpecker already gives every step.
|
|
|
|
The Windows installer is not signed: Windows will warn about an unknown publisher until
|
|
there is a certificate.
|
|
|
|
### Opening it on macOS
|
|
|
|
Ad-hoc signed, **not notarised**, so macOS asks first:
|
|
|
|
```sh
|
|
xattr -dr com.apple.quarantine "/Applications/WarpEngine Store.app"
|
|
```
|
|
|
|
### What is attached
|
|
|
|
The macOS arm64 package, built and verified here, plus whatever the pipeline attaches
|
|
for Linux (AppImage, deb) and Windows (installer, portable).
|
|
|
|
### Verified
|
|
|
|
A repository-less store was installed end to end against a local registry serving one
|
|
record with `storeRepositoryUrl: null`: the id came out as `teletypegames`, the engine
|
|
and the shared core downloaded, the written config had three sections, engine 1.1.0
|
|
accepted it, it listed the same ten titles the configured store does, and a hosted
|
|
title synced into a sandbox with its menu entry written. `make check` is clean, and
|
|
the setup gate was photographed on a machine with no store at all.
|