Sync from development - prepare for v0.5.0.2

This commit is contained in:
Omni
2026-03-15 11:03:28 +00:00
parent c294431a35
commit e52e1427f6
48 changed files with 348 additions and 256 deletions
+7
View File
@@ -1,5 +1,12 @@
# Jackify Changelog # Jackify Changelog
## v0.5.0.2 - Hotfix
**Release Date:** 15/03/26
- Disk space warning at install start is no longer a hard block. If the pre-flight check fires before any download or install progress has started, Jackify now shows a warning dialog with the required and available space, a note that modlist updates typically need far less space than a fresh install, and a "Continue Anyway" option. Cancelling still aborts normally.
- Engine: fixed a false-positive in the pre-flight filename length check that could incorrectly trigger on modlist paths using backslash separators.
- Engine: temp folder cleanup at the end of install no longer crashes an otherwise successful installation if a BSA or temp directory is still locked.
## v0.5.0.1 - Hotfix ## v0.5.0.1 - Hotfix
**Release Date:** 13/03/26 **Release Date:** 13/03/26
+1 -1
View File
@@ -5,4 +5,4 @@ This package provides both CLI and GUI interfaces for managing
Wabbajack modlists natively on Linux systems. Wabbajack modlists natively on Linux systems.
""" """
__version__ = "0.5.0.1" __version__ = "0.5.0.2"
@@ -50,20 +50,10 @@ class ModlistConfigurationMixin:
return True return True
def _execute_configuration_steps(self, status_callback=None, manual_steps_completed=False, skip_manual_for_existing=False): def _execute_configuration_steps(self, status_callback=None, manual_steps_completed=False, skip_manual_for_existing=False):
""" """Run the configuration steps for the selected modlist."""
Runs the actual configuration steps for the selected modlist.
Args:
status_callback (callable, optional): A function to call with status updates during configuration.
manual_steps_completed (bool): If True, skip the manual steps prompt (used for new modlist flow).
skip_manual_for_existing (bool): If True, always skip manual steps (for existing modlists that are already configured).
"""
try: try:
# Store status_callback for Configuration Summary
self._current_status_callback = status_callback self._current_status_callback = status_callback
self.logger.info("Executing configuration steps...") self.logger.info("Executing configuration steps...")
# Ensure required context is set
if not all([self.modlist_dir, self.appid, self.game_var, self.steamdeck is not None]): if not all([self.modlist_dir, self.appid, self.game_var, self.steamdeck is not None]):
self.logger.error("Cannot execute configuration steps: Missing required context (modlist_dir, appid, game_var, steamdeck status).") self.logger.error("Cannot execute configuration steps: Missing required context (modlist_dir, appid, game_var, steamdeck status).")
self.logger.error("Missing required information to start configuration.") self.logger.error("Missing required information to start configuration.")
@@ -89,14 +79,10 @@ class ModlistConfigurationMixin:
return False # Abort on failure return False # Abort on failure
self.logger.info("Step 1: Setting Protontricks permissions... Done") self.logger.info("Step 1: Setting Protontricks permissions... Done")
# Step 2: Prompt user for manual steps and wait for compatdata
skip_manual_prompt = skip_manual_for_existing # Existing modlists skip manual steps skip_manual_prompt = skip_manual_for_existing # Existing modlists skip manual steps
if not manual_steps_completed and not skip_manual_for_existing: if not manual_steps_completed and not skip_manual_for_existing:
# Check if Proton Experimental is already set and compatdata exists
proton_ok = False proton_ok = False
compatdata_ok = False compatdata_ok = False
# Check Proton version
self.logger.debug(f"[MANUAL STEPS DEBUG] Checking Proton version for AppID {self.appid}") self.logger.debug(f"[MANUAL STEPS DEBUG] Checking Proton version for AppID {self.appid}")
if self._detect_proton_version(): if self._detect_proton_version():
self.logger.debug(f"[MANUAL STEPS DEBUG] Detected Proton version: {self.proton_ver}") self.logger.debug(f"[MANUAL STEPS DEBUG] Detected Proton version: {self.proton_ver}")
@@ -106,7 +92,6 @@ class ModlistConfigurationMixin:
else: else:
self.logger.debug("[MANUAL STEPS DEBUG] Could not detect Proton version") self.logger.debug("[MANUAL STEPS DEBUG] Could not detect Proton version")
# Check compatdata/prefix
prefix_path_str = self.path_handler.find_compat_data(str(self.appid)) prefix_path_str = self.path_handler.find_compat_data(str(self.appid))
self.logger.debug(f"[MANUAL STEPS DEBUG] Compatdata path search result: {prefix_path_str}") self.logger.debug(f"[MANUAL STEPS DEBUG] Compatdata path search result: {prefix_path_str}")
@@ -173,6 +158,24 @@ class ModlistConfigurationMixin:
self.logger.error(f"Failed to download or apply curated user.reg.modlist or system.reg.modlist: {e}") self.logger.error(f"Failed to download or apply curated user.reg.modlist or system.reg.modlist: {e}")
self.logger.error(f"Failed to download or apply curated user.reg.modlist or system.reg.modlist. {e}") self.logger.error(f"Failed to download or apply curated user.reg.modlist or system.reg.modlist. {e}")
return False return False
special_game_type = self.detect_special_game_type(self.modlist_dir)
if special_game_type in ["fnv", "fo3", "enderal"]:
self.logger.info(
"Re-injecting %s game registry entries after curated registry overwrite",
special_game_type.upper(),
)
try:
from jackify.backend.services.automated_prefix_service import AutomatedPrefixService
AutomatedPrefixService()._inject_game_registry_entries(prefix_path_str, special_game_type)
except Exception as e:
self.logger.error(
"Failed to restore %s registry entries after curated registry overwrite: %s",
special_game_type.upper(),
e,
)
self.logger.error("Could not restore required game registry entries after applying curated registry files.")
return False
self.logger.info("Step 3: Curated user.reg.modlist and system.reg.modlist applied successfully.") self.logger.info("Step 3: Curated user.reg.modlist and system.reg.modlist applied successfully.")
# Step 4: Install Wine Components # Step 4: Install Wine Components
@@ -543,9 +546,7 @@ class ModlistConfigurationMixin:
status_callback("") # Blank line after final Prefix Configuration step status_callback("") # Blank line after final Prefix Configuration step
self.logger.info("Step 12: Checking for modlist-specific steps...") self.logger.info("Step 12: Checking for modlist-specific steps...")
# Step 13: Launch options for special games are now set during automated prefix workflow (before Steam restart) # Step 13: Launch options for special games are now set during automated workflow
# Avoids a second Steam restart
special_game_type = self.detect_special_game_type(self.modlist_dir)
if special_game_type: if special_game_type:
self.logger.info(f"Step 13: Launch options for {special_game_type.upper()} were set during automated workflow") self.logger.info(f"Step 13: Launch options for {special_game_type.upper()} were set during automated workflow")
else: else:
@@ -568,18 +569,12 @@ class ModlistConfigurationMixin:
return True # Return True on success return True # Return True on success
def run_modlist_configuration_phase(self, context: dict = None) -> bool: def run_modlist_configuration_phase(self, context: dict = None) -> bool:
""" """Run the full modlist configuration sequence."""
Main entry point to run the full modlist configuration sequence.
This orchestrates all the individual steps.
"""
self.logger.info(f"Starting configuration phase for modlist: {self.game_name}") self.logger.info(f"Starting configuration phase for modlist: {self.game_name}")
# Call the private method that contains the actual steps
# Pass along the status_callback if it was provided in the context
status_callback = context.get('status_callback') if context else None status_callback = context.get('status_callback') if context else None
return self._execute_configuration_steps(status_callback=status_callback) return self._execute_configuration_steps(status_callback=status_callback)
def _prompt_or_set_resolution(self): def _prompt_or_set_resolution(self):
# If on Steam Deck, set 1280x800 automatically
if self._is_steam_deck(): if self._is_steam_deck():
self.selected_resolution = "1280x800" self.selected_resolution = "1280x800"
self.logger.info("Steam Deck detected: setting resolution to 1280x800.") self.logger.info("Steam Deck detected: setting resolution to 1280x800.")
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+226 -226
View File
@@ -7,7 +7,7 @@
"targets": { "targets": {
".NETCoreApp,Version=v8.0": {}, ".NETCoreApp,Version=v8.0": {},
".NETCoreApp,Version=v8.0/linux-x64": { ".NETCoreApp,Version=v8.0/linux-x64": {
"jackify-engine/0.5.0": { "jackify-engine/0.5.1": {
"dependencies": { "dependencies": {
"Markdig": "0.40.0", "Markdig": "0.40.0",
"Microsoft.Extensions.Configuration.Json": "9.0.1", "Microsoft.Extensions.Configuration.Json": "9.0.1",
@@ -22,16 +22,16 @@
"SixLabors.ImageSharp": "3.1.6", "SixLabors.ImageSharp": "3.1.6",
"System.CommandLine": "2.0.0-beta4.22272.1", "System.CommandLine": "2.0.0-beta4.22272.1",
"System.CommandLine.NamingConventionBinder": "2.0.0-beta4.22272.1", "System.CommandLine.NamingConventionBinder": "2.0.0-beta4.22272.1",
"Wabbajack.CLI.Builder": "0.5.0", "Wabbajack.CLI.Builder": "0.5.1",
"Wabbajack.Downloaders.Bethesda": "0.5.0", "Wabbajack.Downloaders.Bethesda": "0.5.1",
"Wabbajack.Downloaders.Dispatcher": "0.5.0", "Wabbajack.Downloaders.Dispatcher": "0.5.1",
"Wabbajack.Hashing.xxHash64": "0.5.0", "Wabbajack.Hashing.xxHash64": "0.5.1",
"Wabbajack.Networking.Discord": "0.5.0", "Wabbajack.Networking.Discord": "0.5.1",
"Wabbajack.Networking.GitHub": "0.5.0", "Wabbajack.Networking.GitHub": "0.5.1",
"Wabbajack.Paths.IO": "0.5.0", "Wabbajack.Paths.IO": "0.5.1",
"Wabbajack.Server.Lib": "0.5.0", "Wabbajack.Server.Lib": "0.5.1",
"Wabbajack.Services.OSIntegrated": "0.5.0", "Wabbajack.Services.OSIntegrated": "0.5.1",
"Wabbajack.VFS": "0.5.0", "Wabbajack.VFS": "0.5.1",
"MegaApiClient": "1.0.0.0", "MegaApiClient": "1.0.0.0",
"runtimepack.Microsoft.NETCore.App.Runtime.linux-x64": "8.0.23" "runtimepack.Microsoft.NETCore.App.Runtime.linux-x64": "8.0.23"
}, },
@@ -1781,7 +1781,7 @@
} }
} }
}, },
"Wabbajack.CLI.Builder/0.5.0": { "Wabbajack.CLI.Builder/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.Configuration.Json": "9.0.1", "Microsoft.Extensions.Configuration.Json": "9.0.1",
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
@@ -1791,109 +1791,109 @@
"Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
"System.CommandLine": "2.0.0-beta4.22272.1", "System.CommandLine": "2.0.0-beta4.22272.1",
"System.CommandLine.NamingConventionBinder": "2.0.0-beta4.22272.1", "System.CommandLine.NamingConventionBinder": "2.0.0-beta4.22272.1",
"Wabbajack.Paths": "0.5.0" "Wabbajack.Paths": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.CLI.Builder.dll": {} "Wabbajack.CLI.Builder.dll": {}
} }
}, },
"Wabbajack.Common/0.5.0": { "Wabbajack.Common/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
"System.Reactive": "6.0.1", "System.Reactive": "6.0.1",
"Wabbajack.DTOs": "0.5.0", "Wabbajack.DTOs": "0.5.1",
"Wabbajack.Networking.Http": "0.5.0", "Wabbajack.Networking.Http": "0.5.1",
"Wabbajack.Paths.IO": "0.5.0" "Wabbajack.Paths.IO": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Common.dll": {} "Wabbajack.Common.dll": {}
} }
}, },
"Wabbajack.Compiler/0.5.0": { "Wabbajack.Compiler/0.5.1": {
"dependencies": { "dependencies": {
"F23.StringSimilarity": "6.0.0", "F23.StringSimilarity": "6.0.0",
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Newtonsoft.Json": "13.0.3", "Newtonsoft.Json": "13.0.3",
"SixLabors.ImageSharp": "3.1.6", "SixLabors.ImageSharp": "3.1.6",
"Wabbajack.Downloaders.Dispatcher": "0.5.0", "Wabbajack.Downloaders.Dispatcher": "0.5.1",
"Wabbajack.Installer": "0.5.0", "Wabbajack.Installer": "0.5.1",
"Wabbajack.VFS": "0.5.0", "Wabbajack.VFS": "0.5.1",
"ini-parser-netstandard": "2.5.2" "ini-parser-netstandard": "2.5.2"
}, },
"runtime": { "runtime": {
"Wabbajack.Compiler.dll": {} "Wabbajack.Compiler.dll": {}
} }
}, },
"Wabbajack.Compression.BSA/0.5.0": { "Wabbajack.Compression.BSA/0.5.1": {
"dependencies": { "dependencies": {
"K4os.Compression.LZ4.Streams": "1.3.8", "K4os.Compression.LZ4.Streams": "1.3.8",
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"SharpZipLib": "1.4.2", "SharpZipLib": "1.4.2",
"Wabbajack.Common": "0.5.0", "Wabbajack.Common": "0.5.1",
"Wabbajack.DTOs": "0.5.0" "Wabbajack.DTOs": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Compression.BSA.dll": {} "Wabbajack.Compression.BSA.dll": {}
} }
}, },
"Wabbajack.Compression.Zip/0.5.0": { "Wabbajack.Compression.Zip/0.5.1": {
"dependencies": { "dependencies": {
"Wabbajack.IO.Async": "0.5.0" "Wabbajack.IO.Async": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Compression.Zip.dll": {} "Wabbajack.Compression.Zip.dll": {}
} }
}, },
"Wabbajack.Configuration/0.5.0": { "Wabbajack.Configuration/0.5.1": {
"runtime": { "runtime": {
"Wabbajack.Configuration.dll": {} "Wabbajack.Configuration.dll": {}
} }
}, },
"Wabbajack.Downloaders.Bethesda/0.5.0": { "Wabbajack.Downloaders.Bethesda/0.5.1": {
"dependencies": { "dependencies": {
"LibAES-CTR": "1.1.0", "LibAES-CTR": "1.1.0",
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"SharpZipLib": "1.4.2", "SharpZipLib": "1.4.2",
"Wabbajack.Common": "0.5.0", "Wabbajack.Common": "0.5.1",
"Wabbajack.Downloaders.Interfaces": "0.5.0", "Wabbajack.Downloaders.Interfaces": "0.5.1",
"Wabbajack.Networking.BethesdaNet": "0.5.0" "Wabbajack.Networking.BethesdaNet": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Downloaders.Bethesda.dll": {} "Wabbajack.Downloaders.Bethesda.dll": {}
} }
}, },
"Wabbajack.Downloaders.Dispatcher/0.5.0": { "Wabbajack.Downloaders.Dispatcher/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
"Newtonsoft.Json": "13.0.3", "Newtonsoft.Json": "13.0.3",
"SixLabors.ImageSharp": "3.1.6", "SixLabors.ImageSharp": "3.1.6",
"Wabbajack.Downloaders.Bethesda": "0.5.0", "Wabbajack.Downloaders.Bethesda": "0.5.1",
"Wabbajack.Downloaders.GameFile": "0.5.0", "Wabbajack.Downloaders.GameFile": "0.5.1",
"Wabbajack.Downloaders.GoogleDrive": "0.5.0", "Wabbajack.Downloaders.GoogleDrive": "0.5.1",
"Wabbajack.Downloaders.Http": "0.5.0", "Wabbajack.Downloaders.Http": "0.5.1",
"Wabbajack.Downloaders.IPS4OAuth2Downloader": "0.5.0", "Wabbajack.Downloaders.IPS4OAuth2Downloader": "0.5.1",
"Wabbajack.Downloaders.Interfaces": "0.5.0", "Wabbajack.Downloaders.Interfaces": "0.5.1",
"Wabbajack.Downloaders.Manual": "0.5.0", "Wabbajack.Downloaders.Manual": "0.5.1",
"Wabbajack.Downloaders.MediaFire": "0.5.0", "Wabbajack.Downloaders.MediaFire": "0.5.1",
"Wabbajack.Downloaders.Mega": "0.5.0", "Wabbajack.Downloaders.Mega": "0.5.1",
"Wabbajack.Downloaders.ModDB": "0.5.0", "Wabbajack.Downloaders.ModDB": "0.5.1",
"Wabbajack.Downloaders.Nexus": "0.5.0", "Wabbajack.Downloaders.Nexus": "0.5.1",
"Wabbajack.Downloaders.VerificationCache": "0.5.0", "Wabbajack.Downloaders.VerificationCache": "0.5.1",
"Wabbajack.Downloaders.WabbajackCDN": "0.5.0", "Wabbajack.Downloaders.WabbajackCDN": "0.5.1",
"Wabbajack.Networking.WabbajackClientApi": "0.5.0" "Wabbajack.Networking.WabbajackClientApi": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Downloaders.Dispatcher.dll": {} "Wabbajack.Downloaders.Dispatcher.dll": {}
} }
}, },
"Wabbajack.Downloaders.GameFile/0.5.0": { "Wabbajack.Downloaders.GameFile/0.5.1": {
"dependencies": { "dependencies": {
"GameFinder.StoreHandlers.EADesktop": "4.5.0", "GameFinder.StoreHandlers.EADesktop": "4.5.0",
"GameFinder.StoreHandlers.EGS": "4.5.0", "GameFinder.StoreHandlers.EGS": "4.5.0",
@@ -1903,361 +1903,361 @@
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"SixLabors.ImageSharp": "3.1.6", "SixLabors.ImageSharp": "3.1.6",
"Wabbajack.Downloaders.Interfaces": "0.5.0", "Wabbajack.Downloaders.Interfaces": "0.5.1",
"Wabbajack.VFS": "0.5.0" "Wabbajack.VFS": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Downloaders.GameFile.dll": {} "Wabbajack.Downloaders.GameFile.dll": {}
} }
}, },
"Wabbajack.Downloaders.GoogleDrive/0.5.0": { "Wabbajack.Downloaders.GoogleDrive/0.5.1": {
"dependencies": { "dependencies": {
"HtmlAgilityPack": "1.11.72", "HtmlAgilityPack": "1.11.72",
"Microsoft.AspNetCore.Http.Extensions": "2.3.0", "Microsoft.AspNetCore.Http.Extensions": "2.3.0",
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
"Wabbajack.Common": "0.5.0", "Wabbajack.Common": "0.5.1",
"Wabbajack.DTOs": "0.5.0", "Wabbajack.DTOs": "0.5.1",
"Wabbajack.Downloaders.Interfaces": "0.5.0", "Wabbajack.Downloaders.Interfaces": "0.5.1",
"Wabbajack.Networking.Http": "0.5.0", "Wabbajack.Networking.Http": "0.5.1",
"Wabbajack.Networking.Http.Interfaces": "0.5.0" "Wabbajack.Networking.Http.Interfaces": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Downloaders.GoogleDrive.dll": {} "Wabbajack.Downloaders.GoogleDrive.dll": {}
} }
}, },
"Wabbajack.Downloaders.Http/0.5.0": { "Wabbajack.Downloaders.Http/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
"Wabbajack.Common": "0.5.0", "Wabbajack.Common": "0.5.1",
"Wabbajack.DTOs": "0.5.0", "Wabbajack.DTOs": "0.5.1",
"Wabbajack.Downloaders.Interfaces": "0.5.0", "Wabbajack.Downloaders.Interfaces": "0.5.1",
"Wabbajack.Networking.BethesdaNet": "0.5.0", "Wabbajack.Networking.BethesdaNet": "0.5.1",
"Wabbajack.Networking.Http.Interfaces": "0.5.0", "Wabbajack.Networking.Http.Interfaces": "0.5.1",
"Wabbajack.Paths.IO": "0.5.0" "Wabbajack.Paths.IO": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Downloaders.Http.dll": {} "Wabbajack.Downloaders.Http.dll": {}
} }
}, },
"Wabbajack.Downloaders.Interfaces/0.5.0": { "Wabbajack.Downloaders.Interfaces/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Wabbajack.Compression.Zip": "0.5.0", "Wabbajack.Compression.Zip": "0.5.1",
"Wabbajack.DTOs": "0.5.0", "Wabbajack.DTOs": "0.5.1",
"Wabbajack.Paths.IO": "0.5.0" "Wabbajack.Paths.IO": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Downloaders.Interfaces.dll": {} "Wabbajack.Downloaders.Interfaces.dll": {}
} }
}, },
"Wabbajack.Downloaders.IPS4OAuth2Downloader/0.5.0": { "Wabbajack.Downloaders.IPS4OAuth2Downloader/0.5.1": {
"dependencies": { "dependencies": {
"F23.StringSimilarity": "6.0.0", "F23.StringSimilarity": "6.0.0",
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
"Wabbajack.Common": "0.5.0", "Wabbajack.Common": "0.5.1",
"Wabbajack.Downloaders.Interfaces": "0.5.0", "Wabbajack.Downloaders.Interfaces": "0.5.1",
"Wabbajack.Networking.Http": "0.5.0", "Wabbajack.Networking.Http": "0.5.1",
"Wabbajack.Networking.Http.Interfaces": "0.5.0" "Wabbajack.Networking.Http.Interfaces": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Downloaders.IPS4OAuth2Downloader.dll": {} "Wabbajack.Downloaders.IPS4OAuth2Downloader.dll": {}
} }
}, },
"Wabbajack.Downloaders.Manual/0.5.0": { "Wabbajack.Downloaders.Manual/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
"Wabbajack.Common": "0.5.0", "Wabbajack.Common": "0.5.1",
"Wabbajack.Downloaders.Interfaces": "0.5.0" "Wabbajack.Downloaders.Interfaces": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Downloaders.Manual.dll": {} "Wabbajack.Downloaders.Manual.dll": {}
} }
}, },
"Wabbajack.Downloaders.MediaFire/0.5.0": { "Wabbajack.Downloaders.MediaFire/0.5.1": {
"dependencies": { "dependencies": {
"HtmlAgilityPack": "1.11.72", "HtmlAgilityPack": "1.11.72",
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
"Wabbajack.Common": "0.5.0", "Wabbajack.Common": "0.5.1",
"Wabbajack.Downloaders.Interfaces": "0.5.0", "Wabbajack.Downloaders.Interfaces": "0.5.1",
"Wabbajack.Networking.Http.Interfaces": "0.5.0" "Wabbajack.Networking.Http.Interfaces": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Downloaders.MediaFire.dll": {} "Wabbajack.Downloaders.MediaFire.dll": {}
} }
}, },
"Wabbajack.Downloaders.Mega/0.5.0": { "Wabbajack.Downloaders.Mega/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
"Newtonsoft.Json": "13.0.3", "Newtonsoft.Json": "13.0.3",
"Wabbajack.Common": "0.5.0", "Wabbajack.Common": "0.5.1",
"Wabbajack.Downloaders.Interfaces": "0.5.0", "Wabbajack.Downloaders.Interfaces": "0.5.1",
"Wabbajack.Paths.IO": "0.5.0" "Wabbajack.Paths.IO": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Downloaders.Mega.dll": {} "Wabbajack.Downloaders.Mega.dll": {}
} }
}, },
"Wabbajack.Downloaders.ModDB/0.5.0": { "Wabbajack.Downloaders.ModDB/0.5.1": {
"dependencies": { "dependencies": {
"HtmlAgilityPack": "1.11.72", "HtmlAgilityPack": "1.11.72",
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
"Newtonsoft.Json": "13.0.3", "Newtonsoft.Json": "13.0.3",
"Wabbajack.Common": "0.5.0", "Wabbajack.Common": "0.5.1",
"Wabbajack.Downloaders.Interfaces": "0.5.0", "Wabbajack.Downloaders.Interfaces": "0.5.1",
"Wabbajack.Networking.Http": "0.5.0", "Wabbajack.Networking.Http": "0.5.1",
"Wabbajack.Networking.Http.Interfaces": "0.5.0" "Wabbajack.Networking.Http.Interfaces": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Downloaders.ModDB.dll": {} "Wabbajack.Downloaders.ModDB.dll": {}
} }
}, },
"Wabbajack.Downloaders.Nexus/0.5.0": { "Wabbajack.Downloaders.Nexus/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Wabbajack.DTOs": "0.5.0", "Wabbajack.DTOs": "0.5.1",
"Wabbajack.Downloaders.Interfaces": "0.5.0", "Wabbajack.Downloaders.Interfaces": "0.5.1",
"Wabbajack.Hashing.xxHash64": "0.5.0", "Wabbajack.Hashing.xxHash64": "0.5.1",
"Wabbajack.Networking.Http": "0.5.0", "Wabbajack.Networking.Http": "0.5.1",
"Wabbajack.Networking.Http.Interfaces": "0.5.0", "Wabbajack.Networking.Http.Interfaces": "0.5.1",
"Wabbajack.Networking.NexusApi": "0.5.0", "Wabbajack.Networking.NexusApi": "0.5.1",
"Wabbajack.Paths": "0.5.0" "Wabbajack.Paths": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Downloaders.Nexus.dll": {} "Wabbajack.Downloaders.Nexus.dll": {}
} }
}, },
"Wabbajack.Downloaders.VerificationCache/0.5.0": { "Wabbajack.Downloaders.VerificationCache/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
"Stub.System.Data.SQLite.Core.NetStandard": "1.0.119", "Stub.System.Data.SQLite.Core.NetStandard": "1.0.119",
"Wabbajack.DTOs": "0.5.0", "Wabbajack.DTOs": "0.5.1",
"Wabbajack.Paths.IO": "0.5.0" "Wabbajack.Paths.IO": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Downloaders.VerificationCache.dll": {} "Wabbajack.Downloaders.VerificationCache.dll": {}
} }
}, },
"Wabbajack.Downloaders.WabbajackCDN/0.5.0": { "Wabbajack.Downloaders.WabbajackCDN/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
"Microsoft.Toolkit.HighPerformance": "7.1.2", "Microsoft.Toolkit.HighPerformance": "7.1.2",
"Wabbajack.Common": "0.5.0", "Wabbajack.Common": "0.5.1",
"Wabbajack.Downloaders.Interfaces": "0.5.0", "Wabbajack.Downloaders.Interfaces": "0.5.1",
"Wabbajack.Networking.Http": "0.5.0", "Wabbajack.Networking.Http": "0.5.1",
"Wabbajack.RateLimiter": "0.5.0" "Wabbajack.RateLimiter": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Downloaders.WabbajackCDN.dll": {} "Wabbajack.Downloaders.WabbajackCDN.dll": {}
} }
}, },
"Wabbajack.DTOs/0.5.0": { "Wabbajack.DTOs/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Wabbajack.Hashing.xxHash64": "0.5.0", "Wabbajack.Hashing.xxHash64": "0.5.1",
"Wabbajack.Paths": "0.5.0" "Wabbajack.Paths": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.DTOs.dll": {} "Wabbajack.DTOs.dll": {}
} }
}, },
"Wabbajack.FileExtractor/0.5.0": { "Wabbajack.FileExtractor/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
"OMODFramework": "3.0.1", "OMODFramework": "3.0.1",
"Wabbajack.Common": "0.5.0", "Wabbajack.Common": "0.5.1",
"Wabbajack.Compression.BSA": "0.5.0", "Wabbajack.Compression.BSA": "0.5.1",
"Wabbajack.Hashing.PHash": "0.5.0", "Wabbajack.Hashing.PHash": "0.5.1",
"Wabbajack.Paths": "0.5.0" "Wabbajack.Paths": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.FileExtractor.dll": {} "Wabbajack.FileExtractor.dll": {}
} }
}, },
"Wabbajack.Hashing.PHash/0.5.0": { "Wabbajack.Hashing.PHash/0.5.1": {
"dependencies": { "dependencies": {
"BCnEncoder.Net.ImageSharp": "1.1.1", "BCnEncoder.Net.ImageSharp": "1.1.1",
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Shipwreck.Phash": "0.5.0", "Shipwreck.Phash": "0.5.0",
"SixLabors.ImageSharp": "3.1.6", "SixLabors.ImageSharp": "3.1.6",
"Wabbajack.Common": "0.5.0", "Wabbajack.Common": "0.5.1",
"Wabbajack.DTOs": "0.5.0", "Wabbajack.DTOs": "0.5.1",
"Wabbajack.Paths": "0.5.0", "Wabbajack.Paths": "0.5.1",
"Wabbajack.Paths.IO": "0.5.0" "Wabbajack.Paths.IO": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Hashing.PHash.dll": {} "Wabbajack.Hashing.PHash.dll": {}
} }
}, },
"Wabbajack.Hashing.xxHash64/0.5.0": { "Wabbajack.Hashing.xxHash64/0.5.1": {
"dependencies": { "dependencies": {
"Wabbajack.Paths": "0.5.0", "Wabbajack.Paths": "0.5.1",
"Wabbajack.RateLimiter": "0.5.0" "Wabbajack.RateLimiter": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Hashing.xxHash64.dll": {} "Wabbajack.Hashing.xxHash64.dll": {}
} }
}, },
"Wabbajack.Installer/0.5.0": { "Wabbajack.Installer/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Newtonsoft.Json": "13.0.3", "Newtonsoft.Json": "13.0.3",
"Octopus.Octodiff": "2.0.548", "Octopus.Octodiff": "2.0.548",
"SixLabors.ImageSharp": "3.1.6", "SixLabors.ImageSharp": "3.1.6",
"Wabbajack.DTOs": "0.5.0", "Wabbajack.DTOs": "0.5.1",
"Wabbajack.Downloaders.Dispatcher": "0.5.0", "Wabbajack.Downloaders.Dispatcher": "0.5.1",
"Wabbajack.Downloaders.GameFile": "0.5.0", "Wabbajack.Downloaders.GameFile": "0.5.1",
"Wabbajack.FileExtractor": "0.5.0", "Wabbajack.FileExtractor": "0.5.1",
"Wabbajack.Networking.NexusApi": "0.5.0", "Wabbajack.Networking.NexusApi": "0.5.1",
"Wabbajack.Networking.WabbajackClientApi": "0.5.0", "Wabbajack.Networking.WabbajackClientApi": "0.5.1",
"Wabbajack.Paths": "0.5.0", "Wabbajack.Paths": "0.5.1",
"Wabbajack.Paths.IO": "0.5.0", "Wabbajack.Paths.IO": "0.5.1",
"Wabbajack.VFS": "0.5.0", "Wabbajack.VFS": "0.5.1",
"ini-parser-netstandard": "2.5.2" "ini-parser-netstandard": "2.5.2"
}, },
"runtime": { "runtime": {
"Wabbajack.Installer.dll": {} "Wabbajack.Installer.dll": {}
} }
}, },
"Wabbajack.IO.Async/0.5.0": { "Wabbajack.IO.Async/0.5.1": {
"runtime": { "runtime": {
"Wabbajack.IO.Async.dll": {} "Wabbajack.IO.Async.dll": {}
} }
}, },
"Wabbajack.Networking.BethesdaNet/0.5.0": { "Wabbajack.Networking.BethesdaNet/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Wabbajack.DTOs": "0.5.0", "Wabbajack.DTOs": "0.5.1",
"Wabbajack.Networking.Http": "0.5.0", "Wabbajack.Networking.Http": "0.5.1",
"Wabbajack.Networking.Http.Interfaces": "0.5.0" "Wabbajack.Networking.Http.Interfaces": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Networking.BethesdaNet.dll": {} "Wabbajack.Networking.BethesdaNet.dll": {}
} }
}, },
"Wabbajack.Networking.Discord/0.5.0": { "Wabbajack.Networking.Discord/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
"Wabbajack.Networking.Http.Interfaces": "0.5.0" "Wabbajack.Networking.Http.Interfaces": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Networking.Discord.dll": {} "Wabbajack.Networking.Discord.dll": {}
} }
}, },
"Wabbajack.Networking.GitHub/0.5.0": { "Wabbajack.Networking.GitHub/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
"Octokit": "14.0.0", "Octokit": "14.0.0",
"Wabbajack.DTOs": "0.5.0", "Wabbajack.DTOs": "0.5.1",
"Wabbajack.Networking.Http.Interfaces": "0.5.0" "Wabbajack.Networking.Http.Interfaces": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Networking.GitHub.dll": {} "Wabbajack.Networking.GitHub.dll": {}
} }
}, },
"Wabbajack.Networking.Http/0.5.0": { "Wabbajack.Networking.Http/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Microsoft.Extensions.Http": "9.0.1", "Microsoft.Extensions.Http": "9.0.1",
"Microsoft.Extensions.Logging": "9.0.1", "Microsoft.Extensions.Logging": "9.0.1",
"Wabbajack.Configuration": "0.5.0", "Wabbajack.Configuration": "0.5.1",
"Wabbajack.Downloaders.Interfaces": "0.5.0", "Wabbajack.Downloaders.Interfaces": "0.5.1",
"Wabbajack.Hashing.xxHash64": "0.5.0", "Wabbajack.Hashing.xxHash64": "0.5.1",
"Wabbajack.Networking.Http.Interfaces": "0.5.0", "Wabbajack.Networking.Http.Interfaces": "0.5.1",
"Wabbajack.Paths": "0.5.0", "Wabbajack.Paths": "0.5.1",
"Wabbajack.Paths.IO": "0.5.0" "Wabbajack.Paths.IO": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Networking.Http.dll": {} "Wabbajack.Networking.Http.dll": {}
} }
}, },
"Wabbajack.Networking.Http.Interfaces/0.5.0": { "Wabbajack.Networking.Http.Interfaces/0.5.1": {
"dependencies": { "dependencies": {
"Wabbajack.Hashing.xxHash64": "0.5.0" "Wabbajack.Hashing.xxHash64": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Networking.Http.Interfaces.dll": {} "Wabbajack.Networking.Http.Interfaces.dll": {}
} }
}, },
"Wabbajack.Networking.NexusApi/0.5.0": { "Wabbajack.Networking.NexusApi/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
"Wabbajack.DTOs": "0.5.0", "Wabbajack.DTOs": "0.5.1",
"Wabbajack.Networking.Http": "0.5.0", "Wabbajack.Networking.Http": "0.5.1",
"Wabbajack.Networking.Http.Interfaces": "0.5.0", "Wabbajack.Networking.Http.Interfaces": "0.5.1",
"Wabbajack.Networking.WabbajackClientApi": "0.5.0" "Wabbajack.Networking.WabbajackClientApi": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Networking.NexusApi.dll": {} "Wabbajack.Networking.NexusApi.dll": {}
} }
}, },
"Wabbajack.Networking.WabbajackClientApi/0.5.0": { "Wabbajack.Networking.WabbajackClientApi/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
"Octokit": "14.0.0", "Octokit": "14.0.0",
"Wabbajack.Common": "0.5.0", "Wabbajack.Common": "0.5.1",
"Wabbajack.DTOs": "0.5.0", "Wabbajack.DTOs": "0.5.1",
"Wabbajack.Paths.IO": "0.5.0", "Wabbajack.Paths.IO": "0.5.1",
"Wabbajack.VFS.Interfaces": "0.5.0", "Wabbajack.VFS.Interfaces": "0.5.1",
"YamlDotNet": "16.3.0" "YamlDotNet": "16.3.0"
}, },
"runtime": { "runtime": {
"Wabbajack.Networking.WabbajackClientApi.dll": {} "Wabbajack.Networking.WabbajackClientApi.dll": {}
} }
}, },
"Wabbajack.Paths/0.5.0": { "Wabbajack.Paths/0.5.1": {
"runtime": { "runtime": {
"Wabbajack.Paths.dll": {} "Wabbajack.Paths.dll": {}
} }
}, },
"Wabbajack.Paths.IO/0.5.0": { "Wabbajack.Paths.IO/0.5.1": {
"dependencies": { "dependencies": {
"Wabbajack.Paths": "0.5.0", "Wabbajack.Paths": "0.5.1",
"shortid": "4.0.0" "shortid": "4.0.0"
}, },
"runtime": { "runtime": {
"Wabbajack.Paths.IO.dll": {} "Wabbajack.Paths.IO.dll": {}
} }
}, },
"Wabbajack.RateLimiter/0.5.0": { "Wabbajack.RateLimiter/0.5.1": {
"runtime": { "runtime": {
"Wabbajack.RateLimiter.dll": {} "Wabbajack.RateLimiter.dll": {}
} }
}, },
"Wabbajack.Server.Lib/0.5.0": { "Wabbajack.Server.Lib/0.5.1": {
"dependencies": { "dependencies": {
"FluentFTP": "52.0.0", "FluentFTP": "52.0.0",
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
@@ -2265,58 +2265,58 @@
"Nettle": "3.0.0", "Nettle": "3.0.0",
"Newtonsoft.Json": "13.0.3", "Newtonsoft.Json": "13.0.3",
"SixLabors.ImageSharp": "3.1.6", "SixLabors.ImageSharp": "3.1.6",
"Wabbajack.Common": "0.5.0", "Wabbajack.Common": "0.5.1",
"Wabbajack.Networking.Http.Interfaces": "0.5.0", "Wabbajack.Networking.Http.Interfaces": "0.5.1",
"Wabbajack.Services.OSIntegrated": "0.5.0" "Wabbajack.Services.OSIntegrated": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Server.Lib.dll": {} "Wabbajack.Server.Lib.dll": {}
} }
}, },
"Wabbajack.Services.OSIntegrated/0.5.0": { "Wabbajack.Services.OSIntegrated/0.5.1": {
"dependencies": { "dependencies": {
"DeviceId": "6.8.0", "DeviceId": "6.8.0",
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Newtonsoft.Json": "13.0.3", "Newtonsoft.Json": "13.0.3",
"SixLabors.ImageSharp": "3.1.6", "SixLabors.ImageSharp": "3.1.6",
"Wabbajack.Compiler": "0.5.0", "Wabbajack.Compiler": "0.5.1",
"Wabbajack.Downloaders.Dispatcher": "0.5.0", "Wabbajack.Downloaders.Dispatcher": "0.5.1",
"Wabbajack.Installer": "0.5.0", "Wabbajack.Installer": "0.5.1",
"Wabbajack.Networking.BethesdaNet": "0.5.0", "Wabbajack.Networking.BethesdaNet": "0.5.1",
"Wabbajack.Networking.Discord": "0.5.0", "Wabbajack.Networking.Discord": "0.5.1",
"Wabbajack.VFS": "0.5.0" "Wabbajack.VFS": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.Services.OSIntegrated.dll": {} "Wabbajack.Services.OSIntegrated.dll": {}
} }
}, },
"Wabbajack.VFS/0.5.0": { "Wabbajack.VFS/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1",
"SixLabors.ImageSharp": "3.1.6", "SixLabors.ImageSharp": "3.1.6",
"System.Data.SQLite.Core": "1.0.119", "System.Data.SQLite.Core": "1.0.119",
"Wabbajack.Common": "0.5.0", "Wabbajack.Common": "0.5.1",
"Wabbajack.FileExtractor": "0.5.0", "Wabbajack.FileExtractor": "0.5.1",
"Wabbajack.Hashing.PHash": "0.5.0", "Wabbajack.Hashing.PHash": "0.5.1",
"Wabbajack.Hashing.xxHash64": "0.5.0", "Wabbajack.Hashing.xxHash64": "0.5.1",
"Wabbajack.Paths": "0.5.0", "Wabbajack.Paths": "0.5.1",
"Wabbajack.Paths.IO": "0.5.0", "Wabbajack.Paths.IO": "0.5.1",
"Wabbajack.VFS.Interfaces": "0.5.0" "Wabbajack.VFS.Interfaces": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.VFS.dll": {} "Wabbajack.VFS.dll": {}
} }
}, },
"Wabbajack.VFS.Interfaces/0.5.0": { "Wabbajack.VFS.Interfaces/0.5.1": {
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1",
"Wabbajack.DTOs": "0.5.0", "Wabbajack.DTOs": "0.5.1",
"Wabbajack.Hashing.xxHash64": "0.5.0", "Wabbajack.Hashing.xxHash64": "0.5.1",
"Wabbajack.Paths": "0.5.0" "Wabbajack.Paths": "0.5.1"
}, },
"runtime": { "runtime": {
"Wabbajack.VFS.Interfaces.dll": {} "Wabbajack.VFS.Interfaces.dll": {}
@@ -2333,7 +2333,7 @@
} }
}, },
"libraries": { "libraries": {
"jackify-engine/0.5.0": { "jackify-engine/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
@@ -3022,202 +3022,202 @@
"path": "yamldotnet/16.3.0", "path": "yamldotnet/16.3.0",
"hashPath": "yamldotnet.16.3.0.nupkg.sha512" "hashPath": "yamldotnet.16.3.0.nupkg.sha512"
}, },
"Wabbajack.CLI.Builder/0.5.0": { "Wabbajack.CLI.Builder/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Common/0.5.0": { "Wabbajack.Common/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Compiler/0.5.0": { "Wabbajack.Compiler/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Compression.BSA/0.5.0": { "Wabbajack.Compression.BSA/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Compression.Zip/0.5.0": { "Wabbajack.Compression.Zip/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Configuration/0.5.0": { "Wabbajack.Configuration/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Downloaders.Bethesda/0.5.0": { "Wabbajack.Downloaders.Bethesda/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Downloaders.Dispatcher/0.5.0": { "Wabbajack.Downloaders.Dispatcher/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Downloaders.GameFile/0.5.0": { "Wabbajack.Downloaders.GameFile/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Downloaders.GoogleDrive/0.5.0": { "Wabbajack.Downloaders.GoogleDrive/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Downloaders.Http/0.5.0": { "Wabbajack.Downloaders.Http/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Downloaders.Interfaces/0.5.0": { "Wabbajack.Downloaders.Interfaces/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Downloaders.IPS4OAuth2Downloader/0.5.0": { "Wabbajack.Downloaders.IPS4OAuth2Downloader/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Downloaders.Manual/0.5.0": { "Wabbajack.Downloaders.Manual/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Downloaders.MediaFire/0.5.0": { "Wabbajack.Downloaders.MediaFire/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Downloaders.Mega/0.5.0": { "Wabbajack.Downloaders.Mega/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Downloaders.ModDB/0.5.0": { "Wabbajack.Downloaders.ModDB/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Downloaders.Nexus/0.5.0": { "Wabbajack.Downloaders.Nexus/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Downloaders.VerificationCache/0.5.0": { "Wabbajack.Downloaders.VerificationCache/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Downloaders.WabbajackCDN/0.5.0": { "Wabbajack.Downloaders.WabbajackCDN/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.DTOs/0.5.0": { "Wabbajack.DTOs/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.FileExtractor/0.5.0": { "Wabbajack.FileExtractor/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Hashing.PHash/0.5.0": { "Wabbajack.Hashing.PHash/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Hashing.xxHash64/0.5.0": { "Wabbajack.Hashing.xxHash64/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Installer/0.5.0": { "Wabbajack.Installer/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.IO.Async/0.5.0": { "Wabbajack.IO.Async/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Networking.BethesdaNet/0.5.0": { "Wabbajack.Networking.BethesdaNet/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Networking.Discord/0.5.0": { "Wabbajack.Networking.Discord/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Networking.GitHub/0.5.0": { "Wabbajack.Networking.GitHub/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Networking.Http/0.5.0": { "Wabbajack.Networking.Http/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Networking.Http.Interfaces/0.5.0": { "Wabbajack.Networking.Http.Interfaces/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Networking.NexusApi/0.5.0": { "Wabbajack.Networking.NexusApi/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Networking.WabbajackClientApi/0.5.0": { "Wabbajack.Networking.WabbajackClientApi/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Paths/0.5.0": { "Wabbajack.Paths/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Paths.IO/0.5.0": { "Wabbajack.Paths.IO/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.RateLimiter/0.5.0": { "Wabbajack.RateLimiter/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Server.Lib/0.5.0": { "Wabbajack.Server.Lib/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.Services.OSIntegrated/0.5.0": { "Wabbajack.Services.OSIntegrated/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.VFS/0.5.0": { "Wabbajack.VFS/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
}, },
"Wabbajack.VFS.Interfaces/0.5.0": { "Wabbajack.VFS.Interfaces/0.5.1": {
"type": "project", "type": "project",
"serviceable": false, "serviceable": false,
"sha512": "" "sha512": ""
Binary file not shown.
@@ -34,7 +34,8 @@ class InstallerThread(QThread):
non_premium_detected = Signal() non_premium_detected = Signal()
def __init__(self, modlist, install_dir, downloads_dir, api_key, modlist_name, def __init__(self, modlist, install_dir, downloads_dir, api_key, modlist_name,
install_mode='online', progress_state_manager=None, auth_service=None, oauth_info=None): install_mode='online', progress_state_manager=None, auth_service=None,
oauth_info=None, skip_disk_check=False):
super().__init__() super().__init__()
self.modlist = modlist self.modlist = modlist
self.install_dir = install_dir self.install_dir = install_dir
@@ -47,6 +48,7 @@ class InstallerThread(QThread):
self.progress_state_manager = progress_state_manager self.progress_state_manager = progress_state_manager
self.auth_service = auth_service self.auth_service = auth_service
self.oauth_info = oauth_info self.oauth_info = oauth_info
self.skip_disk_check = skip_disk_check
self._premium_signal_sent = False self._premium_signal_sent = False
self._non_premium_info_sent = False self._non_premium_info_sent = False
self._engine_output_buffer = [] self._engine_output_buffer = []
@@ -56,6 +58,8 @@ class InstallerThread(QThread):
self._raw_stdout_lines: list = [] # bounded ring buffer for non-JSON stdout self._raw_stdout_lines: list = [] # bounded ring buffer for non-JSON stdout
self._pending_manual_downloads: list = [] # accumulates items until list_complete self._pending_manual_downloads: list = [] # accumulates items until list_complete
self._resource_limit_hint: Optional[str] = None self._resource_limit_hint: Optional[str] = None
self._install_progress_started = False # True once any [FILE_PROGRESS] output seen
self._last_error_raw_context: dict = {} # raw context dict from structured engine errors
@staticmethod @staticmethod
def _is_generic_failure_text(message: Optional[str]) -> bool: def _is_generic_failure_text(message: Optional[str]) -> bool:
@@ -136,6 +140,12 @@ class InstallerThread(QThread):
error = parse_engine_error_line(line) error = parse_engine_error_line(line)
if error and self.last_error is None: if error and self.last_error is None:
self.last_error = error self.last_error = error
try:
obj = json.loads(line)
if obj.get("type") == "disk_full":
self._last_error_raw_context = obj.get("context") or {}
except (json.JSONDecodeError, ValueError):
pass
else: else:
if self.last_error is None and is_cc_content_error(line): if self.last_error is None and is_cc_content_error(line):
self.last_error = cc_content_missing(extract_cc_filename(line) or "") self.last_error = cc_content_missing(extract_cc_filename(line) or "")
@@ -265,6 +275,9 @@ class InstallerThread(QThread):
if debug_mode: if debug_mode:
cmd.append('--debug') cmd.append('--debug')
logger.debug("DEBUG: Added --debug flag to jackify-engine command") logger.debug("DEBUG: Added --debug flag to jackify-engine command")
if self.skip_disk_check:
cmd.append('--skip-disk-check')
logger.debug("DEBUG: Added --skip-disk-check flag to jackify-engine command")
logger.debug(f"DEBUG: FULL Engine command: {' '.join(cmd)}") logger.debug(f"DEBUG: FULL Engine command: {' '.join(cmd)}")
logger.debug(f"DEBUG: modlist value being passed: '{self.modlist}'") logger.debug(f"DEBUG: modlist value being passed: '{self.modlist}'")
from jackify.backend.handlers.subprocess_utils import get_clean_subprocess_env from jackify.backend.handlers.subprocess_utils import get_clean_subprocess_env
@@ -361,6 +374,7 @@ class InstallerThread(QThread):
logger.debug(f"DEBUG: Parser detected {len(progress_state.active_files)} active files from line: {decoded[:80]}") logger.debug(f"DEBUG: Parser detected {len(progress_state.active_files)} active files from line: {decoded[:80]}")
self.progress_updated.emit(progress_state) self.progress_updated.emit(progress_state)
if '[FILE_PROGRESS]' in decoded: if '[FILE_PROGRESS]' in decoded:
self._install_progress_started = True
parts = decoded.split('[FILE_PROGRESS]', 1) parts = decoded.split('[FILE_PROGRESS]', 1)
if parts[0].strip(): if parts[0].strip():
self.progress_received.emit(parts[0].rstrip()) self.progress_received.emit(parts[0].rstrip())
@@ -427,6 +441,7 @@ class InstallerThread(QThread):
continue continue
self._remember_stdout_line(decoded) self._remember_stdout_line(decoded)
if '[FILE_PROGRESS]' in decoded: if '[FILE_PROGRESS]' in decoded:
self._install_progress_started = True
parts = decoded.split('[FILE_PROGRESS]', 1) parts = decoded.split('[FILE_PROGRESS]', 1)
if parts[0].strip(): if parts[0].strip():
self.output_received.emit(parts[0].rstrip()) self.output_received.emit(parts[0].rstrip())
@@ -406,6 +406,18 @@ class ProgressHandlersMixin:
if self._premium_failure_active: if self._premium_failure_active:
message = "Installation stopped because Nexus Premium is required for automated downloads." message = "Installation stopped because Nexus Premium is required for automated downloads."
if not self._premium_failure_active and not cancellation_detected:
thread = getattr(self, 'install_thread', None)
if (thread
and not getattr(thread, '_install_progress_started', False)
and getattr(getattr(thread, 'last_error', None), 'title', '') == "Disk Full"):
ctx = getattr(thread, '_last_error_raw_context', {})
if self._handle_preflight_disk_space(ctx):
return
self._installation_cancelled = True
self.process_finished(130, QProcess.NormalExit)
return
if not self._premium_failure_active: if not self._premium_failure_active:
engine_error = getattr(self.install_thread, 'last_error', None) engine_error = getattr(self.install_thread, 'last_error', None)
if engine_error: if engine_error:
@@ -417,6 +429,68 @@ class ProgressHandlersMixin:
self._safe_append_text(f"\nError: {message}") self._safe_append_text(f"\nError: {message}")
self.process_finished(1, QProcess.CrashExit) # Simulate error self.process_finished(1, QProcess.CrashExit) # Simulate error
def _handle_preflight_disk_space(self, ctx: dict) -> bool:
"""Show pre-flight disk space warning dialog. Returns True if user chose Continue Anyway."""
required_bytes = ctx.get('required_bytes', 0)
available_bytes = ctx.get('available_bytes', 0)
def _fmt(b):
if b >= 1024 ** 3:
return f"{b / 1024 ** 3:.1f} GB"
if b >= 1024 ** 2:
return f"{b / 1024 ** 2:.1f} MB"
return f"{b} bytes" if b else "unknown"
required_str = _fmt(required_bytes)
available_str = _fmt(available_bytes)
body = (
f"The disk space check reports that there may not be enough free space to complete "
f"this installation.\n\n"
f"Required: {required_str}\n"
f"Available: {available_str}\n\n"
f"If this is a modlist update, the actual space needed is likely far less — most files "
f"are already present and will be reused rather than re-downloaded.\n\n"
f"You can continue and free up space while downloads are running, "
f"or cancel to resolve the space issue first."
)
from PySide6.QtWidgets import QMessageBox
dlg = QMessageBox(self)
dlg.setWindowTitle("Disk Space Warning")
dlg.setText("Not enough free disk space detected.")
dlg.setInformativeText(body)
dlg.setIcon(QMessageBox.Warning)
continue_btn = dlg.addButton("Continue Anyway", QMessageBox.AcceptRole)
dlg.addButton("Cancel", QMessageBox.RejectRole)
dlg.setDefaultButton(continue_btn)
dlg.exec()
if dlg.clickedButton() is not continue_btn:
return False
thread = getattr(self, 'install_thread', None)
if not thread:
return False
modlist = getattr(thread, 'modlist', None)
install_dir = getattr(thread, 'install_dir', None)
downloads_dir = getattr(thread, 'downloads_dir', None)
api_key = getattr(thread, 'api_key', None)
install_mode = getattr(thread, 'install_mode', 'online')
oauth_info = getattr(thread, 'oauth_info', None)
if not (modlist and install_dir and downloads_dir and api_key):
return False
logger.info("Pre-flight disk space check bypassed by user — restarting with --skip-disk-check")
self._safe_append_text("\n[WARN] Disk space check bypassed. Continuing installation...\n")
self.run_modlist_installer(
modlist, install_dir, downloads_dir, api_key,
install_mode, oauth_info, skip_disk_check=True,
)
return True
def process_finished(self, exit_code, exit_status): def process_finished(self, exit_code, exit_status):
logger.debug(f"DEBUG: process_finished called with exit_code={exit_code}, exit_status={exit_status}") logger.debug(f"DEBUG: process_finished called with exit_code={exit_code}, exit_status={exit_status}")
# Reset button states # Reset button states
@@ -384,7 +384,7 @@ class InstallWorkflowExecutionMixin:
self.cancel_install_btn.setVisible(False) self.cancel_install_btn.setVisible(False)
logger.debug(f"DEBUG: Controls re-enabled in exception handler") logger.debug(f"DEBUG: Controls re-enabled in exception handler")
def run_modlist_installer(self, modlist, install_dir, downloads_dir, api_key, install_mode='online', oauth_info=None): def run_modlist_installer(self, modlist, install_dir, downloads_dir, api_key, install_mode='online', oauth_info=None, skip_disk_check=False):
logger.debug('DEBUG: run_modlist_installer called - USING THREADED BACKEND WRAPPER') logger.debug('DEBUG: run_modlist_installer called - USING THREADED BACKEND WRAPPER')
# Rotate log file at start of each workflow run (keep 5 backups) # Rotate log file at start of each workflow run (keep 5 backups)
@@ -408,7 +408,8 @@ class InstallWorkflowExecutionMixin:
modlist, install_dir, downloads_dir, api_key, self.modlist_name_edit.text().strip(), install_mode, modlist, install_dir, downloads_dir, api_key, self.modlist_name_edit.text().strip(), install_mode,
progress_state_manager=self.progress_state_manager, # R&D: Pass progress state manager progress_state_manager=self.progress_state_manager, # R&D: Pass progress state manager
auth_service=self.auth_service, # Fix Issue #127: Pass auth_service for Premium detection diagnostics auth_service=self.auth_service, # Fix Issue #127: Pass auth_service for Premium detection diagnostics
oauth_info=oauth_info # Pass OAuth state for auto-refresh oauth_info=oauth_info, # Pass OAuth state for auto-refresh
skip_disk_check=skip_disk_check,
) )
self.install_thread.output_received.connect(self.on_installation_output) self.install_thread.output_received.connect(self.on_installation_output)
self.install_thread.progress_received.connect(self.on_installation_progress) self.install_thread.progress_received.connect(self.on_installation_progress)