Fix issue with merging and deduplicating.

This commit is contained in:
Ottermandias 2024-04-01 13:59:09 +02:00
parent 5cebddb0ab
commit a65009dfb0
5 changed files with 59 additions and 50 deletions

View file

@ -1,3 +1,4 @@
using OtterGui.Classes;
using Penumbra.Mods.Manager;
using Penumbra.Mods.Subclasses;
using Penumbra.Services;
@ -81,7 +82,7 @@ public class DuplicateManager(ModManager modManager, SaveService saveService, Co
if (useModManager)
{
modManager.OptionEditor.OptionSetFiles(mod, groupIdx, optionIdx, dict);
modManager.OptionEditor.OptionSetFiles(mod, groupIdx, optionIdx, dict, SaveType.ImmediateSync);
}
else
{
@ -216,18 +217,21 @@ public class DuplicateManager(ModManager modManager, SaveService saveService, Co
}
/// <summary> Deduplicate a mod simply by its directory without any confirmation or waiting time. </summary>
internal void DeduplicateMod(DirectoryInfo modDirectory)
internal void DeduplicateMod(DirectoryInfo modDirectory, bool useModManager = false)
{
try
{
var mod = new Mod(modDirectory);
modManager.Creator.ReloadMod(mod, true, out _);
if (!useModManager || !modManager.TryGetMod(modDirectory.Name, string.Empty, out var mod))
{
mod = new Mod(modDirectory);
modManager.Creator.ReloadMod(mod, true, out _);
}
Clear();
var files = new ModFileCollection();
files.UpdateAll(mod, mod.Default);
CheckDuplicates(files.Available.OrderByDescending(f => f.FileSize).ToArray(), CancellationToken.None);
DeleteDuplicates(files, mod, mod.Default, false);
CheckDuplicates([.. files.Available.OrderByDescending(f => f.FileSize)], CancellationToken.None);
DeleteDuplicates(files, mod, mod.Default, useModManager);
}
catch (Exception e)
{

View file

@ -36,7 +36,7 @@ public class ModMerger : IDisposable
public readonly HashSet<SubMod> SelectedOptions = [];
public readonly IReadOnlyList<string> Warnings = new List<string>();
public readonly IReadOnlyList<string> Warnings = [];
public Exception? Error { get; private set; }
public ModMerger(ModManager mods, ModOptionEditor editor, ModFileSystemSelector selector, DuplicateManager duplicates,
@ -78,7 +78,8 @@ public class ModMerger : IDisposable
MergeWithOptions();
else
MergeIntoOption(OptionGroupName, OptionName);
_duplicates.DeduplicateMod(MergeToMod.ModPath);
_duplicates.DeduplicateMod(MergeToMod.ModPath, true);
}
catch (Exception ex)
{
@ -134,10 +135,10 @@ public class ModMerger : IDisposable
return;
}
var (group, groupIdx, groupCreated) = _editor.FindOrAddModGroup(MergeToMod!, GroupType.Multi, groupName);
var (group, groupIdx, groupCreated) = _editor.FindOrAddModGroup(MergeToMod!, GroupType.Multi, groupName, SaveType.None);
if (groupCreated)
_createdGroups.Add(groupIdx);
var (option, optionCreated) = _editor.FindOrAddOption(MergeToMod!, groupIdx, optionName);
var (option, optionCreated) = _editor.FindOrAddOption(MergeToMod!, groupIdx, optionName, SaveType.None);
if (optionCreated)
_createdOptions.Add(option);
var dir = ModCreator.NewOptionDirectory(MergeToMod!.ModPath, groupName, _config.ReplaceNonAsciiOnImport);
@ -156,27 +157,6 @@ public class ModMerger : IDisposable
var swaps = option.FileSwapData.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
var manips = option.ManipulationData.ToHashSet();
bool GetFullPath(FullPath input, out FullPath ret)
{
if (fromFileToFile)
{
if (!_fileToFile.TryGetValue(input.FullName, out var s))
{
ret = input;
return false;
}
ret = new FullPath(s);
return true;
}
if (!Utf8RelPath.FromFile(input, MergeFromMod!.ModPath, out var relPath))
throw new Exception($"Could not create relative path from {input} and {MergeFromMod!.ModPath}.");
ret = new FullPath(MergeToMod!.ModPath, relPath);
return true;
}
foreach (var originalOption in mergeOptions)
{
foreach (var manip in originalOption.Manipulations)
@ -204,9 +184,31 @@ public class ModMerger : IDisposable
}
}
_editor.OptionSetFiles(MergeToMod!, option.GroupIdx, option.OptionIdx, redirections);
_editor.OptionSetFileSwaps(MergeToMod!, option.GroupIdx, option.OptionIdx, swaps);
_editor.OptionSetManipulations(MergeToMod!, option.GroupIdx, option.OptionIdx, manips);
_editor.OptionSetFiles(MergeToMod!, option.GroupIdx, option.OptionIdx, redirections, SaveType.None);
_editor.OptionSetFileSwaps(MergeToMod!, option.GroupIdx, option.OptionIdx, swaps, SaveType.None);
_editor.OptionSetManipulations(MergeToMod!, option.GroupIdx, option.OptionIdx, manips, SaveType.ImmediateSync);
return;
bool GetFullPath(FullPath input, out FullPath ret)
{
if (fromFileToFile)
{
if (!_fileToFile.TryGetValue(input.FullName, out var s))
{
ret = input;
return false;
}
ret = new FullPath(s);
return true;
}
if (!Utf8RelPath.FromFile(input, MergeFromMod!.ModPath, out var relPath))
throw new Exception($"Could not create relative path from {input} and {MergeFromMod!.ModPath}.");
ret = new FullPath(MergeToMod!.ModPath, relPath);
return true;
}
}
private void CopyFiles(DirectoryInfo directory)