aboutsummaryrefslogtreecommitdiff
path: root/docker
Commit message (Collapse)AuthorAgeFilesLines
...
* Replace Python plugins with native C++ .so, remove bundled Python (~95MB)SulfurNitride2026-03-122-167/+26
| | | | | | | | | | | | | | - Add native plugins: form43_checker, script_extender_checker, preview_dds, basic_games (75 game defs via IPluginProxy pattern with Steam/GOG detection) - Remove portable Python from Dockerfile and build-inner.sh - Add Python settings tab with venv support (system python3 + PyQt6) - Skip loading plugin_python.so when Python disabled (default: off) - Update pythonrunner.cpp to use venv at ~/.local/share/fluorine/python-venv/ - Preserve real file permissions in FUSE VFS (fixes native executable +x bits) - Add FUSE_SET_ATTR_MODE handler so chmod works through VFS - Fix desktop shortcut Exec= to use fluorine-manager launcher, not bare binary Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix tracked writes false positives, stale entries, portability, and launcher ↵SulfurNitride2026-03-111-9/+15
| | | | | | | | | | | | | | | | self-destruct - Remove initialScan() from mount and unmount — its heuristic ("file exists in both overwrite and a mod") caused false-positive tracking of game-generated config files. Tracking now only happens through explicit UI actions or snapshot-based detectManualMoves(). - Prune stale tracked entries on load when mod folder no longer exists on disk. - Store mod paths as relative (to JSON file parent) for instance portability; legacy absolute paths auto-migrate on next save. - Guard launcher sync against HERE==BIN_DST to prevent rm -rf self-destruct when running directly from ~/.local/share/fluorine/bin/. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Remove FUSE passthrough, flake.nix, and stop archiving build outputSulfurNitride2026-03-111-18/+9
| | | | | | | | | | | | | FUSE passthrough caused Wine DLL loading failures (ERROR_NOACCESS 0x3E6) for all file types, not just executables. Root cause is a kernel-level incompatibility between FUSE passthrough I/O and Wine's file access patterns. Removed all passthrough code, the passthrough helper binary, libcap dependency, and the settings UI toggle. Also removed flake.nix (unused with Docker build system) and stopped tar.gz'ing the build output since GitHub zips release assets automatically. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Check CAP_SYS_ADMIN at runtime before negotiating FUSE passthroughSulfurNitride2026-03-112-1/+10
| | | | | | | | | Negotiating passthrough without the capability caused Wine/Proton DLL loading failures (SKSE plugins returning error 0x36). Now checks the process's effective capability set via libcap before telling the kernel we want passthrough. Also adds qt.conf for AT_SECURE compatibility. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix RPATH patching for .so.* files (libproxy.so.1, libpxbackend)SulfurNitride2026-03-111-1/+1
| | | | | | | The find glob only matched *.so, missing versioned shared libraries like libproxy.so.1 which retained hardcoded Docker build paths. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix FUSE passthrough: use proper API, drop LD_LIBRARY_PATH, auto-apply capSulfurNitride2026-03-111-1/+4
| | | | | | | | | | | | | | | | - Use fuse_passthrough_open/close API instead of raw fd assignment to fi->backing_id, which caused EIO on every file open through the VFS - Remove LD_LIBRARY_PATH from launcher script — DT_RPATH handles lib resolution, and LD_LIBRARY_PATH triggers AT_SECURE which drops file capabilities (cap_sys_admin) needed for passthrough - Auto-detect missing cap_sys_admin at mount time and prompt via pkexec to re-apply it (handles binary copy/update/extract losing the cap) - Disable passthrough for session if fuse_passthrough_open fails, avoiding "Operation not permitted" spam in terminal - Fix Nix flake: tinyxml2 → tinyxml-2, xorg.lib* → top-level names - CI: eliminate artifact zip round-trip for GitHub releases Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Sync entire app to ~/.local/share/fluorine/bin/ for stable symlinksSulfurNitride2026-03-111-23/+27
| | | | | | | | | The launcher now deploys the full application (not just Python) to the central data directory on launch. Instance plugin symlinks always point to this stable location instead of the tarball extraction dir, so they survive moves/deletes of the original archive. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* FUSE VFS performance, tracked writes fix, remove steam-run, add NixOS flakeSulfurNitride2026-03-112-128/+274
| | | | | | | | | | | | | - FUSE: disable AUTO_INVAL_DATA, enable readdirplus, 24h TTLs, clone_fd, FUSE_USE_VERSION=312 — cuts game load time from 2:40 to 1:57 - Fix tracked writes going to wrong (lower-priority) mod in both detectManualMoves and syncOverwrite - Remove steam-run entirely (UI, C++, Rust layers) - Build system: default to tarball, add installer/appimage as opt-in modes - Add flake.nix for NixOS — builds from source with Rust crates as separate pure derivations, FHS wrapper, NixOS module with FUSE passthrough Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Replace lootcli with standalone LOOT GUI AppImage on LinuxSulfurNitride2026-03-071-0/+1
| | | | | | | | | | | | | | | - Download LOOT AppImage from GitHub releases on first sort - Pre-seed LOOT settings.toml with game type, path, and masterlist URL - Mount FUSE VFS before launching LOOT, unmount after exit - Copy plugins.txt/loadorder.txt to LOOT local path and back - Fix VFS file timestamps (separate error_code for mtime) - Add directory timestamps to FUSE (was showing 1969) - Stamp plugin files with load-order-based incrementing timestamps - Remove WebEngine dependency on Linux (QTextBrowser fallback) - Enable LOOT sorting for FalloutNV and FalloutTTW - Add unmountVFS() to OrganizerCore Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix SVG icons and checkboxes: bundle qt6-svg-pluginsSulfurNitride2026-02-271-0/+1
| | | | | | | | | | The AppImage was missing libqsvg.so (Qt SVG imageformat plugin), causing SVG-based theme icons and checkboxes to render as blank squares. Add qt6-svg-dev and qt6-svg-plugins to the Docker image. Also add explicit unchecked checkbox images to all vs15 Dark themes for consistent rendering on Linux. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix log copy truncation, enable ccache for build cacheSulfurNitride2026-02-251-0/+6
| | | | | | | | | | | | | | | Fix "Copy all" log truncation: the code unconditionally stripped 2 chars (\r\n) from formatted log messages, but on Linux spdlog only appends \n. Every log message lost its last real character. Now strips trailing \r and \n dynamically. Enable ccache: it was installed in the Docker image but never activated. build-inner.sh now auto-detects ccache and sets CMAKE_*_COMPILER_LAUNCHER. build.sh mounts a persistent ccache volume (~/.cache/fluorine-ccache) into the container. CI workflow uses actions/cache to persist ccache across runs. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Remove umu-run, keep game as child process for Steam trackingSulfurNitride2026-02-232-4/+6
| | | | | | | | | | | | | | | - Remove umu-run entirely (crashed due to pressure-vessel/FUSE incompatibility) — use raw `proton run` instead - Replace startDetached() with QProcess::start() so the game stays in Fluorine's process tree. This lets Steam track the game lifetime and makes the "close game" button work when Fluorine is added as a non-Steam game. - Add writeIniValueDirect/readIniValueDirect for safe Bethesda INI handling without QSettings corruption - Fix prefix_setup.rs to skip umu-run bootstrapping - Clean up settings UI, build scripts, and docs for umu-run removal Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix CI: use Docker build like build.sh, fix GHCR uppercase tagSulfurNitride2026-02-231-1/+10
| | | | | | | | | | The CI was failing because ghcr.io/SulfurNitride/fluorine-builder had uppercase letters (GHCR requires lowercase). Instead of depending on a pre-built GHCR image, CI now builds the Docker image from the Dockerfile each run (matching build.sh), with registry-based layer caching for speed. Also removes the duplicated inline AppImage logic in favor of build-inner.sh. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix AppImage plugin loading, save timestamps, and INI corruptionSulfurNitride2026-02-201-64/+121
| | | | | | | | | | | | | | | | | | - Add AppConfig::pluginsPath()/dllsPath() that respect MO2_PLUGINS_DIR and MO2_DLLS_DIR env vars, fixing plugin discovery when plugins live inside read-only AppImage squashfs (#22, game plugin not found errors) - Preserve file modification times in save deploy/sync so games display correct save timestamps instead of all showing the same time (#17) - Replace QSettings INI reader in saves tab with direct line-by-line parser to avoid backslash-as-line-continuation corruption of sLocalSavePath=__MO_Saves\ (#22, saves tab showing wrong directory) - Add diagnostic logging to plugin symlink creation, save backup/restore operations to help diagnose silent failures through prefix symlinks - Fix Python SONAME mismatch in AppImage build (patch portable Python SONAME to match librunner.so DT_NEEDED, preventing dual libpython load) - Bundle PyQt6 Qt dependencies, improve RPATH for lib/ and plugins/ Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Add Python init diagnostics, AppImage build system, misc Linux fixesSulfurNitride2026-02-192-50/+230
| | | | | | | | | | | | | | | | | | | | - python: switch Py_InitializeEx → Py_InitializeFromConfig for explicit error reporting; add dladdr + fprintf diagnostics to trace which DSO Python symbols resolve to and whether Py_IsInitialized succeeds - python: log RTLD_NOLOAD vs fresh-load outcome when promoting libpython to RTLD_GLOBAL - build: add Docker-based AppImage build script (build.sh), update Dockerfile and build-inner.sh for AppImage-only workflow - build: remove Flatpak support entirely; move AppImage metadata (desktop/metainfo/icon) from flatpak/ to data/ - Add Monster Hunter Wilds basic_games plugin - .gitignore: exclude squashfs-root, build-source, flatpak-repo, __pycache__, fomod-plus-settings.ini - Various Linux port fixes across wineprefix, processrunner, proton launcher, FUSE connector, instance manager, download manager, sanitychecks, and NaK Rust paths/runtime_wrap Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* Replace Python build deps with uv across all build pathsSulfurNitride2026-02-152-36/+24
| | | | | | | | | | | | | | | | | Use uv as the single Python package manager for Docker, source, and Flatpak builds. Python 3.13 and pybind11==2.13.6 are now consistent across all three paths. - Docker: install uv + build venv instead of python3-dev/pip/pybind11-dev - CMake: bootstrap pyvenv with uv (REQUIRED/FATAL_ERROR) when no explicit Python provided; pin pybind11==2.13.6, add sip - Flatpak: remove pybind11 cmake module, use uv pip install --target for build deps, uv for portable Python packages - build-inner.sh: use BUILD_PY throughout, uv pip install for portable runtime packages, simplify embed check to direct Python invocation - VFS helper: fall back to shared libfuse3 when static .a unavailable Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix RPATH, absolute instance paths, Proton symlink matching, umu-run ↵SulfurNitride2026-02-151-0/+6
| | | | | | | | | | | | | | | | logging, pybind11 warning - Set $ORIGIN-relative RPATH on binaries so they find libs without LD_LIBRARY_PATH (fixes #12) - Check QDir::isAbsolutePath before concatenating instance paths to prevent doubling of custom portable paths - Canonicalize paths when matching Proton installations to handle symlinks in /usr/share/steam/compatibilitytools.d/ (fixes #8) - Add diagnostic logging for umu-run resolution showing preference, bundled/system paths, and final selection (helps diagnose #8) - Warn at CMake time if pybind11 >= 2.14 is detected (documents #9) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Migrate data paths to ~/.local/share/fluorine/, add native build, fix ↵SulfurNitride2026-02-142-16/+10
| | | | | | | | | | | | | | | | | | | | | | | | %command% and system Proton scanning - All data paths migrated from ~/.var/app/com.fluorine.manager/ to ~/.local/share/fluorine/ so native and Flatpak builds share the same instances, plugins, and configs - New fluorinepaths.h/.cpp with fluorineDataDir() helper and one-time migration from old path (writes MOVED.txt breadcrumb) - New libs/nak/src/paths.rs as Rust equivalent (data_dir()) - Strip %command% tokens from launch wrapper in protonlauncher.cpp - Always scan /usr/share/steam/compatibilitytools.d/ for system Proton packages (Arch installs Proton there); add Flatpak filesystem permission - Native build (build-native.sh) installs to ~/.local/share/fluorine/ with desktop entry and ~/.local/bin symlink instead of portable zip - build-flatpak.sh wrapper for Flatpak builds - Fix container locale (LANG=C.UTF-8) for AutoUic warnings - Fix prefixExists() to handle both compatdata and pfx directory layouts - Fix globalInstancesRootPath() to use fluorineDataDir() on Linux - Fix umu-run Flatpak lookup to use fluorineDataDir() - Update README with build instructions and Arch dependency list Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Add Root Builder plugin, Linux game detection, and OMOD installer fixSulfurNitride2026-02-111-0/+5
| | | | | | | | | | | | | | | | | | | | | - New native Root Builder plugin (src/plugins/rootbuilder.py) with copy and symlink deploy modes, auto-deploy hooks, backup/restore, and third-party conflict detection that moves incompatible plugins to DisabledPlugins/. In link mode, .exe/.dll are always copied to avoid Wine/Proton path resolution issues with symlinked executables. - Fix basic_games detection on Linux: steam_utils now checks native Steam paths (~/.local/share/Steam, Flatpak, Snap), epic_utils uses correct Linux Heroic config paths, gog_utils falls back to Heroic GOG installed.json when Windows registry is unavailable. - Fix OMOD installer crash: isArchiveSupported now handles both IFileTree (from mod list refresh) and string (from install check) arguments. - Add flatpak manifest step to copy source-tree Python plugins (src/plugins/*.py) into the build output. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fluorine Manager: full Linux port of Mod Organizer 2SulfurNitride2026-02-113-0/+519
Complete native Linux port with FUSE-based virtual filesystem, Proton/umu-run integration, and Flatpak packaging. Key features: - FUSE VFS replacing Windows USVFS (in-process + standalone helper for Flatpak) - Proton/GE-Proton/umu-run launcher with env var forwarding - Flatpak support (sandbox-aware VFS, NXM handler, umu-run) - Wine prefix management UI - Case-insensitive path resolution for Linux filesystems - QSettings-safe INI handling (avoids Bethesda INI corruption) - Portable instance support with auto-generated launcher scripts Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>