From 57bf9d5fb1dae5f17e69581f6cf398541ceb6728 Mon Sep 17 00:00:00 2001 From: Youwes09 Date: Fri, 20 Mar 2026 21:07:19 -0500 Subject: [PATCH] Fix: Attempt #1 Windows Workflow --- .github/workflows/build-windows.yml | 45 +++++++++-------------------- src-tauri/capabilities/default.json | 4 ++- src-tauri/src/lib.rs | 33 +++++++++------------ src-tauri/tauri.conf.json | 13 +++++++-- 4 files changed, 40 insertions(+), 55 deletions(-) diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index f2229c5..5b26a0b 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -4,7 +4,7 @@ on: workflow_dispatch: inputs: version: - description: "Version to build (e.g. 0.3.0)" + description: "Version to build (e.g. 0.4.0)" required: true jobs: @@ -81,58 +81,39 @@ jobs: echo "ab6687d278e0dd0984f67abbc853511a7e764f84b126a35d09bfd9b0307321ff suwayomi-windows.zip" | sha256sum -c - - unzip -q suwayomi-windows.zip -d suwayomi-extracted-raw + unzip -q suwayomi-windows.zip -d suwayomi-raw - # Detect whether the zip has a single top-level directory wrapper. - # If exactly one entry exists at depth-1 and it is a directory, strip it. - TOP_DIRS=$(find suwayomi-extracted-raw -mindepth 1 -maxdepth 1 -type d) - TOP_FILES=$(find suwayomi-extracted-raw -mindepth 1 -maxdepth 1 -type f) + TOP_DIRS=$(find suwayomi-raw -mindepth 1 -maxdepth 1 -type d) + TOP_FILES=$(find suwayomi-raw -mindepth 1 -maxdepth 1 -type f) TOP_DIR_COUNT=$(echo "$TOP_DIRS" | grep -c . || true) mkdir -p suwayomi-extracted if [ "$TOP_DIR_COUNT" -eq 1 ] && [ -z "$TOP_FILES" ]; then - # Single wrapping directory — strip it mv "$TOP_DIRS"/* suwayomi-extracted/ else - # Files already at root level — move everything as-is - mv suwayomi-extracted-raw/* suwayomi-extracted/ + mv suwayomi-raw/* suwayomi-extracted/ fi - - name: Inspect Suwayomi launcher - shell: bash - run: | - echo "=== Top-level contents ===" - ls -la suwayomi-extracted/ - echo "=== All .exe files ===" - find suwayomi-extracted -name "*.exe" | head -20 - echo "=== All .cmd/.bat files ===" - find suwayomi-extracted -name "*.cmd" -o -name "*.bat" | head -20 - - - name: Stage Suwayomi sidecar + - name: Stage Suwayomi bundle shell: bash run: | mkdir -p src-tauri/binaries - # The Windows bundle has no standalone launcher exe — it ships - # "Suwayomi Launcher.bat" which calls jre\bin\javaw.exe -jar Suwayomi-Launcher.jar. - # Tauri sidecars must be real executables, so we stage javaw.exe as the - # sidecar. lib.rs will invoke it with the correct -jar + working-dir args. JAVAW=$(find suwayomi-extracted -path "*/jre/bin/javaw.exe" | head -1) if [ -z "$JAVAW" ]; then - echo "ERROR: could not find jre/bin/javaw.exe" - ls -lR suwayomi-extracted/ + echo "ERROR: could not find jre/bin/javaw.exe — bundle contents:" + find suwayomi-extracted -type f | head -40 exit 1 fi - echo "Using javaw: $JAVAW" - cp "$JAVAW" "src-tauri/binaries/suwayomi-server-x86_64-pc-windows-msvc.exe" + echo "Found javaw: $JAVAW" - # Copy the full bundle so the .jar and jre/ tree are available at runtime. - # lib.rs sets the working directory to this folder before spawning. + # Copy full bundle so jar + jre tree are available at runtime. + # lib.rs looks for suwayomi-bundle/jre/bin/javaw.exe in the resource dir. cp -r suwayomi-extracted src-tauri/binaries/suwayomi-bundle - - name: Patch tauri.conf.json for CI + - name: Suppress frontend rebuild shell: bash run: | sed -i 's/"beforeBuildCommand": "pnpm build"/"beforeBuildCommand": ""/' src-tauri/tauri.conf.json @@ -149,4 +130,4 @@ jobs: with: name: moku-windows-x64 path: src-tauri/target/x86_64-pc-windows-msvc/release/bundle/nsis/*.exe - retention-days: 7 \ No newline at end of file + retention-days: 7 diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json index 75da45d..25fe530 100644 --- a/src-tauri/capabilities/default.json +++ b/src-tauri/capabilities/default.json @@ -14,7 +14,9 @@ { "name": "suwayomi-server" }, { "name": "suwayomi-server-aarch64-apple-darwin" }, { "name": "suwayomi-server-x86_64-apple-darwin" }, - { "name": "javaw" } + { "name": "javaw", "args": true }, + { "name": "which" }, + { "name": "where" } ] } ] diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 7d966d1..566372c 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -247,25 +247,20 @@ fn resolve_server_binary( } // Fall back to PATH — covers Nix, distro packages, and any system install. - { - #[cfg(target_os = "windows")] - let which_cmd = "where"; - #[cfg(not(target_os = "windows"))] - let which_cmd = "which"; - - for name in &["tachidesk-server", "suwayomi-server"] { - if std::process::Command::new(which_cmd) - .arg(name) - .output() - .map(|o| o.status.success()) - .unwrap_or(false) - { - return Ok(ServerInvocation { - bin: std::ffi::OsString::from(name), - prefix_args: vec![], - working_dir: None, - }); - } + // Windows always hits the early return above so this block is Linux/macOS only. + #[cfg(not(target_os = "windows"))] + for name in &["tachidesk-server", "suwayomi-server"] { + if std::process::Command::new("which") + .arg(name) + .output() + .map(|o| o.status.success()) + .unwrap_or(false) + { + return Ok(ServerInvocation { + bin: std::ffi::OsString::from(name), + prefix_args: vec![], + working_dir: None, + }); } } diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index a637166..dcf6b16 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -26,7 +26,11 @@ }, "bundle": { "active": true, - "targets": ["appimage", "nsis", "deb"], + "targets": [ + "appimage", + "nsis", + "deb" + ], "icon": [ "icons/32x32.png", "icons/128x128.png", @@ -40,11 +44,14 @@ "installerIcon": "icons/icon.ico", "installMode": "currentUser" } - } + }, + "resources": [ + "binaries/suwayomi-bundle/**" + ] }, "plugins": { "shell": { "open": true } } -} +} \ No newline at end of file