Skip to content

metainfo: stamp the release version at build time, add a screenshot, validate it - #9

Merged
Ryanmello07 merged 3 commits into
urnetwork:mainfrom
Ryanmello07:upstream/appstream-metainfo
Aug 21, 2026
Merged

metainfo: stamp the release version at build time, add a screenshot, validate it#9
Ryanmello07 merged 3 commits into
urnetwork:mainfrom
Ryanmello07:upstream/appstream-metainfo

Conversation

@Ryanmello07

@Ryanmello07 Ryanmello07 commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Stacked PR — depends on #5 and #7 (app icon).
Opened against main because a cross-fork PR needs its base branch to exist in
this repo, so the diff below currently includes its parent's changes too.
Review after its parent lands.


Three things the AppStream metadata needed before it could be submitted
anywhere — and one reason nothing caught them.

1. The release version was hardcoded, so it was wrong

Nothing wrote it, so the file said whatever was typed into it last while the
pipeline shipped something else. This element is not decoration: GNOME Software,
KDE Discover and the Flathub page all read <release version=…> and display it.

The file becomes a configure_file() template. app/meson.build derives both
attributes from -Dapp_version — which the pipeline already passes, and which
both binaries already compile in as UR_APP_VERSION — so there is now exactly
one place the release version is written down.

The full version is stamped, suffix and all. appstreamcli accepts it, and
truncating would advertise a version matching no artifact (every other consumer
of $VERSION — both binaries, every package filename, the release-asset gates —
uses the whole string) and would collapse every build of the same UTC day into
one indistinguishable <release> element. Only the date is derived, from the
leading <YYYY>.<M>.<D>.

When -Dapp_version is not passed, meson warns loudly. That branch cannot be
caught any other way: a document saying version="0.0.0" is perfectly valid
AppStream, so no validator objects — it just appears on the store page.

2. No screenshot

Flathub requires at least one, and it is the single largest thing a store
listing is judged on. Added as a committed PNG plus the raw URL Flathub mirrors
from; a repo-relative path does not work, because the mirror step runs on a
build host that only has the URL. The declared width/height match the file
exactly (1600×970), which Flathub's linter checks.

3. Nothing validated the file

Which is how (1) survived. appstreamcli is the validator Flathub gates
submissions on, so it now runs in two places, against the generated file
rather than the template:

  • a meson test() — optional, because not every build host ships appstreamcli;
  • a step in the gui CI job, which is the one that always will.

Verified

appstreamcli validate --no-net --pedantic passes on the stamped output for a
real release version and for the 0.0.0 sentinel. The meson date derivation was
exercised standalone for 2026.8.16-1020679030-beta2026-08-16,
2026.12.3-992026-12-03, a bare 2026.8.16, and 0.0.0 (warning branch).

Why this is split this way

The metainfo is the Flathub-blocker cluster, and it is the one place in this
series where a maintainer decision is genuinely being asked for (what the
listing says, what the screenshot shows). Keeping it out of the rename PR means
that decision is not buried under 29 files of string substitution.

Note: this PR appends appstream to the gui job's apt list and adds a step
at the end of that job. PR 1 (upstream/ci-job-timeouts) edits the same job.
They merge cleanly; if git ever disagrees, keep both changes.

The Android and Apple clients ship under `com.bringyour.network`. Linux was
the only platform on a different reverse-DNS id, and every place the id is
written down had to be told which one to use. This makes Linux match, and it
has to be done in one change because the id is a join key: the GTK
application id, the .desktop basename, the AppStream component id, the polkit
action namespace, the icon-theme name and the Flatpak app id must all agree or
the desktop stops recognising the app.

WHAT MOVES, AND WHY IT IS ALL ONE COMMIT

  main.cpp             Gtk::Application::create() -- the GApplication id
  *.desktop            filename, Icon=, StartupWMClass=
  metainfo.xml         filename, <id>, <launchable>
  polkit .policy       filename + all four action ids, matched in
                       ControlProtocol.hpp so the daemon asks about the
                       actions the file actually declares
  icons                hicolor basenames; Flatpak refuses to export an icon
                       whose name is not the app id
  flatpak manifest     filename + id + the desktop-file-edit paths
  deb/rpm/tarball/     the installed paths, the conffile entries, and the
  AppImage/snap        uninstaller's stale-path list

Splitting these would leave an intermediate commit where, for example, the
.desktop names an icon that does not exist, or the daemon checks polkit
actions the shipped .policy does not declare -- both of which fail silently
at runtime rather than at build time.

TWO THINGS THAT ARE NOT PURE SEARCH-AND-REPLACE

