Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 14 additions & 9 deletions .github/workflows/ci-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,23 +19,28 @@ on:
- 'mkdocs.yml'

jobs:
build-test:
build-test:
runs-on: ${{ matrix.os }}

strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
sln:
- MutagenMerger.sln


steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: 9.0.*
- name: Install dependencies
run: |
dotnet clean ${{ matrix.sln }} -c Release && dotnet nuget locals all --clear
dotnet restore ${{ matrix.sln }}
dotnet clean -c Release && dotnet nuget locals all --clear
dotnet restore
dotnet tool restore
- name: Build
run: dotnet build ${{ matrix.sln }} -c Release --no-restore /p:GeneratePackageOnBuild=false
run: dotnet build -c Release --no-restore /p:GeneratePackageOnBuild=false
- name: Test
run: dotnet test ${{ matrix.sln }} -c Release --no-build
run: dotnet test -c Release --no-build
14 changes: 14 additions & 0 deletions Directory.Build.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<Project>
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
<Nullable>enable</Nullable>
<ImplicitUsings>true</ImplicitUsings>
<PackageLicenseExpression>GPL-3.0-only</PackageLicenseExpression>
<PackageProjectUrl>https://github.com/Mutagen-Modding/Mutagen.Bethesda.Merge</PackageProjectUrl>
<RepositoryUrl>https://github.com/Mutagen-Modding/Mutagen.Bethesda.Merge</RepositoryUrl>
<PackageLicenseExpression>GPL-3.0-only</PackageLicenseExpression>
<Copyright>2025</Copyright>
<Company>Mutagen</Company>
<Product>Mutagen</Product>
</PropertyGroup>
</Project>
23 changes: 23 additions & 0 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<Project>
<ItemGroup>
<PackageVersion Include="CommandLineParser" Version="2.9.1" />
<PackageVersion Include="Mutagen.Bethesda" Version="0.51.0-alpha.10" />
<PackageVersion Include="Mutagen.Bethesda.Testing" Version="0.51.0-alpha.10" />
<PackageVersion Include="Noggog.Autofac" Version="2.71.0" />
<PackageVersion Include="DotNet.Glob" Version="3.1.3" />
<PackageVersion Include="Microsoft.Extensions.FileSystemGlobbing" Version="9.0.4" />
<PackageVersion Include="Mono.TextTemplating" Version="3.0.0" />
<PackageVersion Include="Noggog.Testing" Version="2.71.0" />
<PackageVersion Include="System.Json" Version="4.8.0" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.13.0" />
<PackageVersion Include="xunit" Version="2.9.3" />
<PackageVersion Include="xunit.runner.visualstudio" Version="3.1.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageVersion>
<PackageVersion Include="coverlet.collector" Version="6.0.4">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageVersion>
</ItemGroup>
</Project>
15 changes: 15 additions & 0 deletions Mutagen.Bethesda.Merge.CLI/MainModule.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using System.IO.Abstractions;
using Autofac;
using Mutagen.Bethesda.Merge.Lib;

namespace Mutagen.Bethesda.Merge.CLI;

public class MainModule : Autofac.Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType<FileSystem>().As<IFileSystem>()
.SingleInstance();
builder.RegisterModule<MergerModule>();
}
}
17 changes: 17 additions & 0 deletions Mutagen.Bethesda.Merge.CLI/Mutagen.Bethesda.Merge.CLI.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="CommandLineParser" />
<PackageReference Include="Mutagen.Bethesda" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\Mutagen.Bethesda.Merge.Lib\Mutagen.Bethesda.Merge.Lib.csproj" />
</ItemGroup>

</Project>
24 changes: 24 additions & 0 deletions Mutagen.Bethesda.Merge.CLI/Options.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
using CommandLine;

namespace Mutagen.Bethesda.Merge.CLI;

public class Options
{
[Option("game", HelpText = "Game to mod (Default SkyrimSE)")]
public GameRelease Game { get; set; } = GameRelease.SkyrimSE;

[Option("data", HelpText = "Path to the data folder", Required = true)]
public string DataFolder { get; set; } = string.Empty;

[Option("merge", Min = 1, Max = 4096, HelpText = "Plugins to merge")]
public IEnumerable<string> PluginsToMerge { get; set; } = [];

[Option("mergefile", HelpText = "Get plugins to merge from file")]
public string PluginsMergeTxt { get; set; } = string.Empty;

[Option("output", Required = true, HelpText = "Output merge folder")]
public string Output { get; set; } = string.Empty;

[Option("mergename", Required = true, HelpText = "Name of Merge")]
public string MergeName { get; set; } = string.Empty;
}
68 changes: 68 additions & 0 deletions Mutagen.Bethesda.Merge.CLI/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
using System.Diagnostics;
using Autofac;
using CommandLine;
using Mutagen.Bethesda.Environments.DI;
using Mutagen.Bethesda.Fallout4;
using Mutagen.Bethesda.Merge.Lib.DI;
using Mutagen.Bethesda.Oblivion;
using Mutagen.Bethesda.Plugins;
using Mutagen.Bethesda.Skyrim;

namespace Mutagen.Bethesda.Merge.CLI;

public static class Program
{
public static async Task Main(string[] args)
{
await Parser.Default.ParseArguments<Options>(args)
.WithParsedAsync(Run);
}

private static async Task Run(Options options)
{
var modsToMerge = options.PluginsMergeTxt != string.Empty
? (await File.ReadAllLinesAsync(options.PluginsMergeTxt))
.Select(x => ModKey.FromNameAndExtension(x))
.ToList()
: options.PluginsToMerge
.Select(x => ModKey.FromNameAndExtension(x))
.ToList();

if (Directory.Exists(options.Output)) Directory.Delete(options.Output, true);

var sw = new Stopwatch();
sw.Start();

Type[] genericTypes;
switch (options.Game.ToCategory())
{
case GameCategory.Oblivion:
genericTypes = new Type[] { typeof(IOblivionMod), typeof(IOblivionModGetter),typeof(IOblivionMajorRecord), typeof(IOblivionMajorRecordGetter) };
break;
case GameCategory.Fallout4:
genericTypes = new Type[] { typeof(IFallout4Mod), typeof(IFallout4ModGetter), typeof(IFallout4MajorRecord), typeof(IFallout4MajorRecordGetter) };
break;
case GameCategory.Skyrim:
default:
genericTypes = new Type[] { typeof(ISkyrimMod), typeof(ISkyrimModGetter), typeof(ISkyrimMajorRecord), typeof(ISkyrimMajorRecordGetter) };
break;
}

ContainerBuilder builder = new();
builder.RegisterModule<MainModule>();
builder.RegisterInstance(
new DataDirectoryInjection(options.DataFolder));
builder.RegisterInstance(
new GameReleaseInjection(options.Game));
var container = builder.Build();
var merger = container.Resolve(typeof(Merger<,,,>).MakeGenericType(genericTypes)) as IMerger;

merger!.Merge(
modsToMerge,
ModKey.FromNameAndExtension(options.MergeName),
options.Output);

Console.WriteLine($"Merged {modsToMerge.Count} plugins in {sw.ElapsedMilliseconds}ms");
sw.Stop();
}
}
Loading
Loading