initial commit: reforgermods.net launcher 0.1.0

A desktop server browser for Arma Reforger, built on the reforgermods.net v2
API. Live server list with search, sort and filters; a detail inspector with
population history and mod readiness; measured ICMP latency; favorites, recents
and settings; and direct joining through Steam.

Tauri 2 and Rust, with a Preact frontend that builds to 80 KB of JavaScript in
one chunk. Logic lives in rfm-core, which has no Tauri dependency and is tested
directly; src-tauri is the window, the command surface and the wiring.

Packaged for the public beta: a per-user NSIS installer, a portable .exe and an
Arch package, with signature-verified background updates on Windows and a
release pipeline that builds from a tag. The artifacts are not yet
Authenticode-signed — that is wired and waiting on an Azure Trusted Signing
identity, and docs/distribution.md says so plainly rather than letting anyone
discover it at the SmartScreen dialog.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
SowinskiBraedenandClaude Opus 5 committed 2026-09-24 20:29:00 -07:00
commit 377f3a31b3
91 files changed
+24994

No files matched your search

+116
View File
@@ -0,0 +1,116 @@
#!/usr/bin/env bash
# The launcher's version, in one place.
#
# scripts/version.sh show print the canonical version
# scripts/version.sh check [tag] fail if any copy disagrees
# scripts/version.sh set 0.2.0 rewrite every copy
#
# The canonical value is `[workspace.package] version` in the root Cargo.toml,
# because that is the one the *running binary* reports: rfm-core builds its
# User-Agent from CARGO_PKG_VERSION, so the API's per-version rollups are keyed
# off it whatever the other files say.
#
# It has to be repeated in four places — Cargo's workspace manifest, package.json,
# tauri.conf.json and the PKGBUILD — because no two of those tools can read each
# other's format. tauri.conf.json could inherit from Cargo.toml by omitting the
# field, but the src-tauri crate declares `version.workspace = true` and Tauri
# parses that manifest itself rather than resolving workspace inheritance, so the
# value has to be written out. `check` is what makes the repetition safe.
#
# This matters more than tidiness: an updater whose manifest version disagrees
# with the installed version either loops forever or never fires
# (docs/distribution.md section 6).
set -euo pipefail
REPO="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$REPO"
canonical() {
# The first `version = "x.y.z"` under [workspace.package].
awk '/^\[workspace\.package\]/{f=1;next} /^\[/{f=0} f && /^version *=/{gsub(/[^0-9a-zA-Z.\-+]/,"",$3);print $3;exit}' Cargo.toml
}
read_package_json() { python3 -c 'import json;print(json.load(open("package.json"))["version"])'; }
read_tauri_conf() { python3 -c 'import json;print(json.load(open("src-tauri/tauri.conf.json"))["version"])'; }
read_pkgbuild() { sed -n 's/^pkgver=\(.*\)$/\1/p' packaging/arch/PKGBUILD; }
SEMVER='^[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z.-]+)?$'
cmd_show() { canonical; }
cmd_check() {
local want tag="${1:-}" status=0
want="$(canonical)"
if [[ ! "$want" =~ $SEMVER ]]; then
echo "Cargo.toml [workspace.package] version is not semver: '$want'" >&2
return 1
fi
local name value
for name in package.json src-tauri/tauri.conf.json packaging/arch/PKGBUILD; do
case "$name" in
package.json) value="$(read_package_json)" ;;
src-tauri/tauri.conf.json) value="$(read_tauri_conf)" ;;
packaging/arch/PKGBUILD) value="$(read_pkgbuild)" ;;
esac
if [[ "$value" != "$want" ]]; then
echo "$name: $value, want $want (run: scripts/version.sh set $want)" >&2
status=1
fi
done
# A tag is checked only when one is given, so the same command serves CI on a
# tag push and a developer on a branch. Both `1.2.3` and `v1.2.3` are accepted.
if [[ -n "$tag" && "${tag#v}" != "$want" ]]; then
echo "tag $tag does not match version $want" >&2
status=1
fi
if [[ $status -eq 0 ]]; then
echo "version $want is consistent${tag:+ with tag $tag}"
fi
return $status
}
cmd_set() {
local want="${1:?usage: scripts/version.sh set <version>}"
want="${want#v}"
if [[ ! "$want" =~ $SEMVER ]]; then
echo "not a semver version: '$want'" >&2
return 1
fi
python3 - "$want" <<'PY'
import io, json, re, sys
want = sys.argv[1]
# Cargo.toml: only the [workspace.package] version, never a dependency's.
path = "Cargo.toml"
text = io.open(path, encoding="utf-8").read()
def bump_workspace_version(match):
return match.group(1) + '"' + want + '"'
new, count = re.subn(r'(\[workspace\.package\]\n(?:[^\[]*?\n)?version *= *)"[^"]*"', bump_workspace_version, text)
assert count == 1, f"{path}: matched {count} workspace versions, expected 1"
io.open(path, "w", encoding="utf-8").write(new)
# package.json / tauri.conf.json: rewrite the single field, preserving formatting
# (a json.dump round trip would reformat files a human maintains).
for path, key in (("package.json", "version"), ("src-tauri/tauri.conf.json", "version")):
text = io.open(path, encoding="utf-8").read()
new, count = re.subn(r'("%s"\s*:\s*)"[^"]*"' % key, lambda m: m.group(1) + '"' + want + '"', text, count=1)
assert count == 1, f"{path}: no {key} field"
json.loads(new)
io.open(path, "w", encoding="utf-8").write(new)
path = "packaging/arch/PKGBUILD"
text = io.open(path, encoding="utf-8").read()
new, count = re.subn(r'(?m)^pkgver=.*$', "pkgver=" + want, text, count=1)
assert count == 1, f"{path}: no pkgver"
io.open(path, "w", encoding="utf-8").write(new)
print("set version", want)
PY
cmd_check
}
case "${1:-show}" in
show) cmd_show ;;
check) shift; cmd_check "$@" ;;
set) shift; cmd_set "$@" ;;
*) echo "usage: scripts/version.sh [show|check [tag]|set <version>]" >&2; exit 2 ;;
esac