This commit is contained in:
timerix 2023-04-01 03:41:20 +06:00
parent 4e81f615e2
commit 3d550da77c
5 changed files with 48 additions and 14 deletions

View File

@ -15,6 +15,6 @@
<ProjectReference Include="..\..\DTLib\DTLib\DTLib.csproj" /> <ProjectReference Include="..\..\DTLib\DTLib\DTLib.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup Condition=" '$(Configuration)' != 'Debug' "> <ItemGroup Condition=" '$(Configuration)' != 'Debug' ">
<PackageReference Include="DTLib" Version="1.1.8" /> <PackageReference Include="DTLib" Version="1.2.0" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -2,7 +2,6 @@ using System.Linq;
using DTLib.Console; using DTLib.Console;
using DTLib.Dtsod; using DTLib.Dtsod;
using diff_text; using diff_text;
using DiffMatchPatch;
using DTLib.Ben.Demystifier; using DTLib.Ben.Demystifier;
namespace ParadoxModMerger; namespace ParadoxModMerger;
@ -29,7 +28,7 @@ static class Diff
LogModConflicts(conflicts); LogModConflicts(conflicts);
} }
public static void DiffConflictsCommandHandler(IOPath conflicts_dtsod_path) public static void DiffDetailedCommandHandler(IOPath conflicts_dtsod_path)
{ {
var dtsod = new DtsodV23(File.ReadAllText(conflicts_dtsod_path)); var dtsod = new DtsodV23(File.ReadAllText(conflicts_dtsod_path));
var conflicts = new ConflictingModFile[dtsod.Count]; var conflicts = new ConflictingModFile[dtsod.Count];
@ -233,7 +232,7 @@ static class Diff
var dtsod = new DtsodV23(); var dtsod = new DtsodV23();
foreach (var cfl in conflicts) foreach (var cfl in conflicts)
{ {
Log("m", "file ","c", cfl.FilePath, "m", "in mods", "b", cfl.Mods.MergeToString(", ")); Log("m", "file ","c", cfl.FilePath, "m", " in mods ", "m", cfl.Mods.MergeToString(", "));
dtsod.Add(cfl.FilePath, cfl.Mods); dtsod.Add(cfl.FilePath, cfl.Mods);
} }

View File

@ -8,22 +8,52 @@ static class Merge
static ConsoleLogger logger = new($"logs", "merge"); static ConsoleLogger logger = new($"logs", "merge");
static void Log(params string[] msg) => logger.Log(msg); static void Log(params string[] msg) => logger.Log(msg);
private const string modlist_filename = "modlist.txt";
/// analog of Directory.Copy(srcDir, outDir, true)
/// has special behavior for some files
private static void ModDirCopy(IOPath srcDir, IOPath outDir, IOPath out_modlist_file)
{
var files = Directory.GetAllFiles(srcDir);
for (int i = 0; i < files.Count; i++)
{
string file_basename = files[i].LastName().Str;
if(file_basename=="descriptor.mod") // skip file
continue;
if (file_basename == modlist_filename) // append modlist
{
File.AppendAllText(out_modlist_file, File.ReadAllText(files[i]));
}
var newfile = files[i].ReplaceBase(srcDir, outDir);
File.Copy(files[i], newfile, true);
}
}
public static void MergeAll(IOPath[] moddirs, IOPath outDir) public static void MergeAll(IOPath[] moddirs, IOPath outDir)
{ {
Log("b", $"found {moddirs.Length} mod dirs"); Log("b", $"found {moddirs.Length} mod dirs");
HandleConflicts(moddirs); HandleConflicts(moddirs);
var modnamelist = new string[moddirs.Length];
IOPath out_modlist_file = Path.Concat(outDir, modlist_filename);
for (short i = 0; i < moddirs.Length; i++) for (short i = 0; i < moddirs.Length; i++)
{ {
Log("b", $"[{i + 1}/{moddirs.Length}] merging mod ", "c", $"{moddirs[i]}"); Log("b", $"[{i + 1}/{moddirs.Length}] merging mod ", "c", $"{moddirs[i]}");
Directory.Copy(moddirs[i], outDir, true); ModDirCopy(moddirs[i], outDir, out_modlist_file);
modnamelist[i]=moddirs[i].LastName().Str;
} }
File.AppendAllText(out_modlist_file, modnamelist.MergeToString('\n'));
File.AppendAllText(out_modlist_file, "\n");
} }
public static void MergeInto(IOPath moddir, IOPath outDir) public static void MergeInto(IOPath moddir, IOPath outDir)
{ {
HandleConflicts(new[] { moddir, outDir }); HandleConflicts(new[] { moddir, outDir });
Directory.Copy(moddir, outDir, true); IOPath out_modlist_file = Path.Concat(outDir, modlist_filename);
ModDirCopy(moddir, outDir, modlist_filename);
File.AppendAllText(out_modlist_file, $"{moddir.LastName()}\n");
} }
public static void ConsoleAskYN(string question, Action yes, Action no) public static void ConsoleAskYN(string question, Action yes, Action no)

View File

@ -40,9 +40,9 @@ public static class Program
p=>Diff.DiffCommandHandler(p), p=>Diff.DiffCommandHandler(p),
"first_mod_directory:second_mod_directory:...", "first_mod_directory:second_mod_directory:...",
1), 1),
new LaunchArgument(new []{"diff-conflicts"}, new LaunchArgument(new []{"diff-detailed"},
"reads conflicts_XXX.dtsod file and shows text diff for each file", "reads conflicts_XXX.dtsod file and shows text diff for each file",
p=>Diff.DiffConflictsCommandHandler(p), p=>Diff.DiffDetailedCommandHandler(p),
"conflicts_dtsod_path", "conflicts_dtsod_path",
1 1
), ),
@ -79,9 +79,14 @@ public static class Program
public static IOPath[] SplitStringToPaths(string connected_paths) public static IOPath[] SplitStringToPaths(string connected_paths)
{ {
if (!connected_paths.Contains(':')) char part_sep;
throw new Exception($"<{connected_paths}> doesn't contain any separators (:)"); if (connected_paths.Contains(':'))
string[] split = connected_paths.Split(':'); part_sep = ':';
else if (!connected_paths.Contains(':'))
part_sep = ';';
else throw new Exception($"<{connected_paths}> doesn't contain any separators (:/;)");
string[] split = connected_paths.Split(part_sep);
IOPath[] split_iop = new IOPath[split.Length]; IOPath[] split_iop = new IOPath[split.Length];
for (int i = 0; i < split.Length; i++) for (int i = 0; i < split.Length; i++)
split_iop[i] = new IOPath(split[i]); split_iop[i] = new IOPath(split[i]);

View File

@ -12,14 +12,14 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="DTLib.Ben.Demystifier" Version="1.0.4" /> <PackageReference Include="DTLib.Ben.Demystifier" Version="1.0.4" />
<PackageReference Include="DTLib.Dtsod" Version="1.1.4" /> <PackageReference Include="DTLib.Dtsod" Version="1.2.0" />
<PackageReference Include="Fizzler.Systems.HtmlAgilityPack" Version="1.2.1" /> <PackageReference Include="Fizzler.Systems.HtmlAgilityPack" Version="1.2.1" />
</ItemGroup> </ItemGroup>
<ItemGroup Condition=" '$(Configuration)' == 'Debug' "> <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
<ProjectReference Include="..\..\DTLib\DTLib\DTLib.csproj" /> <ProjectReference Include="..\..\DTLib\DTLib\DTLib.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup Condition=" '$(Configuration)' != 'Debug' "> <ItemGroup Condition=" '$(Configuration)' != 'Debug' ">
<PackageReference Include="DTLib" Version="1.1.8" /> <PackageReference Include="DTLib" Version="1.2.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\diff-text\diff-text.csproj" /> <ProjectReference Include="..\diff-text\diff-text.csproj" />