From 0c0cbbab4f4bf9e56d3d03f98c6b2027610ab248 Mon Sep 17 00:00:00 2001 From: Timothy Baldridge Date: Sat, 2 May 2020 21:41:33 -0600 Subject: [PATCH] Implement basics of game folder remapping --- Wabbajack.Common/Paths.cs | 5 +++ Wabbajack.Lib/Tasks/MigrateGameFolder.cs | 53 ++++++++++++++++++++++++ Wabbajack.Test/TasksTests.cs | 35 ++++++++++++++++ 3 files changed, 93 insertions(+) create mode 100644 Wabbajack.Lib/Tasks/MigrateGameFolder.cs create mode 100644 Wabbajack.Test/TasksTests.cs diff --git a/Wabbajack.Common/Paths.cs b/Wabbajack.Common/Paths.cs index 2d786dbf..1a6ec6b2 100644 --- a/Wabbajack.Common/Paths.cs +++ b/Wabbajack.Common/Paths.cs @@ -410,6 +410,11 @@ namespace Wabbajack.Common await file.CopyToAsync(dest); } } + + public async Task CopyOrLinkIfOverSizeAsync(AbsolutePath newFile) + { + await CopyToAsync(newFile); + } } [JsonConverter(typeof(Utils.RelativePathConverter))] diff --git a/Wabbajack.Lib/Tasks/MigrateGameFolder.cs b/Wabbajack.Lib/Tasks/MigrateGameFolder.cs new file mode 100644 index 00000000..ec44215a --- /dev/null +++ b/Wabbajack.Lib/Tasks/MigrateGameFolder.cs @@ -0,0 +1,53 @@ +using System.Threading.Tasks; +using Wabbajack.Common; + +namespace Wabbajack.Lib.Tasks +{ + public class MigrateGameFolder + { + public static async Task Execute(AbsolutePath mo2Folder) + { + var iniPath = mo2Folder.Combine(Consts.ModOrganizer2Ini); + if (iniPath.Exists) + { + Utils.Log($"Game folder conversion failed, {Consts.ModOrganizer2Ini} does not exist in {mo2Folder}"); + return false; + } + + var newGamePath = mo2Folder.Combine(Consts.GameFolderFilesDir); + newGamePath.CreateDirectory(); + var gameIni = iniPath.LoadIniFile(); + + if (!GameRegistry.TryGetByFuzzyName((string)gameIni.General.gameName, out var gameMeta)) + { + Utils.Log($"Could not locate game for {gameIni.General.gameName}"); + return false; + } + + + var orginGamePath = gameMeta.GameLocation(); + foreach (var file in gameMeta.GameLocation().EnumerateFiles()) + { + var relPath = file.RelativeTo(orginGamePath); + var newFile = relPath.RelativeTo(newGamePath); + if (newFile.Exists) + { + Utils.Log($"Skipping {relPath} it already exists in the target path"); + continue; + } + + Utils.Log($"Copying/Linking {relPath}"); + await file.CopyOrLinkIfOverSizeAsync(newFile); + } + + Utils.Log("Remapping INI"); + var iniString = await iniPath.ReadAllTextAsync(); + iniString = iniString.Replace((string)orginGamePath, (string)newGamePath); + iniString = iniString.Replace(((string)orginGamePath).Replace(@"\", @"\\"), ((string)newGamePath).Replace(@"\", @"\\")); + iniString = iniString.Replace(((string)orginGamePath).Replace(@"\", @"/"), ((string)newGamePath).Replace(@"\", @"/")); + await iniPath.WriteAllTextAsync(iniString); + + return true; + } + } +} diff --git a/Wabbajack.Test/TasksTests.cs b/Wabbajack.Test/TasksTests.cs new file mode 100644 index 00000000..6a90e36e --- /dev/null +++ b/Wabbajack.Test/TasksTests.cs @@ -0,0 +1,35 @@ +using System.Threading.Tasks; +using Wabbajack.Common; +using Wabbajack.Lib.Tasks; +using Xunit; + +namespace Wabbajack.Test +{ + public class TasksTests + { + [Fact] + public async Task CanRemapGameFolder() + { + await using var tempFolder = await TempFolder.Create(); + + await tempFolder.Dir.Combine("some_file.txt").WriteAllTextAsync("some_file"); + await tempFolder.Dir.Combine("steam_api64.dll").WriteAllTextAsync("steam_api"); + + + var meta = Game.SkyrimSpecialEdition.MetaData(); + await tempFolder.Dir.Combine(Consts.ModOrganizer2Ini) + .WriteAllLinesAsync( + "[General]", + $"gameName={meta.MO2Name}", + $"gamePath={meta.GameLocation()}", + $"pathDouble={meta.GameLocation().ToString().Replace(@"\", @"\\")}", + $"pathForward={meta.GameLocation().ToString().Replace(@"\", @"/")}"); + + await MigrateGameFolder.Execute(tempFolder.Dir); + + + + + } + } +}