mirror of
https://github.com/xivdev/Penumbra.git
synced 2025-12-12 18:27:24 +01:00
Fix issue with merging and deduplicating.
This commit is contained in:
parent
5cebddb0ab
commit
a65009dfb0
5 changed files with 59 additions and 50 deletions
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue