gsd snapshot: pre-dispatch, uncommitted changes after 1306m inactivity

This commit is contained in:
GSD Bot
2026-05-28 17:53:32 -04:00
parent 0cc0b4cffd
commit d57e078c10
8 changed files with 69 additions and 92 deletions
+3 -3
View File
@@ -25,9 +25,9 @@ jobs:
run: |
flatpak remote-add --user --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
flatpak install --user -y flathub \
org.gnome.Platform//48 \
org.gnome.Sdk//48 \
org.freedesktop.Sdk.Extension.node22//24.08 \
org.gnome.Platform//49 \
org.gnome.Sdk//49 \
org.freedesktop.Sdk.Extension.node22//25.08 \
org.flatpak.Builder
- name: Restore flatpak-builder cache
+3
View File
@@ -0,0 +1,3 @@
[submodule "shared-modules"]
path = shared-modules
url = https://github.com/flathub/shared-modules.git
-60
View File
@@ -1,60 +0,0 @@
#!/usr/bin/env python3
"""Patch src-tauri/src/lib.rs to remove tray-icon dependency.
The upstream source unconditionally imports tauri::tray::TrayIconBuilder
and constructs a tray icon. In the GNOME Flatpak sandbox, libappindicator
is not available, so the tray-icon feature causes a runtime panic.
Removes the tray import line and the menu+run_on_tray setup block,
replacing with a no-op `let _ = app;`.
"""
import sys
def patch_lib_rs(path: str) -> None:
with open(path) as f:
lines = f.readlines()
out: list[str] = []
import_line = " tray::TrayIconBuilder,\n"
block_start = ' let open_menu_item = MenuItem::with_id(app, "open", "Open", true, None::<&str>)\n'
block_end_marker = '.expect("error while setting up tray menu")'
state = "passthrough" # passthrough | skipping_block | drop_one
for line in lines:
if line == import_line:
continue
if state == "passthrough":
if line == block_start:
state = "skipping_block"
continue
out.append(line)
elif state == "skipping_block":
if block_end_marker in line:
state = "drop_one"
# skip this line either way
continue
elif state == "drop_one":
# This is the ` });` closing run_on_tray(...)
# We drop it and insert the no-op.
out.append(" let _ = app;\n")
state = "passthrough"
continue
with open(path, "w") as f:
f.writelines(out)
print("Patched lib.rs: removed tray-icon code")
if __name__ == "__main__":
if len(sys.argv) != 2:
print(f"Usage: {sys.argv[0]} <lib.rs>", file=sys.stderr)
sys.exit(1)
patch_lib_rs(sys.argv[1])
+9 -12
View File
@@ -1,6 +1,6 @@
app-id: org.droposs.client
runtime: org.gnome.Platform
runtime-version: '48'
runtime-version: '49'
sdk: org.gnome.Sdk
sdk-extensions:
- org.freedesktop.Sdk.Extension.node22
@@ -12,6 +12,7 @@ finish-args:
- --share=network
- --filesystem=xdg-download
- --talk-name=org.freedesktop.Notifications
- --talk-name=org.kde.StatusNotifierWatcher
cleanup:
- /include
- /lib/pkgconfig
@@ -37,17 +38,17 @@ modules:
- git submodule update --init --recursive
- type: archive
url: https://static.rust-lang.org/dist/rustc-nightly-x86_64-unknown-linux-gnu.tar.xz
sha256: 6e280cf8889524b092214f9ed7c293bee43680988b00cc48cdac76c9df352c1d
sha256: d42b132a9e320f3d5ed31556f39c8167578e37dd619001ea877ff799625dce61
strip-components: 1
dest: rust-nightly/rustc
- type: archive
url: https://static.rust-lang.org/dist/cargo-nightly-x86_64-unknown-linux-gnu.tar.xz
sha256: c5421d7fad5e5c3596ba6c0748e4441a87deb237a56e1ef7c1551c0dc93dd3cd
sha256: 7261220eb1b693e9f9fccac50a59ba17e69c2aa7e4d8767a6d283dfc06c87455
strip-components: 1
dest: rust-nightly/cargo
- type: archive
url: https://static.rust-lang.org/dist/rust-std-nightly-x86_64-unknown-linux-gnu.tar.xz
sha256: d590f515075c54918d48cb16c77677633b5a5245e4055655fdc82c1ab7983f13
sha256: 42925c20ba01b3b530ba43724eecb5b9604a9def21852894f9e75e2c0bc5fafa
strip-components: 1
dest: rust-nightly/rust-std
- type: file
@@ -8207,6 +8208,7 @@ modules:
- node build.mjs
- 'test -f main/.output/public/index.html && echo "Nuxt build verified: main/.output/public/index.html exists"'
- mkdir -p /app/share/drop-frontend && cp -r .output/. /app/share/drop-frontend/
- shared-modules/libappindicator/libappindicator-gtk3-12.10.json
- name: drop-app-rust
buildsystem: simple
build-options:
@@ -8220,9 +8222,6 @@ modules:
url: https://github.com/Drop-OSS/drop-app
commit: c9ceb3f50ea061f0023f87211775e8380a181cbc
disable-shallow-clone: true
- type: file
path: flatpak-patches/patch-tray-icon.py
dest: flatpak-patches
- type: git
url: https://github.com/drop-oss/droplet-rs
commit: f17a585b563d874ef9a09c27be5169b7e728d148
@@ -8237,17 +8236,17 @@ modules:
path: org.droposs.client.metainfo.xml
- type: archive
url: https://static.rust-lang.org/dist/rustc-nightly-x86_64-unknown-linux-gnu.tar.xz
sha256: 6e280cf8889524b092214f9ed7c293bee43680988b00cc48cdac76c9df352c1d
sha256: d42b132a9e320f3d5ed31556f39c8167578e37dd619001ea877ff799625dce61
strip-components: 1
dest: rust-nightly/rustc
- type: archive
url: https://static.rust-lang.org/dist/cargo-nightly-x86_64-unknown-linux-gnu.tar.xz
sha256: c5421d7fad5e5c3596ba6c0748e4441a87deb237a56e1ef7c1551c0dc93dd3cd
sha256: 7261220eb1b693e9f9fccac50a59ba17e69c2aa7e4d8767a6d283dfc06c87455
strip-components: 1
dest: rust-nightly/cargo
- type: archive
url: https://static.rust-lang.org/dist/rust-std-nightly-x86_64-unknown-linux-gnu.tar.xz
sha256: d590f515075c54918d48cb16c77677633b5a5245e4055655fdc82c1ab7983f13
sha256: 42925c20ba01b3b530ba43724eecb5b9604a9def21852894f9e75e2c0bc5fafa
strip-components: 1
dest: rust-nightly/rust-std
- type: archive
@@ -15740,8 +15739,6 @@ modules:
- echo "droplet-rs = { path = \"$PWD/cargo/vendor/droplet-rs\" }" >> .cargo/config.toml
- echo '[patch."https://github.com/Drop-OSS/native_model"]' >> .cargo/config.toml
- echo "native_model = { path = \"$PWD/cargo/vendor/native_model\" }" >> .cargo/config.toml
- sed -i 's/"tray-icon",\?\s*//g' src-tauri/Cargo.toml
- python3 flatpak-patches/patch-tray-icon.py src-tauri/src/lib.rs
- ln -sf /app/share/drop-frontend .output
- cd src-tauri && cargo build --release
- cd ..
+4 -2
View File
@@ -43,8 +43,8 @@ module_count=$(python3 -c "
import yaml, sys
with open('$MANIFEST') as f:
data = yaml.safe_load(f)
modules = data['modules']
print(len(modules))
named_modules = [m for m in data['modules'] if isinstance(m, dict) and 'name' in m]
print(len(named_modules))
")
check "Manifest has 3 modules" "[ \"$module_count\" -eq 3 ]"
@@ -53,6 +53,8 @@ import yaml, sys
with open('$MANIFEST') as f:
data = yaml.safe_load(f)
for mod in data['modules']:
if not isinstance(mod, dict):
continue
cmds = mod.get('build-commands', [])
has_set_eu = any(c.strip() == 'set -eu' for c in cmds)
print(f\"{mod['name']}: set-eu={'yes' if has_set_eu else 'NO'}\")
+22 -5
View File
@@ -1,8 +1,8 @@
#!/usr/bin/env bash
set -euo pipefail
# verify-s01-build.sh — T03 verification: build the Flatpak and verify launch
# Invokes flatpak-builder via org.flatpak.Builder Flatpak
# verify-s01-build.sh — Build verification: 7 checks for Flatpak build integrity
# Handles both local (with D-Bus) and CI/headless (no D-Bus) environments.
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
@@ -11,10 +11,22 @@ MANIFEST="$PROJECT_DIR/org.droposs.client.yml"
APP_ID="org.droposs.client"
BINARY_NAME="drop-app"
FLATPAK_BUILDER="flatpak run --share=network org.flatpak.Builder"
APPSTREAMCLI="appstreamcli"
DESKTOP_FILE_VALIDATE="desktop-file-validate"
# Detect headless environment (no display + no D-Bus)
IS_HEADLESS=0
if [ -z "${DISPLAY:-}" ] && [ -z "${DBUS_SESSION_BUS_ADDRESS:-}" ]; then
IS_HEADLESS=1
fi
if [ "$IS_HEADLESS" -eq 1 ]; then
FLATPAK_BUILDER="flatpak-builder"
echo "headless detected — using raw flatpak-builder (no D-Bus wrapper)"
else
FLATPAK_BUILDER="flatpak run --share=network org.flatpak.Builder"
fi
# Tool-availability guards for non-build checks
for tool_cmd in "$APPSTREAMCLI" "$DESKTOP_FILE_VALIDATE"; do
if ! command -v "$tool_cmd" &>/dev/null; then
@@ -45,7 +57,7 @@ fail() {
}
echo "============================================"
echo "verify-s01-build.sh — T03 Build Verification"
echo "verify-s01-build.sh — Build Verification"
echo "============================================"
echo ""
@@ -122,9 +134,13 @@ else
fail "metadata file not found at $METADATA_FILE"
fi
# Step 4: Smoke test — launch with --help
# Step 4: Smoke test — launch with --help (skip in headless, needs D-Bus)
echo ""
echo "--- Step 4: Smoke test (launch with --help) ---"
if [ "$IS_HEADLESS" -eq 1 ]; then
echo "headless environment — skipping smoke test (requires D-Bus)"
pass "smoke test: skipped in headless (requires D-Bus)"
else
if ${FLATPAK_BUILDER} --run "$BUILD_DIR" "$MANIFEST" "$BINARY_NAME" --help 2>&1; then
SMOKE_EXIT=$?
echo ""
@@ -148,6 +164,7 @@ else
pass "smoke test: drop-app --help ran without missing-library or segfault (exit $SMOKE_EXIT)"
fi
fi
fi # close the headless skip gate for smoke test
# Step 5: AppStream metadata validation
echo ""
+1
Submodule shared-modules added at c57634787a
+27 -10
View File
@@ -18,6 +18,11 @@ import yaml
MANIFEST_PATH = "org.droposs.client.yml"
EXPECTED_MODULE_NAMES = ["drop-app-bootstrap", "drop-app-nuxt", "drop-app-rust"]
# libappindicator is included as a path reference (string), not a named module dict.
# It expands to ~4 sub-modules at build time. When counted in the YAML source:
# 3 named modules (bootstrap, nuxt, rust) + 1 path include (libappindicator) = 4 entries.
EXPECTED_MODULE_COUNT_NO_LIBAPPINDICATOR = 3
EXPECTED_MODULE_COUNT_WITH_LIBAPPINDICATOR = 4
def checksum_key(source: dict) -> str:
@@ -58,14 +63,23 @@ def main():
# 2. Check modules exist
modules = manifest.get("modules", [])
if len(modules) != 3:
errors.append(f"Expected 3 modules, found {len(modules)}")
# Separate named modules from path includes
named_modules = [m for m in modules if isinstance(m, dict) and "name" in m]
path_includes = [m for m in modules if isinstance(m, str)]
if len(named_modules) != EXPECTED_MODULE_COUNT_NO_LIBAPPINDICATOR:
errors.append(f"Expected {EXPECTED_MODULE_COUNT_NO_LIBAPPINDICATOR} named modules, found {len(named_modules)}")
if len(path_includes) != 1:
errors.append(f"Expected 1 path include (libappindicator), found {len(path_includes)}: {path_includes}")
elif not any("libappindicator" in str(p) for p in path_includes):
errors.append(f"Expected libappindicator path include, found: {path_includes}")
actual_names = [m.get("name", "<unnamed>") for m in modules]
actual_names = [m.get("name", "<unnamed>") for m in named_modules]
# 3. Check module names
for i, expected_name in enumerate(EXPECTED_MODULE_NAMES):
if i >= len(modules):
if i >= len(named_modules):
errors.append(f"Missing module: {expected_name}")
elif actual_names[i] != expected_name:
errors.append(
@@ -73,10 +87,10 @@ def main():
)
if not errors:
print(f"Exactly 3 modules with correct names: {', '.join(actual_names)}")
print(f"3 named modules: {', '.join(actual_names)} + libappindicator path include")
# 4. Check each module has sources and build-commands
for mod in modules:
# 4. Check each named module has sources and build-commands
for mod in named_modules:
name = mod.get("name", "<unnamed>")
sources = mod.get("sources", [])
cmds = mod.get("build-commands", [])
@@ -88,7 +102,7 @@ def main():
# 5. Verify checksums — archive sources use sha256 (64 hex chars), file sources may use sha512 (128 hex chars) or sha256
sha_violations = []
for mod in modules:
for mod in named_modules:
name = mod.get("name", "?")
for src in mod.get("sources", []):
t = src.get("type", "")
@@ -101,6 +115,9 @@ def main():
f" {name} archive: {url[:80]} → neither sha256 nor sha512 is valid"
)
elif t == "file":
# Local files (no url) are git-tracked — skip checksum requirement
if not url:
continue
sha256 = src.get("sha256", "")
sha512 = src.get("sha512", "")
if (not sha256 or len(sha256) != 64) and (not sha512 or len(sha512) != 128):
@@ -119,8 +136,8 @@ def main():
else:
print("✅ All archive sources have valid sha256 or sha512; file sources have valid sha256 or sha512")
# 6. Verify build-options.append-path exists on each module
for mod in modules:
# 6. Verify build-options.append-path exists on each named module
for mod in named_modules:
name = mod.get("name", "?")
bo = mod.get("build-options", {})
ap = bo.get("append-path", "")