diff --git a/CHANGELOG.md b/CHANGELOG.md index 3dccf40..94f7dfd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # 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 **Release Date:** 13/03/26 diff --git a/jackify/__init__.py b/jackify/__init__.py index d802551..b6fc9cb 100644 --- a/jackify/__init__.py +++ b/jackify/__init__.py @@ -5,4 +5,4 @@ This package provides both CLI and GUI interfaces for managing Wabbajack modlists natively on Linux systems. """ -__version__ = "0.5.0.1" +__version__ = "0.5.0.2" diff --git a/jackify/backend/handlers/modlist_configuration.py b/jackify/backend/handlers/modlist_configuration.py index 8377ef7..be18d4e 100644 --- a/jackify/backend/handlers/modlist_configuration.py +++ b/jackify/backend/handlers/modlist_configuration.py @@ -50,20 +50,10 @@ class ModlistConfigurationMixin: return True def _execute_configuration_steps(self, status_callback=None, manual_steps_completed=False, skip_manual_for_existing=False): - """ - 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). - """ + """Run the configuration steps for the selected modlist.""" try: - # Store status_callback for Configuration Summary self._current_status_callback = status_callback - 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]): 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.") @@ -89,14 +79,10 @@ class ModlistConfigurationMixin: return False # Abort on failure 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 if not manual_steps_completed and not skip_manual_for_existing: - # Check if Proton Experimental is already set and compatdata exists proton_ok = False compatdata_ok = False - - # Check Proton version self.logger.debug(f"[MANUAL STEPS DEBUG] Checking Proton version for AppID {self.appid}") if self._detect_proton_version(): self.logger.debug(f"[MANUAL STEPS DEBUG] Detected Proton version: {self.proton_ver}") @@ -106,7 +92,6 @@ class ModlistConfigurationMixin: else: 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)) 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}") 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.") # Step 4: Install Wine Components @@ -543,9 +546,7 @@ class ModlistConfigurationMixin: status_callback("") # Blank line after final Prefix Configuration step 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) - # Avoids a second Steam restart - special_game_type = self.detect_special_game_type(self.modlist_dir) + # Step 13: Launch options for special games are now set during automated workflow if special_game_type: self.logger.info(f"Step 13: Launch options for {special_game_type.upper()} were set during automated workflow") else: @@ -568,18 +569,12 @@ class ModlistConfigurationMixin: return True # Return True on success def run_modlist_configuration_phase(self, context: dict = None) -> bool: - """ - Main entry point to run the full modlist configuration sequence. - This orchestrates all the individual steps. - """ + """Run the full modlist configuration sequence.""" 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 return self._execute_configuration_steps(status_callback=status_callback) def _prompt_or_set_resolution(self): - # If on Steam Deck, set 1280x800 automatically if self._is_steam_deck(): self.selected_resolution = "1280x800" self.logger.info("Steam Deck detected: setting resolution to 1280x800.") diff --git a/jackify/engine/Wabbajack.CLI.Builder.dll b/jackify/engine/Wabbajack.CLI.Builder.dll index 3663399..e753f1c 100644 Binary files a/jackify/engine/Wabbajack.CLI.Builder.dll and b/jackify/engine/Wabbajack.CLI.Builder.dll differ diff --git a/jackify/engine/Wabbajack.Common.dll b/jackify/engine/Wabbajack.Common.dll index 1153b50..d13a494 100644 Binary files a/jackify/engine/Wabbajack.Common.dll and b/jackify/engine/Wabbajack.Common.dll differ diff --git a/jackify/engine/Wabbajack.Compiler.dll b/jackify/engine/Wabbajack.Compiler.dll index 5d1be7c..64dfa0f 100644 Binary files a/jackify/engine/Wabbajack.Compiler.dll and b/jackify/engine/Wabbajack.Compiler.dll differ diff --git a/jackify/engine/Wabbajack.Compression.BSA.dll b/jackify/engine/Wabbajack.Compression.BSA.dll index 54716fd..75abc4d 100644 Binary files a/jackify/engine/Wabbajack.Compression.BSA.dll and b/jackify/engine/Wabbajack.Compression.BSA.dll differ diff --git a/jackify/engine/Wabbajack.Compression.Zip.dll b/jackify/engine/Wabbajack.Compression.Zip.dll index 55ed1bf..2324215 100644 Binary files a/jackify/engine/Wabbajack.Compression.Zip.dll and b/jackify/engine/Wabbajack.Compression.Zip.dll differ diff --git a/jackify/engine/Wabbajack.Configuration.dll b/jackify/engine/Wabbajack.Configuration.dll index dd09668..d5703c4 100644 Binary files a/jackify/engine/Wabbajack.Configuration.dll and b/jackify/engine/Wabbajack.Configuration.dll differ diff --git a/jackify/engine/Wabbajack.DTOs.dll b/jackify/engine/Wabbajack.DTOs.dll index 7827d81..3f550ac 100644 Binary files a/jackify/engine/Wabbajack.DTOs.dll and b/jackify/engine/Wabbajack.DTOs.dll differ diff --git a/jackify/engine/Wabbajack.Downloaders.Bethesda.dll b/jackify/engine/Wabbajack.Downloaders.Bethesda.dll index 06a343f..88ce0e7 100644 Binary files a/jackify/engine/Wabbajack.Downloaders.Bethesda.dll and b/jackify/engine/Wabbajack.Downloaders.Bethesda.dll differ diff --git a/jackify/engine/Wabbajack.Downloaders.Dispatcher.dll b/jackify/engine/Wabbajack.Downloaders.Dispatcher.dll index a915cfa..71116e9 100644 Binary files a/jackify/engine/Wabbajack.Downloaders.Dispatcher.dll and b/jackify/engine/Wabbajack.Downloaders.Dispatcher.dll differ diff --git a/jackify/engine/Wabbajack.Downloaders.GameFile.dll b/jackify/engine/Wabbajack.Downloaders.GameFile.dll index 8b76c64..38834d1 100644 Binary files a/jackify/engine/Wabbajack.Downloaders.GameFile.dll and b/jackify/engine/Wabbajack.Downloaders.GameFile.dll differ diff --git a/jackify/engine/Wabbajack.Downloaders.GoogleDrive.dll b/jackify/engine/Wabbajack.Downloaders.GoogleDrive.dll index 362edb3..7e25a46 100644 Binary files a/jackify/engine/Wabbajack.Downloaders.GoogleDrive.dll and b/jackify/engine/Wabbajack.Downloaders.GoogleDrive.dll differ diff --git a/jackify/engine/Wabbajack.Downloaders.Http.dll b/jackify/engine/Wabbajack.Downloaders.Http.dll index 0910771..2a453a4 100644 Binary files a/jackify/engine/Wabbajack.Downloaders.Http.dll and b/jackify/engine/Wabbajack.Downloaders.Http.dll differ diff --git a/jackify/engine/Wabbajack.Downloaders.IPS4OAuth2Downloader.dll b/jackify/engine/Wabbajack.Downloaders.IPS4OAuth2Downloader.dll index 3a18af1..1bef74e 100644 Binary files a/jackify/engine/Wabbajack.Downloaders.IPS4OAuth2Downloader.dll and b/jackify/engine/Wabbajack.Downloaders.IPS4OAuth2Downloader.dll differ diff --git a/jackify/engine/Wabbajack.Downloaders.Interfaces.dll b/jackify/engine/Wabbajack.Downloaders.Interfaces.dll index 34fa9a7..632cc58 100644 Binary files a/jackify/engine/Wabbajack.Downloaders.Interfaces.dll and b/jackify/engine/Wabbajack.Downloaders.Interfaces.dll differ diff --git a/jackify/engine/Wabbajack.Downloaders.Manual.dll b/jackify/engine/Wabbajack.Downloaders.Manual.dll index fef16a0..b6f449b 100644 Binary files a/jackify/engine/Wabbajack.Downloaders.Manual.dll and b/jackify/engine/Wabbajack.Downloaders.Manual.dll differ diff --git a/jackify/engine/Wabbajack.Downloaders.MediaFire.dll b/jackify/engine/Wabbajack.Downloaders.MediaFire.dll index 105b340..dda9fe3 100644 Binary files a/jackify/engine/Wabbajack.Downloaders.MediaFire.dll and b/jackify/engine/Wabbajack.Downloaders.MediaFire.dll differ diff --git a/jackify/engine/Wabbajack.Downloaders.Mega.dll b/jackify/engine/Wabbajack.Downloaders.Mega.dll index 4feebb7..f5e6f05 100644 Binary files a/jackify/engine/Wabbajack.Downloaders.Mega.dll and b/jackify/engine/Wabbajack.Downloaders.Mega.dll differ diff --git a/jackify/engine/Wabbajack.Downloaders.ModDB.dll b/jackify/engine/Wabbajack.Downloaders.ModDB.dll index 4b81979..bf79d45 100644 Binary files a/jackify/engine/Wabbajack.Downloaders.ModDB.dll and b/jackify/engine/Wabbajack.Downloaders.ModDB.dll differ diff --git a/jackify/engine/Wabbajack.Downloaders.Nexus.dll b/jackify/engine/Wabbajack.Downloaders.Nexus.dll index 780f08e..8a4bf59 100644 Binary files a/jackify/engine/Wabbajack.Downloaders.Nexus.dll and b/jackify/engine/Wabbajack.Downloaders.Nexus.dll differ diff --git a/jackify/engine/Wabbajack.Downloaders.VerificationCache.dll b/jackify/engine/Wabbajack.Downloaders.VerificationCache.dll index 4c80e62..908dfde 100644 Binary files a/jackify/engine/Wabbajack.Downloaders.VerificationCache.dll and b/jackify/engine/Wabbajack.Downloaders.VerificationCache.dll differ diff --git a/jackify/engine/Wabbajack.Downloaders.WabbajackCDN.dll b/jackify/engine/Wabbajack.Downloaders.WabbajackCDN.dll index 7cd968b..2e7ae75 100644 Binary files a/jackify/engine/Wabbajack.Downloaders.WabbajackCDN.dll and b/jackify/engine/Wabbajack.Downloaders.WabbajackCDN.dll differ diff --git a/jackify/engine/Wabbajack.FileExtractor.dll b/jackify/engine/Wabbajack.FileExtractor.dll index 040f8f4..058c706 100644 Binary files a/jackify/engine/Wabbajack.FileExtractor.dll and b/jackify/engine/Wabbajack.FileExtractor.dll differ diff --git a/jackify/engine/Wabbajack.Hashing.PHash.dll b/jackify/engine/Wabbajack.Hashing.PHash.dll index 8ca590a..0f632ab 100644 Binary files a/jackify/engine/Wabbajack.Hashing.PHash.dll and b/jackify/engine/Wabbajack.Hashing.PHash.dll differ diff --git a/jackify/engine/Wabbajack.Hashing.xxHash64.dll b/jackify/engine/Wabbajack.Hashing.xxHash64.dll index e606505..f79901a 100644 Binary files a/jackify/engine/Wabbajack.Hashing.xxHash64.dll and b/jackify/engine/Wabbajack.Hashing.xxHash64.dll differ diff --git a/jackify/engine/Wabbajack.IO.Async.dll b/jackify/engine/Wabbajack.IO.Async.dll index 7ad47ea..f36eb73 100644 Binary files a/jackify/engine/Wabbajack.IO.Async.dll and b/jackify/engine/Wabbajack.IO.Async.dll differ diff --git a/jackify/engine/Wabbajack.Installer.dll b/jackify/engine/Wabbajack.Installer.dll index 7d60b3e..4d4f264 100644 Binary files a/jackify/engine/Wabbajack.Installer.dll and b/jackify/engine/Wabbajack.Installer.dll differ diff --git a/jackify/engine/Wabbajack.Networking.BethesdaNet.dll b/jackify/engine/Wabbajack.Networking.BethesdaNet.dll index b1725b5..47eafac 100644 Binary files a/jackify/engine/Wabbajack.Networking.BethesdaNet.dll and b/jackify/engine/Wabbajack.Networking.BethesdaNet.dll differ diff --git a/jackify/engine/Wabbajack.Networking.Discord.dll b/jackify/engine/Wabbajack.Networking.Discord.dll index 744aafc..9a3c657 100644 Binary files a/jackify/engine/Wabbajack.Networking.Discord.dll and b/jackify/engine/Wabbajack.Networking.Discord.dll differ diff --git a/jackify/engine/Wabbajack.Networking.GitHub.dll b/jackify/engine/Wabbajack.Networking.GitHub.dll index 502cae9..2c24bc6 100644 Binary files a/jackify/engine/Wabbajack.Networking.GitHub.dll and b/jackify/engine/Wabbajack.Networking.GitHub.dll differ diff --git a/jackify/engine/Wabbajack.Networking.Http.Interfaces.dll b/jackify/engine/Wabbajack.Networking.Http.Interfaces.dll index 27ea398..31a2373 100644 Binary files a/jackify/engine/Wabbajack.Networking.Http.Interfaces.dll and b/jackify/engine/Wabbajack.Networking.Http.Interfaces.dll differ diff --git a/jackify/engine/Wabbajack.Networking.Http.dll b/jackify/engine/Wabbajack.Networking.Http.dll index 1e00078..0f6bf9a 100644 Binary files a/jackify/engine/Wabbajack.Networking.Http.dll and b/jackify/engine/Wabbajack.Networking.Http.dll differ diff --git a/jackify/engine/Wabbajack.Networking.NexusApi.dll b/jackify/engine/Wabbajack.Networking.NexusApi.dll index fcdb487..16657d1 100644 Binary files a/jackify/engine/Wabbajack.Networking.NexusApi.dll and b/jackify/engine/Wabbajack.Networking.NexusApi.dll differ diff --git a/jackify/engine/Wabbajack.Networking.WabbajackClientApi.dll b/jackify/engine/Wabbajack.Networking.WabbajackClientApi.dll index 9d4aa7d..e304537 100644 Binary files a/jackify/engine/Wabbajack.Networking.WabbajackClientApi.dll and b/jackify/engine/Wabbajack.Networking.WabbajackClientApi.dll differ diff --git a/jackify/engine/Wabbajack.Paths.IO.dll b/jackify/engine/Wabbajack.Paths.IO.dll index 74be9d3..bb19a72 100644 Binary files a/jackify/engine/Wabbajack.Paths.IO.dll and b/jackify/engine/Wabbajack.Paths.IO.dll differ diff --git a/jackify/engine/Wabbajack.Paths.dll b/jackify/engine/Wabbajack.Paths.dll index 1a0a62a..6ff6f21 100644 Binary files a/jackify/engine/Wabbajack.Paths.dll and b/jackify/engine/Wabbajack.Paths.dll differ diff --git a/jackify/engine/Wabbajack.RateLimiter.dll b/jackify/engine/Wabbajack.RateLimiter.dll index 25c7185..3d5d578 100644 Binary files a/jackify/engine/Wabbajack.RateLimiter.dll and b/jackify/engine/Wabbajack.RateLimiter.dll differ diff --git a/jackify/engine/Wabbajack.Server.Lib.dll b/jackify/engine/Wabbajack.Server.Lib.dll index 4b44201..05d52c0 100644 Binary files a/jackify/engine/Wabbajack.Server.Lib.dll and b/jackify/engine/Wabbajack.Server.Lib.dll differ diff --git a/jackify/engine/Wabbajack.Services.OSIntegrated.dll b/jackify/engine/Wabbajack.Services.OSIntegrated.dll index 257db89..772ca43 100644 Binary files a/jackify/engine/Wabbajack.Services.OSIntegrated.dll and b/jackify/engine/Wabbajack.Services.OSIntegrated.dll differ diff --git a/jackify/engine/Wabbajack.VFS.Interfaces.dll b/jackify/engine/Wabbajack.VFS.Interfaces.dll index 8c077ff..66f1454 100644 Binary files a/jackify/engine/Wabbajack.VFS.Interfaces.dll and b/jackify/engine/Wabbajack.VFS.Interfaces.dll differ diff --git a/jackify/engine/Wabbajack.VFS.dll b/jackify/engine/Wabbajack.VFS.dll index 11c0607..400e7a7 100644 Binary files a/jackify/engine/Wabbajack.VFS.dll and b/jackify/engine/Wabbajack.VFS.dll differ diff --git a/jackify/engine/jackify-engine.deps.json b/jackify/engine/jackify-engine.deps.json index 4c3c478..c2217a7 100644 --- a/jackify/engine/jackify-engine.deps.json +++ b/jackify/engine/jackify-engine.deps.json @@ -7,7 +7,7 @@ "targets": { ".NETCoreApp,Version=v8.0": {}, ".NETCoreApp,Version=v8.0/linux-x64": { - "jackify-engine/0.5.0": { + "jackify-engine/0.5.1": { "dependencies": { "Markdig": "0.40.0", "Microsoft.Extensions.Configuration.Json": "9.0.1", @@ -22,16 +22,16 @@ "SixLabors.ImageSharp": "3.1.6", "System.CommandLine": "2.0.0-beta4.22272.1", "System.CommandLine.NamingConventionBinder": "2.0.0-beta4.22272.1", - "Wabbajack.CLI.Builder": "0.5.0", - "Wabbajack.Downloaders.Bethesda": "0.5.0", - "Wabbajack.Downloaders.Dispatcher": "0.5.0", - "Wabbajack.Hashing.xxHash64": "0.5.0", - "Wabbajack.Networking.Discord": "0.5.0", - "Wabbajack.Networking.GitHub": "0.5.0", - "Wabbajack.Paths.IO": "0.5.0", - "Wabbajack.Server.Lib": "0.5.0", - "Wabbajack.Services.OSIntegrated": "0.5.0", - "Wabbajack.VFS": "0.5.0", + "Wabbajack.CLI.Builder": "0.5.1", + "Wabbajack.Downloaders.Bethesda": "0.5.1", + "Wabbajack.Downloaders.Dispatcher": "0.5.1", + "Wabbajack.Hashing.xxHash64": "0.5.1", + "Wabbajack.Networking.Discord": "0.5.1", + "Wabbajack.Networking.GitHub": "0.5.1", + "Wabbajack.Paths.IO": "0.5.1", + "Wabbajack.Server.Lib": "0.5.1", + "Wabbajack.Services.OSIntegrated": "0.5.1", + "Wabbajack.VFS": "0.5.1", "MegaApiClient": "1.0.0.0", "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": { "Microsoft.Extensions.Configuration.Json": "9.0.1", "Microsoft.Extensions.DependencyInjection": "9.0.1", @@ -1791,109 +1791,109 @@ "Microsoft.Extensions.Logging.Abstractions": "9.0.1", "System.CommandLine": "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": { "Wabbajack.CLI.Builder.dll": {} } }, - "Wabbajack.Common/0.5.0": { + "Wabbajack.Common/0.5.1": { "dependencies": { "Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1", "System.Reactive": "6.0.1", - "Wabbajack.DTOs": "0.5.0", - "Wabbajack.Networking.Http": "0.5.0", - "Wabbajack.Paths.IO": "0.5.0" + "Wabbajack.DTOs": "0.5.1", + "Wabbajack.Networking.Http": "0.5.1", + "Wabbajack.Paths.IO": "0.5.1" }, "runtime": { "Wabbajack.Common.dll": {} } }, - "Wabbajack.Compiler/0.5.0": { + "Wabbajack.Compiler/0.5.1": { "dependencies": { "F23.StringSimilarity": "6.0.0", "Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Newtonsoft.Json": "13.0.3", "SixLabors.ImageSharp": "3.1.6", - "Wabbajack.Downloaders.Dispatcher": "0.5.0", - "Wabbajack.Installer": "0.5.0", - "Wabbajack.VFS": "0.5.0", + "Wabbajack.Downloaders.Dispatcher": "0.5.1", + "Wabbajack.Installer": "0.5.1", + "Wabbajack.VFS": "0.5.1", "ini-parser-netstandard": "2.5.2" }, "runtime": { "Wabbajack.Compiler.dll": {} } }, - "Wabbajack.Compression.BSA/0.5.0": { + "Wabbajack.Compression.BSA/0.5.1": { "dependencies": { "K4os.Compression.LZ4.Streams": "1.3.8", "Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "SharpZipLib": "1.4.2", - "Wabbajack.Common": "0.5.0", - "Wabbajack.DTOs": "0.5.0" + "Wabbajack.Common": "0.5.1", + "Wabbajack.DTOs": "0.5.1" }, "runtime": { "Wabbajack.Compression.BSA.dll": {} } }, - "Wabbajack.Compression.Zip/0.5.0": { + "Wabbajack.Compression.Zip/0.5.1": { "dependencies": { - "Wabbajack.IO.Async": "0.5.0" + "Wabbajack.IO.Async": "0.5.1" }, "runtime": { "Wabbajack.Compression.Zip.dll": {} } }, - "Wabbajack.Configuration/0.5.0": { + "Wabbajack.Configuration/0.5.1": { "runtime": { "Wabbajack.Configuration.dll": {} } }, - "Wabbajack.Downloaders.Bethesda/0.5.0": { + "Wabbajack.Downloaders.Bethesda/0.5.1": { "dependencies": { "LibAES-CTR": "1.1.0", "Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "SharpZipLib": "1.4.2", - "Wabbajack.Common": "0.5.0", - "Wabbajack.Downloaders.Interfaces": "0.5.0", - "Wabbajack.Networking.BethesdaNet": "0.5.0" + "Wabbajack.Common": "0.5.1", + "Wabbajack.Downloaders.Interfaces": "0.5.1", + "Wabbajack.Networking.BethesdaNet": "0.5.1" }, "runtime": { "Wabbajack.Downloaders.Bethesda.dll": {} } }, - "Wabbajack.Downloaders.Dispatcher/0.5.0": { + "Wabbajack.Downloaders.Dispatcher/0.5.1": { "dependencies": { "Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Newtonsoft.Json": "13.0.3", "SixLabors.ImageSharp": "3.1.6", - "Wabbajack.Downloaders.Bethesda": "0.5.0", - "Wabbajack.Downloaders.GameFile": "0.5.0", - "Wabbajack.Downloaders.GoogleDrive": "0.5.0", - "Wabbajack.Downloaders.Http": "0.5.0", - "Wabbajack.Downloaders.IPS4OAuth2Downloader": "0.5.0", - "Wabbajack.Downloaders.Interfaces": "0.5.0", - "Wabbajack.Downloaders.Manual": "0.5.0", - "Wabbajack.Downloaders.MediaFire": "0.5.0", - "Wabbajack.Downloaders.Mega": "0.5.0", - "Wabbajack.Downloaders.ModDB": "0.5.0", - "Wabbajack.Downloaders.Nexus": "0.5.0", - "Wabbajack.Downloaders.VerificationCache": "0.5.0", - "Wabbajack.Downloaders.WabbajackCDN": "0.5.0", - "Wabbajack.Networking.WabbajackClientApi": "0.5.0" + "Wabbajack.Downloaders.Bethesda": "0.5.1", + "Wabbajack.Downloaders.GameFile": "0.5.1", + "Wabbajack.Downloaders.GoogleDrive": "0.5.1", + "Wabbajack.Downloaders.Http": "0.5.1", + "Wabbajack.Downloaders.IPS4OAuth2Downloader": "0.5.1", + "Wabbajack.Downloaders.Interfaces": "0.5.1", + "Wabbajack.Downloaders.Manual": "0.5.1", + "Wabbajack.Downloaders.MediaFire": "0.5.1", + "Wabbajack.Downloaders.Mega": "0.5.1", + "Wabbajack.Downloaders.ModDB": "0.5.1", + "Wabbajack.Downloaders.Nexus": "0.5.1", + "Wabbajack.Downloaders.VerificationCache": "0.5.1", + "Wabbajack.Downloaders.WabbajackCDN": "0.5.1", + "Wabbajack.Networking.WabbajackClientApi": "0.5.1" }, "runtime": { "Wabbajack.Downloaders.Dispatcher.dll": {} } }, - "Wabbajack.Downloaders.GameFile/0.5.0": { + "Wabbajack.Downloaders.GameFile/0.5.1": { "dependencies": { "GameFinder.StoreHandlers.EADesktop": "4.5.0", "GameFinder.StoreHandlers.EGS": "4.5.0", @@ -1903,361 +1903,361 @@ "Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "SixLabors.ImageSharp": "3.1.6", - "Wabbajack.Downloaders.Interfaces": "0.5.0", - "Wabbajack.VFS": "0.5.0" + "Wabbajack.Downloaders.Interfaces": "0.5.1", + "Wabbajack.VFS": "0.5.1" }, "runtime": { "Wabbajack.Downloaders.GameFile.dll": {} } }, - "Wabbajack.Downloaders.GoogleDrive/0.5.0": { + "Wabbajack.Downloaders.GoogleDrive/0.5.1": { "dependencies": { "HtmlAgilityPack": "1.11.72", "Microsoft.AspNetCore.Http.Extensions": "2.3.0", "Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1", - "Wabbajack.Common": "0.5.0", - "Wabbajack.DTOs": "0.5.0", - "Wabbajack.Downloaders.Interfaces": "0.5.0", - "Wabbajack.Networking.Http": "0.5.0", - "Wabbajack.Networking.Http.Interfaces": "0.5.0" + "Wabbajack.Common": "0.5.1", + "Wabbajack.DTOs": "0.5.1", + "Wabbajack.Downloaders.Interfaces": "0.5.1", + "Wabbajack.Networking.Http": "0.5.1", + "Wabbajack.Networking.Http.Interfaces": "0.5.1" }, "runtime": { "Wabbajack.Downloaders.GoogleDrive.dll": {} } }, - "Wabbajack.Downloaders.Http/0.5.0": { + "Wabbajack.Downloaders.Http/0.5.1": { "dependencies": { "Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1", - "Wabbajack.Common": "0.5.0", - "Wabbajack.DTOs": "0.5.0", - "Wabbajack.Downloaders.Interfaces": "0.5.0", - "Wabbajack.Networking.BethesdaNet": "0.5.0", - "Wabbajack.Networking.Http.Interfaces": "0.5.0", - "Wabbajack.Paths.IO": "0.5.0" + "Wabbajack.Common": "0.5.1", + "Wabbajack.DTOs": "0.5.1", + "Wabbajack.Downloaders.Interfaces": "0.5.1", + "Wabbajack.Networking.BethesdaNet": "0.5.1", + "Wabbajack.Networking.Http.Interfaces": "0.5.1", + "Wabbajack.Paths.IO": "0.5.1" }, "runtime": { "Wabbajack.Downloaders.Http.dll": {} } }, - "Wabbajack.Downloaders.Interfaces/0.5.0": { + "Wabbajack.Downloaders.Interfaces/0.5.1": { "dependencies": { "Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", - "Wabbajack.Compression.Zip": "0.5.0", - "Wabbajack.DTOs": "0.5.0", - "Wabbajack.Paths.IO": "0.5.0" + "Wabbajack.Compression.Zip": "0.5.1", + "Wabbajack.DTOs": "0.5.1", + "Wabbajack.Paths.IO": "0.5.1" }, "runtime": { "Wabbajack.Downloaders.Interfaces.dll": {} } }, - "Wabbajack.Downloaders.IPS4OAuth2Downloader/0.5.0": { + "Wabbajack.Downloaders.IPS4OAuth2Downloader/0.5.1": { "dependencies": { "F23.StringSimilarity": "6.0.0", "Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1", - "Wabbajack.Common": "0.5.0", - "Wabbajack.Downloaders.Interfaces": "0.5.0", - "Wabbajack.Networking.Http": "0.5.0", - "Wabbajack.Networking.Http.Interfaces": "0.5.0" + "Wabbajack.Common": "0.5.1", + "Wabbajack.Downloaders.Interfaces": "0.5.1", + "Wabbajack.Networking.Http": "0.5.1", + "Wabbajack.Networking.Http.Interfaces": "0.5.1" }, "runtime": { "Wabbajack.Downloaders.IPS4OAuth2Downloader.dll": {} } }, - "Wabbajack.Downloaders.Manual/0.5.0": { + "Wabbajack.Downloaders.Manual/0.5.1": { "dependencies": { "Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1", - "Wabbajack.Common": "0.5.0", - "Wabbajack.Downloaders.Interfaces": "0.5.0" + "Wabbajack.Common": "0.5.1", + "Wabbajack.Downloaders.Interfaces": "0.5.1" }, "runtime": { "Wabbajack.Downloaders.Manual.dll": {} } }, - "Wabbajack.Downloaders.MediaFire/0.5.0": { + "Wabbajack.Downloaders.MediaFire/0.5.1": { "dependencies": { "HtmlAgilityPack": "1.11.72", "Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1", - "Wabbajack.Common": "0.5.0", - "Wabbajack.Downloaders.Interfaces": "0.5.0", - "Wabbajack.Networking.Http.Interfaces": "0.5.0" + "Wabbajack.Common": "0.5.1", + "Wabbajack.Downloaders.Interfaces": "0.5.1", + "Wabbajack.Networking.Http.Interfaces": "0.5.1" }, "runtime": { "Wabbajack.Downloaders.MediaFire.dll": {} } }, - "Wabbajack.Downloaders.Mega/0.5.0": { + "Wabbajack.Downloaders.Mega/0.5.1": { "dependencies": { "Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Newtonsoft.Json": "13.0.3", - "Wabbajack.Common": "0.5.0", - "Wabbajack.Downloaders.Interfaces": "0.5.0", - "Wabbajack.Paths.IO": "0.5.0" + "Wabbajack.Common": "0.5.1", + "Wabbajack.Downloaders.Interfaces": "0.5.1", + "Wabbajack.Paths.IO": "0.5.1" }, "runtime": { "Wabbajack.Downloaders.Mega.dll": {} } }, - "Wabbajack.Downloaders.ModDB/0.5.0": { + "Wabbajack.Downloaders.ModDB/0.5.1": { "dependencies": { "HtmlAgilityPack": "1.11.72", "Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Newtonsoft.Json": "13.0.3", - "Wabbajack.Common": "0.5.0", - "Wabbajack.Downloaders.Interfaces": "0.5.0", - "Wabbajack.Networking.Http": "0.5.0", - "Wabbajack.Networking.Http.Interfaces": "0.5.0" + "Wabbajack.Common": "0.5.1", + "Wabbajack.Downloaders.Interfaces": "0.5.1", + "Wabbajack.Networking.Http": "0.5.1", + "Wabbajack.Networking.Http.Interfaces": "0.5.1" }, "runtime": { "Wabbajack.Downloaders.ModDB.dll": {} } }, - "Wabbajack.Downloaders.Nexus/0.5.0": { + "Wabbajack.Downloaders.Nexus/0.5.1": { "dependencies": { "Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", - "Wabbajack.DTOs": "0.5.0", - "Wabbajack.Downloaders.Interfaces": "0.5.0", - "Wabbajack.Hashing.xxHash64": "0.5.0", - "Wabbajack.Networking.Http": "0.5.0", - "Wabbajack.Networking.Http.Interfaces": "0.5.0", - "Wabbajack.Networking.NexusApi": "0.5.0", - "Wabbajack.Paths": "0.5.0" + "Wabbajack.DTOs": "0.5.1", + "Wabbajack.Downloaders.Interfaces": "0.5.1", + "Wabbajack.Hashing.xxHash64": "0.5.1", + "Wabbajack.Networking.Http": "0.5.1", + "Wabbajack.Networking.Http.Interfaces": "0.5.1", + "Wabbajack.Networking.NexusApi": "0.5.1", + "Wabbajack.Paths": "0.5.1" }, "runtime": { "Wabbajack.Downloaders.Nexus.dll": {} } }, - "Wabbajack.Downloaders.VerificationCache/0.5.0": { + "Wabbajack.Downloaders.VerificationCache/0.5.1": { "dependencies": { "Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Stub.System.Data.SQLite.Core.NetStandard": "1.0.119", - "Wabbajack.DTOs": "0.5.0", - "Wabbajack.Paths.IO": "0.5.0" + "Wabbajack.DTOs": "0.5.1", + "Wabbajack.Paths.IO": "0.5.1" }, "runtime": { "Wabbajack.Downloaders.VerificationCache.dll": {} } }, - "Wabbajack.Downloaders.WabbajackCDN/0.5.0": { + "Wabbajack.Downloaders.WabbajackCDN/0.5.1": { "dependencies": { "Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Microsoft.Toolkit.HighPerformance": "7.1.2", - "Wabbajack.Common": "0.5.0", - "Wabbajack.Downloaders.Interfaces": "0.5.0", - "Wabbajack.Networking.Http": "0.5.0", - "Wabbajack.RateLimiter": "0.5.0" + "Wabbajack.Common": "0.5.1", + "Wabbajack.Downloaders.Interfaces": "0.5.1", + "Wabbajack.Networking.Http": "0.5.1", + "Wabbajack.RateLimiter": "0.5.1" }, "runtime": { "Wabbajack.Downloaders.WabbajackCDN.dll": {} } }, - "Wabbajack.DTOs/0.5.0": { + "Wabbajack.DTOs/0.5.1": { "dependencies": { "Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", - "Wabbajack.Hashing.xxHash64": "0.5.0", - "Wabbajack.Paths": "0.5.0" + "Wabbajack.Hashing.xxHash64": "0.5.1", + "Wabbajack.Paths": "0.5.1" }, "runtime": { "Wabbajack.DTOs.dll": {} } }, - "Wabbajack.FileExtractor/0.5.0": { + "Wabbajack.FileExtractor/0.5.1": { "dependencies": { "Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1", "OMODFramework": "3.0.1", - "Wabbajack.Common": "0.5.0", - "Wabbajack.Compression.BSA": "0.5.0", - "Wabbajack.Hashing.PHash": "0.5.0", - "Wabbajack.Paths": "0.5.0" + "Wabbajack.Common": "0.5.1", + "Wabbajack.Compression.BSA": "0.5.1", + "Wabbajack.Hashing.PHash": "0.5.1", + "Wabbajack.Paths": "0.5.1" }, "runtime": { "Wabbajack.FileExtractor.dll": {} } }, - "Wabbajack.Hashing.PHash/0.5.0": { + "Wabbajack.Hashing.PHash/0.5.1": { "dependencies": { "BCnEncoder.Net.ImageSharp": "1.1.1", "Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Shipwreck.Phash": "0.5.0", "SixLabors.ImageSharp": "3.1.6", - "Wabbajack.Common": "0.5.0", - "Wabbajack.DTOs": "0.5.0", - "Wabbajack.Paths": "0.5.0", - "Wabbajack.Paths.IO": "0.5.0" + "Wabbajack.Common": "0.5.1", + "Wabbajack.DTOs": "0.5.1", + "Wabbajack.Paths": "0.5.1", + "Wabbajack.Paths.IO": "0.5.1" }, "runtime": { "Wabbajack.Hashing.PHash.dll": {} } }, - "Wabbajack.Hashing.xxHash64/0.5.0": { + "Wabbajack.Hashing.xxHash64/0.5.1": { "dependencies": { - "Wabbajack.Paths": "0.5.0", - "Wabbajack.RateLimiter": "0.5.0" + "Wabbajack.Paths": "0.5.1", + "Wabbajack.RateLimiter": "0.5.1" }, "runtime": { "Wabbajack.Hashing.xxHash64.dll": {} } }, - "Wabbajack.Installer/0.5.0": { + "Wabbajack.Installer/0.5.1": { "dependencies": { "Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Newtonsoft.Json": "13.0.3", "Octopus.Octodiff": "2.0.548", "SixLabors.ImageSharp": "3.1.6", - "Wabbajack.DTOs": "0.5.0", - "Wabbajack.Downloaders.Dispatcher": "0.5.0", - "Wabbajack.Downloaders.GameFile": "0.5.0", - "Wabbajack.FileExtractor": "0.5.0", - "Wabbajack.Networking.NexusApi": "0.5.0", - "Wabbajack.Networking.WabbajackClientApi": "0.5.0", - "Wabbajack.Paths": "0.5.0", - "Wabbajack.Paths.IO": "0.5.0", - "Wabbajack.VFS": "0.5.0", + "Wabbajack.DTOs": "0.5.1", + "Wabbajack.Downloaders.Dispatcher": "0.5.1", + "Wabbajack.Downloaders.GameFile": "0.5.1", + "Wabbajack.FileExtractor": "0.5.1", + "Wabbajack.Networking.NexusApi": "0.5.1", + "Wabbajack.Networking.WabbajackClientApi": "0.5.1", + "Wabbajack.Paths": "0.5.1", + "Wabbajack.Paths.IO": "0.5.1", + "Wabbajack.VFS": "0.5.1", "ini-parser-netstandard": "2.5.2" }, "runtime": { "Wabbajack.Installer.dll": {} } }, - "Wabbajack.IO.Async/0.5.0": { + "Wabbajack.IO.Async/0.5.1": { "runtime": { "Wabbajack.IO.Async.dll": {} } }, - "Wabbajack.Networking.BethesdaNet/0.5.0": { + "Wabbajack.Networking.BethesdaNet/0.5.1": { "dependencies": { "Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", - "Wabbajack.DTOs": "0.5.0", - "Wabbajack.Networking.Http": "0.5.0", - "Wabbajack.Networking.Http.Interfaces": "0.5.0" + "Wabbajack.DTOs": "0.5.1", + "Wabbajack.Networking.Http": "0.5.1", + "Wabbajack.Networking.Http.Interfaces": "0.5.1" }, "runtime": { "Wabbajack.Networking.BethesdaNet.dll": {} } }, - "Wabbajack.Networking.Discord/0.5.0": { + "Wabbajack.Networking.Discord/0.5.1": { "dependencies": { "Microsoft.Extensions.DependencyInjection.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": { "Wabbajack.Networking.Discord.dll": {} } }, - "Wabbajack.Networking.GitHub/0.5.0": { + "Wabbajack.Networking.GitHub/0.5.1": { "dependencies": { "Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Octokit": "14.0.0", - "Wabbajack.DTOs": "0.5.0", - "Wabbajack.Networking.Http.Interfaces": "0.5.0" + "Wabbajack.DTOs": "0.5.1", + "Wabbajack.Networking.Http.Interfaces": "0.5.1" }, "runtime": { "Wabbajack.Networking.GitHub.dll": {} } }, - "Wabbajack.Networking.Http/0.5.0": { + "Wabbajack.Networking.Http/0.5.1": { "dependencies": { "Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.Http": "9.0.1", "Microsoft.Extensions.Logging": "9.0.1", - "Wabbajack.Configuration": "0.5.0", - "Wabbajack.Downloaders.Interfaces": "0.5.0", - "Wabbajack.Hashing.xxHash64": "0.5.0", - "Wabbajack.Networking.Http.Interfaces": "0.5.0", - "Wabbajack.Paths": "0.5.0", - "Wabbajack.Paths.IO": "0.5.0" + "Wabbajack.Configuration": "0.5.1", + "Wabbajack.Downloaders.Interfaces": "0.5.1", + "Wabbajack.Hashing.xxHash64": "0.5.1", + "Wabbajack.Networking.Http.Interfaces": "0.5.1", + "Wabbajack.Paths": "0.5.1", + "Wabbajack.Paths.IO": "0.5.1" }, "runtime": { "Wabbajack.Networking.Http.dll": {} } }, - "Wabbajack.Networking.Http.Interfaces/0.5.0": { + "Wabbajack.Networking.Http.Interfaces/0.5.1": { "dependencies": { - "Wabbajack.Hashing.xxHash64": "0.5.0" + "Wabbajack.Hashing.xxHash64": "0.5.1" }, "runtime": { "Wabbajack.Networking.Http.Interfaces.dll": {} } }, - "Wabbajack.Networking.NexusApi/0.5.0": { + "Wabbajack.Networking.NexusApi/0.5.1": { "dependencies": { "Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1", - "Wabbajack.DTOs": "0.5.0", - "Wabbajack.Networking.Http": "0.5.0", - "Wabbajack.Networking.Http.Interfaces": "0.5.0", - "Wabbajack.Networking.WabbajackClientApi": "0.5.0" + "Wabbajack.DTOs": "0.5.1", + "Wabbajack.Networking.Http": "0.5.1", + "Wabbajack.Networking.Http.Interfaces": "0.5.1", + "Wabbajack.Networking.WabbajackClientApi": "0.5.1" }, "runtime": { "Wabbajack.Networking.NexusApi.dll": {} } }, - "Wabbajack.Networking.WabbajackClientApi/0.5.0": { + "Wabbajack.Networking.WabbajackClientApi/0.5.1": { "dependencies": { "Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1", "Octokit": "14.0.0", - "Wabbajack.Common": "0.5.0", - "Wabbajack.DTOs": "0.5.0", - "Wabbajack.Paths.IO": "0.5.0", - "Wabbajack.VFS.Interfaces": "0.5.0", + "Wabbajack.Common": "0.5.1", + "Wabbajack.DTOs": "0.5.1", + "Wabbajack.Paths.IO": "0.5.1", + "Wabbajack.VFS.Interfaces": "0.5.1", "YamlDotNet": "16.3.0" }, "runtime": { "Wabbajack.Networking.WabbajackClientApi.dll": {} } }, - "Wabbajack.Paths/0.5.0": { + "Wabbajack.Paths/0.5.1": { "runtime": { "Wabbajack.Paths.dll": {} } }, - "Wabbajack.Paths.IO/0.5.0": { + "Wabbajack.Paths.IO/0.5.1": { "dependencies": { - "Wabbajack.Paths": "0.5.0", + "Wabbajack.Paths": "0.5.1", "shortid": "4.0.0" }, "runtime": { "Wabbajack.Paths.IO.dll": {} } }, - "Wabbajack.RateLimiter/0.5.0": { + "Wabbajack.RateLimiter/0.5.1": { "runtime": { "Wabbajack.RateLimiter.dll": {} } }, - "Wabbajack.Server.Lib/0.5.0": { + "Wabbajack.Server.Lib/0.5.1": { "dependencies": { "FluentFTP": "52.0.0", "Microsoft.Extensions.DependencyInjection": "9.0.1", @@ -2265,58 +2265,58 @@ "Nettle": "3.0.0", "Newtonsoft.Json": "13.0.3", "SixLabors.ImageSharp": "3.1.6", - "Wabbajack.Common": "0.5.0", - "Wabbajack.Networking.Http.Interfaces": "0.5.0", - "Wabbajack.Services.OSIntegrated": "0.5.0" + "Wabbajack.Common": "0.5.1", + "Wabbajack.Networking.Http.Interfaces": "0.5.1", + "Wabbajack.Services.OSIntegrated": "0.5.1" }, "runtime": { "Wabbajack.Server.Lib.dll": {} } }, - "Wabbajack.Services.OSIntegrated/0.5.0": { + "Wabbajack.Services.OSIntegrated/0.5.1": { "dependencies": { "DeviceId": "6.8.0", "Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Newtonsoft.Json": "13.0.3", "SixLabors.ImageSharp": "3.1.6", - "Wabbajack.Compiler": "0.5.0", - "Wabbajack.Downloaders.Dispatcher": "0.5.0", - "Wabbajack.Installer": "0.5.0", - "Wabbajack.Networking.BethesdaNet": "0.5.0", - "Wabbajack.Networking.Discord": "0.5.0", - "Wabbajack.VFS": "0.5.0" + "Wabbajack.Compiler": "0.5.1", + "Wabbajack.Downloaders.Dispatcher": "0.5.1", + "Wabbajack.Installer": "0.5.1", + "Wabbajack.Networking.BethesdaNet": "0.5.1", + "Wabbajack.Networking.Discord": "0.5.1", + "Wabbajack.VFS": "0.5.1" }, "runtime": { "Wabbajack.Services.OSIntegrated.dll": {} } }, - "Wabbajack.VFS/0.5.0": { + "Wabbajack.VFS/0.5.1": { "dependencies": { "Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", "Microsoft.Extensions.Logging.Abstractions": "9.0.1", "SixLabors.ImageSharp": "3.1.6", "System.Data.SQLite.Core": "1.0.119", - "Wabbajack.Common": "0.5.0", - "Wabbajack.FileExtractor": "0.5.0", - "Wabbajack.Hashing.PHash": "0.5.0", - "Wabbajack.Hashing.xxHash64": "0.5.0", - "Wabbajack.Paths": "0.5.0", - "Wabbajack.Paths.IO": "0.5.0", - "Wabbajack.VFS.Interfaces": "0.5.0" + "Wabbajack.Common": "0.5.1", + "Wabbajack.FileExtractor": "0.5.1", + "Wabbajack.Hashing.PHash": "0.5.1", + "Wabbajack.Hashing.xxHash64": "0.5.1", + "Wabbajack.Paths": "0.5.1", + "Wabbajack.Paths.IO": "0.5.1", + "Wabbajack.VFS.Interfaces": "0.5.1" }, "runtime": { "Wabbajack.VFS.dll": {} } }, - "Wabbajack.VFS.Interfaces/0.5.0": { + "Wabbajack.VFS.Interfaces/0.5.1": { "dependencies": { "Microsoft.Extensions.DependencyInjection": "9.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", - "Wabbajack.DTOs": "0.5.0", - "Wabbajack.Hashing.xxHash64": "0.5.0", - "Wabbajack.Paths": "0.5.0" + "Wabbajack.DTOs": "0.5.1", + "Wabbajack.Hashing.xxHash64": "0.5.1", + "Wabbajack.Paths": "0.5.1" }, "runtime": { "Wabbajack.VFS.Interfaces.dll": {} @@ -2333,7 +2333,7 @@ } }, "libraries": { - "jackify-engine/0.5.0": { + "jackify-engine/0.5.1": { "type": "project", "serviceable": false, "sha512": "" @@ -3022,202 +3022,202 @@ "path": "yamldotnet/16.3.0", "hashPath": "yamldotnet.16.3.0.nupkg.sha512" }, - "Wabbajack.CLI.Builder/0.5.0": { + "Wabbajack.CLI.Builder/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.Common/0.5.0": { + "Wabbajack.Common/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.Compiler/0.5.0": { + "Wabbajack.Compiler/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.Compression.BSA/0.5.0": { + "Wabbajack.Compression.BSA/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.Compression.Zip/0.5.0": { + "Wabbajack.Compression.Zip/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.Configuration/0.5.0": { + "Wabbajack.Configuration/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.Downloaders.Bethesda/0.5.0": { + "Wabbajack.Downloaders.Bethesda/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.Downloaders.Dispatcher/0.5.0": { + "Wabbajack.Downloaders.Dispatcher/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.Downloaders.GameFile/0.5.0": { + "Wabbajack.Downloaders.GameFile/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.Downloaders.GoogleDrive/0.5.0": { + "Wabbajack.Downloaders.GoogleDrive/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.Downloaders.Http/0.5.0": { + "Wabbajack.Downloaders.Http/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.Downloaders.Interfaces/0.5.0": { + "Wabbajack.Downloaders.Interfaces/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.Downloaders.IPS4OAuth2Downloader/0.5.0": { + "Wabbajack.Downloaders.IPS4OAuth2Downloader/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.Downloaders.Manual/0.5.0": { + "Wabbajack.Downloaders.Manual/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.Downloaders.MediaFire/0.5.0": { + "Wabbajack.Downloaders.MediaFire/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.Downloaders.Mega/0.5.0": { + "Wabbajack.Downloaders.Mega/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.Downloaders.ModDB/0.5.0": { + "Wabbajack.Downloaders.ModDB/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.Downloaders.Nexus/0.5.0": { + "Wabbajack.Downloaders.Nexus/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.Downloaders.VerificationCache/0.5.0": { + "Wabbajack.Downloaders.VerificationCache/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.Downloaders.WabbajackCDN/0.5.0": { + "Wabbajack.Downloaders.WabbajackCDN/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.DTOs/0.5.0": { + "Wabbajack.DTOs/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.FileExtractor/0.5.0": { + "Wabbajack.FileExtractor/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.Hashing.PHash/0.5.0": { + "Wabbajack.Hashing.PHash/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.Hashing.xxHash64/0.5.0": { + "Wabbajack.Hashing.xxHash64/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.Installer/0.5.0": { + "Wabbajack.Installer/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.IO.Async/0.5.0": { + "Wabbajack.IO.Async/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.Networking.BethesdaNet/0.5.0": { + "Wabbajack.Networking.BethesdaNet/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.Networking.Discord/0.5.0": { + "Wabbajack.Networking.Discord/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.Networking.GitHub/0.5.0": { + "Wabbajack.Networking.GitHub/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.Networking.Http/0.5.0": { + "Wabbajack.Networking.Http/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.Networking.Http.Interfaces/0.5.0": { + "Wabbajack.Networking.Http.Interfaces/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.Networking.NexusApi/0.5.0": { + "Wabbajack.Networking.NexusApi/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.Networking.WabbajackClientApi/0.5.0": { + "Wabbajack.Networking.WabbajackClientApi/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.Paths/0.5.0": { + "Wabbajack.Paths/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.Paths.IO/0.5.0": { + "Wabbajack.Paths.IO/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.RateLimiter/0.5.0": { + "Wabbajack.RateLimiter/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.Server.Lib/0.5.0": { + "Wabbajack.Server.Lib/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.Services.OSIntegrated/0.5.0": { + "Wabbajack.Services.OSIntegrated/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.VFS/0.5.0": { + "Wabbajack.VFS/0.5.1": { "type": "project", "serviceable": false, "sha512": "" }, - "Wabbajack.VFS.Interfaces/0.5.0": { + "Wabbajack.VFS.Interfaces/0.5.1": { "type": "project", "serviceable": false, "sha512": "" diff --git a/jackify/engine/jackify-engine.dll b/jackify/engine/jackify-engine.dll index 52d4f8a..7ee5e17 100644 Binary files a/jackify/engine/jackify-engine.dll and b/jackify/engine/jackify-engine.dll differ diff --git a/jackify/frontends/gui/screens/install_modlist_installer_thread.py b/jackify/frontends/gui/screens/install_modlist_installer_thread.py index dce4c82..b2c9b8e 100644 --- a/jackify/frontends/gui/screens/install_modlist_installer_thread.py +++ b/jackify/frontends/gui/screens/install_modlist_installer_thread.py @@ -34,7 +34,8 @@ class InstallerThread(QThread): non_premium_detected = Signal() 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__() self.modlist = modlist self.install_dir = install_dir @@ -47,6 +48,7 @@ class InstallerThread(QThread): self.progress_state_manager = progress_state_manager self.auth_service = auth_service self.oauth_info = oauth_info + self.skip_disk_check = skip_disk_check self._premium_signal_sent = False self._non_premium_info_sent = False self._engine_output_buffer = [] @@ -56,6 +58,8 @@ class InstallerThread(QThread): self._raw_stdout_lines: list = [] # bounded ring buffer for non-JSON stdout self._pending_manual_downloads: list = [] # accumulates items until list_complete 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 def _is_generic_failure_text(message: Optional[str]) -> bool: @@ -136,6 +140,12 @@ class InstallerThread(QThread): error = parse_engine_error_line(line) if error and self.last_error is None: 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: if self.last_error is None and is_cc_content_error(line): self.last_error = cc_content_missing(extract_cc_filename(line) or "") @@ -265,6 +275,9 @@ class InstallerThread(QThread): if debug_mode: cmd.append('--debug') 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: modlist value being passed: '{self.modlist}'") 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]}") self.progress_updated.emit(progress_state) if '[FILE_PROGRESS]' in decoded: + self._install_progress_started = True parts = decoded.split('[FILE_PROGRESS]', 1) if parts[0].strip(): self.progress_received.emit(parts[0].rstrip()) @@ -427,6 +441,7 @@ class InstallerThread(QThread): continue self._remember_stdout_line(decoded) if '[FILE_PROGRESS]' in decoded: + self._install_progress_started = True parts = decoded.split('[FILE_PROGRESS]', 1) if parts[0].strip(): self.output_received.emit(parts[0].rstrip()) diff --git a/jackify/frontends/gui/screens/install_modlist_progress.py b/jackify/frontends/gui/screens/install_modlist_progress.py index 5e055b9..2f74044 100644 --- a/jackify/frontends/gui/screens/install_modlist_progress.py +++ b/jackify/frontends/gui/screens/install_modlist_progress.py @@ -406,6 +406,18 @@ class ProgressHandlersMixin: if self._premium_failure_active: 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: engine_error = getattr(self.install_thread, 'last_error', None) if engine_error: @@ -417,6 +429,68 @@ class ProgressHandlersMixin: self._safe_append_text(f"\nError: {message}") 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): logger.debug(f"DEBUG: process_finished called with exit_code={exit_code}, exit_status={exit_status}") # Reset button states diff --git a/jackify/frontends/gui/screens/install_modlist_workflow_execution.py b/jackify/frontends/gui/screens/install_modlist_workflow_execution.py index aab452b..01e2056 100644 --- a/jackify/frontends/gui/screens/install_modlist_workflow_execution.py +++ b/jackify/frontends/gui/screens/install_modlist_workflow_execution.py @@ -384,7 +384,7 @@ class InstallWorkflowExecutionMixin: self.cancel_install_btn.setVisible(False) 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') # 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, 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 - 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.progress_received.connect(self.on_installation_progress)