desktop: one name across all three install channels (issue 2075)
The app answered to three different names depending on how it arrived, and the
part that actually hurt was WM_CLASS. Reading tauri-bundler settles what it is:
the generated .desktop template writes StartupWMClass={{exec}} where exec is
main_binary_name, and tao creates its GtkApplication with a NULL app id
(enableGTKAppId defaults off), so GTK falls back to the program name. WM_CLASS
is the binary name, nothing else.
Which inverts this issue's premise. The rename could not break grouping,
because two channels weren't grouping in the first place: pacman ships
/usr/bin/thoughtsync and the AppImage's AppRun execs thoughtsync-desktop, while
all three hand-written entries hardcoded StartupWMClass=ThoughtSync — a string
no binary in any channel has ever reported. Only the .deb worked, and only
because Tauri generates its entry from the binary and never consulted us.
So: thoughtsync everywhere, carried by the build target itself via Cargo [[bin]]
plus mainBinaryName rather than by the install path, since the target name is
what the desktop reads. The pacman package sheds its -desktop suffix and
declares conflict+replaces so an upgrade retires the old one instead of landing
beside it and fighting over /usr/bin/thoughtsync.
The .deb verifier now asserts binary path, Exec and StartupWMClass all agree,
which is the part that keeps this fixed: the .deb's entry is the one no human
writes, so it's the one that drifts silently.
Package: thought-sync stays. tauri-bundler derives it as kebab-case(productName)
with no override, and rewriting a control archive on every build is a poor trade
for one uninstall command.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -30,7 +30,7 @@ Or grab the `.pkg.tar.*` from the
|
||||
and install it directly:
|
||||
|
||||
```sh
|
||||
sudo pacman -U thoughtsync-desktop-*-x86_64.pkg.tar.*
|
||||
sudo pacman -U thoughtsync-*-x86_64.pkg.tar.*
|
||||
```
|
||||
|
||||
The compression suffix depends on what the build image provides — `.zst` when
|
||||
@@ -45,7 +45,11 @@ Either way you get:
|
||||
|
||||
Launch **ThoughtSync** from your app menu, or run `thoughtsync`.
|
||||
|
||||
Uninstall: `sudo pacman -R thoughtsync-desktop`.
|
||||
Uninstall: `sudo pacman -R thoughtsync`.
|
||||
|
||||
The package was called `thoughtsync-desktop` before; it declares `replaces`/
|
||||
`conflicts` on that name, so an upgrade from it is a normal `pacman -U` and
|
||||
leaves nothing behind.
|
||||
|
||||
## How the package is built
|
||||
|
||||
|
||||
@@ -29,10 +29,14 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
REPO_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)"
|
||||
|
||||
SRC_TAURI="$REPO_ROOT/desktop/src-tauri"
|
||||
BINARY="$SRC_TAURI/target/release/thoughtsync-desktop"
|
||||
BINARY="$SRC_TAURI/target/release/thoughtsync"
|
||||
OUT_DIR="${1:-$SRC_TAURI/target/release/bundle/arch}"
|
||||
|
||||
PKGNAME="thoughtsync-desktop"
|
||||
PKGNAME="thoughtsync"
|
||||
# The name this package used to ship under. pacman needs both to retire it: without
|
||||
# them a `pacman -U` of the renamed package installs ALONGSIDE the old one, and two
|
||||
# packages both own /usr/bin/thoughtsync (issue 2075).
|
||||
REPLACES=(thoughtsync-desktop)
|
||||
PKGREL=1
|
||||
PKGDESC="ThoughtSync desktop — local-first Keep-style thought capture"
|
||||
URL="https://git.fabledsword.com/bvandeusen/thoughtsync"
|
||||
@@ -73,9 +77,10 @@ STAGE="$(mktemp -d)"
|
||||
trap 'rm -rf "$STAGE"' EXIT INT TERM
|
||||
|
||||
# --- lay out the filesystem tree --------------------------------------------
|
||||
# /usr/bin/thoughtsync (not thoughtsync-desktop): matches the CLI name the
|
||||
# AppImage installer symlinks into ~/.local/bin, so the command is the same
|
||||
# whichever way the app was installed.
|
||||
# /usr/bin/thoughtsync — the same command name the .deb installs and the AppImage
|
||||
# installer symlinks into ~/.local/bin, so it's identical whichever way the app
|
||||
# arrived. The binary already carries this name (Cargo `[[bin]]`), which is also
|
||||
# what the .desktop entry's StartupWMClass has to match.
|
||||
install -Dm755 "$BINARY" "$STAGE/usr/bin/thoughtsync"
|
||||
install -Dm644 "$SCRIPT_DIR/thoughtsync.desktop" \
|
||||
"$STAGE/usr/share/applications/thoughtsync.desktop"
|
||||
@@ -109,6 +114,10 @@ INSTALLED_SIZE="$(du -sb "$STAGE" | cut -f1)"
|
||||
echo "arch = x86_64"
|
||||
echo "license = $LICENSE"
|
||||
for d in "${DEPENDS[@]}"; do echo "depend = $d"; done
|
||||
# conflict + replaces together: `conflict` is what makes pacman remove the old
|
||||
# package rather than refuse the transaction, `replaces` is what makes an upgrade
|
||||
# pick this one up under its new name.
|
||||
for r in "${REPLACES[@]}"; do echo "conflict = $r"; echo "replaces = $r"; done
|
||||
} >"$STAGE/.PKGINFO"
|
||||
|
||||
# --- .MTREE (optional) ------------------------------------------------------
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
# StartupWMClass must equal the BINARY name, not the product name: GTK derives
|
||||
# WM_CLASS from the executable, so anything else silently breaks taskbar icon
|
||||
# grouping. Tauri writes the same value into the .deb's generated entry.
|
||||
[Desktop Entry]
|
||||
Type=Application
|
||||
Name=ThoughtSync
|
||||
@@ -6,4 +9,4 @@ Exec=thoughtsync %U
|
||||
Icon=thoughtsync
|
||||
Terminal=false
|
||||
Categories=Utility;Office;
|
||||
StartupWMClass=ThoughtSync
|
||||
StartupWMClass=thoughtsync
|
||||
|
||||
Reference in New Issue
Block a user