* Release under the SolidCraft name: binaries, assets and installers The desktop binary is now `solidcraft` and the CLI `solidcraft-cli` (the two app packages are renamed; their folders move with the rest of the rename later). Every release asset is named solidcraft-<ver>-… / SolidCraft-<ver>-windows-x64.exe, and the installers show the SolidCraft product name. Kept so existing installs keep updating (docs/compatibility.md): - `solvecraft-cli` alias binary in every package, forwarding to solidcraft-cli with a deprecation note on stderr (tests/legacy_alias.rs). - Linux app ID ai.storyteller.solvecraft (Flatpak ID, desktop entry, Wayland app_id). - MSI UpgradeCode, so the MSI upgrades in place. - deb Replaces/Conflicts/Provides and rpm Obsoletes/Provides solvecraft. - An old-named .zsync copy so earlier AppImages find updates; a legacy .flatpakrepo copy. - .solvecraft file associations; SOLVECRAFT_* fallbacks in the packaging scripts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RjGw4gA5ZvKrU8MQP6sBgT * MSI: register the legacy .solvecraft extension without a duplicate open verb Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RjGw4gA5ZvKrU8MQP6sBgT --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
76 lines
3.1 KiB
Bash
Executable File
76 lines
3.1 KiB
Bash
Executable File
#!/bin/sh
|
|
# SolidCraft AppImage entry point (packaging/linux/AppRun; installed by package.sh).
|
|
# Adapted from PhotoCraft's AppRun (storytold/photocraft, Apache-2.0; see ATTRIBUTION.md).
|
|
#
|
|
# On Wayland the compositor resolves a window's dock icon by taking the window's
|
|
# app_id (ai.storyteller.solvecraft, kept as a compatibility shim) and looking up an installed .desktop file.
|
|
# An AppImage installs nothing, so every AppImage run would otherwise show the
|
|
# generic "Wayland" icon. Best-effort desktop integration: on first run
|
|
# (and whenever the AppImage's path changes) install the .desktop entry and the
|
|
# hicolor icons into $XDG_DATA_HOME, then launch. Every failure here must leave
|
|
# the launch untouched. Opt out with SOLIDCRAFT_NO_DESKTOP_INTEGRATION=1 (the pre-rename
|
|
# SOLVECRAFT_NO_DESKTOP_INTEGRATION still works: compatibility shim, docs/compatibility.md).
|
|
|
|
set -u
|
|
|
|
APPDIR="$(dirname "$(readlink -f "$0")")"
|
|
# Compatibility shim (docs/compatibility.md): the pre-rename reverse-DNS id.
|
|
DESK_ID=ai.storyteller.solvecraft
|
|
|
|
integrate() {
|
|
case "${SOLIDCRAFT_NO_DESKTOP_INTEGRATION:-${SOLVECRAFT_NO_DESKTOP_INTEGRATION:-}}" in
|
|
1 | true | yes) return 0 ;;
|
|
esac
|
|
# The AppImage runtime exports $APPIMAGE; without it (an extracted AppDir) there
|
|
# is no path to register and nothing to do.
|
|
appimage="${APPIMAGE:-}"
|
|
[ -n "$appimage" ] && [ -f "$appimage" ] || return 0
|
|
appimage="$(readlink -f "$appimage")" || return 0
|
|
# Exec= is parsed by the desktop: a path holding a quote, backquote, dollar, backslash,
|
|
# percent or a line break would need escaping (or could add lines), so skip integration.
|
|
case "$appimage" in
|
|
*[\"\`\$\\%]* | *'
|
|
'*) return 0 ;;
|
|
esac
|
|
home="${HOME:-}"
|
|
[ -n "$home" ] || return 0
|
|
data="${XDG_DATA_HOME:-$home/.local/share}"
|
|
src_desktop="$APPDIR/usr/share/applications/$DESK_ID.desktop"
|
|
[ -f "$src_desktop" ] || return 0
|
|
|
|
# Rewrite Exec to this AppImage (the binary is not on the host PATH) and drop
|
|
# TryExec, which would hide the entry; everything else is shipped as packaged.
|
|
apps="$data/applications"
|
|
mkdir -p "$apps" 2>/dev/null || return 0
|
|
tmp="$apps/.$DESK_ID.tmp.$$"
|
|
esc="$(printf '%s' "$appimage" | sed 's/[\\&|]/\\&/g')"
|
|
if sed -e "s|^Exec=.*|Exec=\"$esc\" %F|" -e '/^TryExec=/d' "$src_desktop" 2>/dev/null >"$tmp"; then
|
|
if cmp -s "$tmp" "$apps/$DESK_ID.desktop"; then
|
|
rm -f "$tmp"
|
|
else
|
|
if mv -f "$tmp" "$apps/$DESK_ID.desktop" 2>/dev/null; then
|
|
command -v update-desktop-database >/dev/null 2>&1 && update-desktop-database "$apps" >/dev/null 2>&1
|
|
else
|
|
rm -f "$tmp"
|
|
fi
|
|
fi
|
|
else
|
|
rm -f "$tmp"
|
|
return 0
|
|
fi
|
|
|
|
# Icons: per-file compare so an unchanged install costs a handful of cmp calls.
|
|
src_icons="$APPDIR/usr/share/icons/hicolor"
|
|
[ -d "$src_icons" ] || return 0
|
|
icons="$data/icons/hicolor"
|
|
(cd "$src_icons" && find . -type f) | while IFS= read -r rel; do
|
|
mkdir -p "$icons/$(dirname "$rel")" 2>/dev/null || continue
|
|
if ! cmp -s "$src_icons/$rel" "$icons/$rel"; then
|
|
cp "$src_icons/$rel" "$icons/$rel" 2>/dev/null || true
|
|
fi
|
|
done
|
|
}
|
|
|
|
integrate
|
|
exec "$APPDIR/usr/bin/solidcraft" "$@"
|