1. `UrTheme::kAppIconName`. The icon name was spelled as a literal in two
   places -- the by-path load in UrTheme.cpp and the by-name fallback in
   MainWindow.cpp. Renaming the packaging alone left both lookups pointing at
   a file that no longer existed, and `set_from_icon_name()` renders a blank
   image without raising anything, so the title-bar logo simply went empty.
   It is now one constant that the packaging and both call sites share.

2. The libsecret keyring attribute in SecretServiceRpcSessionStore.cpp moves
   with the id. This is deliberately NOT dual-read: an entry written by an
   older build is no longer found, the app falls back to a fresh RPC session
   (the same one-time cost as the Flatpak data path moving), and the previous
   app identity is not left holding live key material in the user's keyring
   with nothing to clean it up.

No behaviour changes beyond those two. `network.ur.urnetwork` no longer
appears anywhere in the tree.
Two separate problems with the shipped icon, both visible on a normal desktop.

TRANSPARENCY. The old artwork had an opaque background baked in, so the icon
rendered as a square tile wherever the shell composites over its own surface
-- the GNOME dash, the app grid, and the window's own title bar. The
replacements are RGBA with a real alpha channel.

SIZES. Only 48 and 256 were installed. The desktop asks for 64 in the app
grid and 128/256 on a HiDPI display, and hicolor's fallback is to scale the
nearest size it has, so those lookups were served an upscale. This installs
48, 64, 128, 256 and 512.

All five are downscales of a single 1024x1024 master, taken from the same
AppIcon artwork the Apple client ships, so they cannot drift apart the way
separately-drawn assets do. The master is committed at
packaging/icons/com.bringyour.network-master-1024.png for regenerating them.

512 IS THE CEILING, DELIBERATELY. Installing the 1024 breaks the Flatpak
build outright: `flatpak build-export` refuses it with "Image too large
(1024x1024). Max. size 512x512" and fails the whole build at export time.
Nothing downstream wants a larger one -- Flathub renders the store page at up
to 512 -- so the master is kept in the tree but not installed.

app/meson.build (the Flatpak's installer) and packaging/lib/common.sh (the
staging tree the .deb, .rpm and tarball are all built from) now list the same
five sizes, and the tarball uninstaller removes all five; a size installed by
one and forgotten by the other is a file left behind on uninstall.
…validate it

Three things the AppStream metadata needed before it could be submitted
anywhere, and one reason nothing caught them.

1. THE RELEASE VERSION WAS HARDCODED, so it was wrong. Nothing wrote it, so
   the file said whatever was typed into it last while the pipeline shipped a
   different version. This element is not decoration: GNOME Software, KDE
   Discover and the Flathub page all read <release version=...> and show it.

   The file becomes a configure_file() template. app/meson.build derives both
   attributes from -Dapp_version, which the pipeline already passes and which
   both binaries already compile in as UR_APP_VERSION, so there is now exactly
   one place the release version is written down.

   The FULL version is stamped, suffix and all. appstreamcli accepts it, and
   truncating would advertise a version matching no artifact -- every other
   consumer of $VERSION (both binaries, every package filename, the
   release-asset gates) uses the whole string -- and would collapse every
   build of the same UTC day into one indistinguishable release element. Only
   the date is derived, from the leading <YYYY>.<M>.<D>.

   When -Dapp_version is not passed, meson warns loudly. That branch cannot be
   caught any other way: a document saying version="0.0.0" is perfectly valid
   AppStream, so no validator objects -- it just appears on the store page.

2. NO SCREENSHOT. Flathub requires at least one, and it is the single largest
   thing a store listing is judged on. Added as a committed PNG plus the raw
   URL Flathub mirrors from; a repo-relative path does not work, because the
   mirror step runs on a build host with only the URL. The declared width and
   height match the file exactly, which Flathub's linter checks.

3. NOTHING VALIDATED THE FILE. That is how (1) survived. appstreamcli is the
   validator Flathub gates submissions on, so it now runs in two places
   against the GENERATED file rather than the template: as a meson test
   (optional -- not every build host has appstreamcli) and as a CI step in the
   gui job, which is the one that always has it.

Verified: `appstreamcli validate --no-net --pedantic` passes on the stamped
output for a real release version and for the 0.0.0 sentinel, and the date
derivation was exercised for zero-padded and unpadded month/day.
@Ryanmello07 Ryanmello07 changed the title PR 4 — upstream/appstream-metainfo metainfo: stamp the release version at build time, add a screenshot, validate it Aug 21, 2026
@Ryanmello07
Ryanmello07 marked this pull request as ready for review August 21, 2026 15:41
@Ryanmello07
Ryanmello07 merged commit 42ad7cf into urnetwork:main Aug 21, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant