diff --git a/Wabbajack.BuildServer/Models/Jobs/UpdateModLists.cs b/Wabbajack.BuildServer/Models/Jobs/UpdateModLists.cs index 1d749211..77af3e23 100644 --- a/Wabbajack.BuildServer/Models/Jobs/UpdateModLists.cs +++ b/Wabbajack.BuildServer/Models/Jobs/UpdateModLists.cs @@ -44,7 +44,7 @@ namespace Wabbajack.BuildServer.Models.Jobs return JobResult.Success(); } - private async Task ValidateList(SqlService sql, ModlistMetadata list, WorkQueue queue, ValidateModlist whitelists) + private async Task ValidateList(SqlService sql, ModlistMetadata list, WorkQueue queue, ValidateModlist whitelists) { var modlistPath = Consts.ModListDownloadFolder.Combine(list.Links.MachineURL + Consts.ModListExtension); @@ -68,7 +68,7 @@ namespace Wabbajack.BuildServer.Models.Jobs Utils.Log($"{installer.Archives.Count} archives to validate"); - DownloadDispatcher.PrepareAll(installer.Archives.Select(a => a.State)); + await DownloadDispatcher.PrepareAll(installer.Archives.Select(a => a.State)); var validated = (await installer.Archives diff --git a/Wabbajack.CLI/Verbs/DownloadUrl.cs b/Wabbajack.CLI/Verbs/DownloadUrl.cs index 9ea450a2..f6a849d8 100644 --- a/Wabbajack.CLI/Verbs/DownloadUrl.cs +++ b/Wabbajack.CLI/Verbs/DownloadUrl.cs @@ -24,7 +24,7 @@ namespace Wabbajack.CLI.Verbs if (state == null) return CLIUtils.Exit($"Could not find download source for URL {Url}", ExitCode.Error); - DownloadDispatcher.PrepareAll(new []{state}); + await DownloadDispatcher.PrepareAll(new []{state}); using var queue = new WorkQueue(); queue.Status diff --git a/Wabbajack.Common/Json.cs b/Wabbajack.Common/Json.cs index 2b390e12..979a0fc8 100644 --- a/Wabbajack.Common/Json.cs +++ b/Wabbajack.Common/Json.cs @@ -81,7 +81,10 @@ namespace Wabbajack.Common using var tr = new StreamReader(stream, Encoding.UTF8, leaveOpen: true); using var reader = new JsonTextReader(tr); var ser = JsonSerializer.Create(genericReader ? GenericJsonSettings : JsonSettings); - return ser.Deserialize(reader); + var result = ser.Deserialize(reader); + if (result == null) + throw new JsonException("Type deserialized into null"); + return result; } @@ -241,7 +244,7 @@ namespace Wabbajack.Common - public class JsonNameSerializationBinder : ISerializationBinder + public class JsonNameSerializationBinder : DefaultSerializationBinder { private static Dictionary _nameToType = new Dictionary(); private static Dictionary _typeToName = new Dictionary(); @@ -283,7 +286,7 @@ namespace Wabbajack.Common } - public Type BindToType(string? assemblyName, string typeName) + public override Type BindToType(string? assemblyName, string typeName) { if (typeName.EndsWith("[]")) { @@ -298,22 +301,17 @@ namespace Wabbajack.Common if (val != null) return val; - if (assemblyName != null) - { - var assembly = AppDomain.CurrentDomain.Load(assemblyName); - if (assembly != null) - { - var result = assembly.GetType(typeName); - if (result != null) return result; - } - } - - - throw new InvalidDataException($"No Binding name for {typeName}"); + return base.BindToType(assemblyName, typeName); } - public void BindToName(Type serializedType, out string? assemblyName, out string? typeName) + public override void BindToName(Type serializedType, out string? assemblyName, out string? typeName) { + if (serializedType.FullName?.StartsWith("System.") ?? false) + { + base.BindToName(serializedType, out assemblyName, out typeName); + return; + } + if (!_typeToName.ContainsKey(serializedType)) { throw new InvalidDataException($"No Binding name for {serializedType}"); diff --git a/Wabbajack.Common/Paths.cs b/Wabbajack.Common/Paths.cs index eb2617dd..d5fac5b3 100644 --- a/Wabbajack.Common/Paths.cs +++ b/Wabbajack.Common/Paths.cs @@ -145,13 +145,16 @@ namespace Wabbajack.Common } } + /// + /// Returns the full path the folder that contains Wabbajack.Common. This will almost always be + /// where all the binaries for the project reside. + /// + /// public static AbsolutePath EntryPoint { get { - var location = Assembly.GetEntryAssembly()?.Location ?? null; - if (location == null) - location = Assembly.GetExecutingAssembly().Location ?? null; + var location = Assembly.GetExecutingAssembly().Location ?? null; if (location == null) throw new ArgumentException("Could not find entry point."); return ((AbsolutePath)location).Parent; diff --git a/Wabbajack.Common/ProcessHelper.cs b/Wabbajack.Common/ProcessHelper.cs index fb9f5251..8c81852d 100644 --- a/Wabbajack.Common/ProcessHelper.cs +++ b/Wabbajack.Common/ProcessHelper.cs @@ -16,24 +16,35 @@ namespace Wabbajack.Common Error, } - public string Path { get; set; } = string.Empty; + public AbsolutePath Path { get; set; } public IEnumerable Arguments { get; set; } = Enumerable.Empty(); public bool LogError { get; set; } = true; - public readonly Subject<(StreamType Type, string Line)> Output = new Subject<(StreamType Type, string)>(); - - + public readonly Subject<(StreamType Type, string Line)> Output = new Subject<(StreamType Type, string)>(); + + public bool ThrowOnNonZeroExitCode { get; set; } = false; + + public ProcessHelper() { } public async Task Start() { + var args = Arguments.Select(arg => + { + return arg switch + { + AbsolutePath abs => $"\"{abs}\"", + RelativePath rel => $"\"{rel}\"", + _ => arg.ToString() + }; + }); var info = new ProcessStartInfo { FileName = (string)Path, - Arguments = string.Join(" ", Arguments), + Arguments = string.Join(" ", args), RedirectStandardError = true, RedirectStandardInput = true, RedirectStandardOutput = true, @@ -65,7 +76,7 @@ namespace Wabbajack.Common if (string.IsNullOrEmpty(data.Data)) return; Output.OnNext((StreamType.Error, data.Data)); if (LogError) - Utils.Log($"{AlphaPath.GetFileName(Path)} ({p.Id}) StdErr: {data.Data}"); + Utils.Log($"{Path.FileName} ({p.Id}) StdErr: {data.Data}"); }; p.ErrorDataReceived += ErrorEventHandler; @@ -92,6 +103,9 @@ namespace Wabbajack.Common p.Exited -= Exited; Output.OnCompleted(); + + if (result != 0 && ThrowOnNonZeroExitCode) + throw new Exception($"Error executing {Path} - Exit Code {result} - Check the log for more information"); return result; } diff --git a/Wabbajack.Common/Utils.cs b/Wabbajack.Common/Utils.cs index 4e108027..4f971802 100644 --- a/Wabbajack.Common/Utils.cs +++ b/Wabbajack.Common/Utils.cs @@ -517,7 +517,6 @@ namespace Wabbajack.Common return await Task.WhenAll(tasks); } - public static async Task PMap(this IEnumerable coll, WorkQueue queue, Func> f) { @@ -956,7 +955,7 @@ namespace Wabbajack.Common { var process = new ProcessHelper { - Path = "cmd.exe", + Path = ((RelativePath)"cmd.exe").RelativeToSystemDirectory(), Arguments = new object[] {"/c", "del", "/f", "/q", "/s", $"\"{(string)path}\"", "&&", "rmdir", "/q", "/s", $"\"{(string)path}\""}, }; var result = process.Output.Where(d => d.Type == ProcessHelper.StreamType.Output) @@ -999,7 +998,7 @@ namespace Wabbajack.Common var encoded = ProtectedData.Protect(bytes, Encoding.UTF8.GetBytes(key), DataProtectionScope.LocalMachine); Consts.LocalAppDataPath.CreateDirectory(); - Consts.LocalAppDataPath.Combine(key).WriteAllBytes(bytes); + Consts.LocalAppDataPath.Combine(key).WriteAllBytes(encoded); } public static byte[] FromEncryptedData(string key) { diff --git a/Wabbajack.Lib/Downloaders/BethesdaNetDownloader.cs b/Wabbajack.Lib/Downloaders/BethesdaNetDownloader.cs index c05d4ed1..aae2c848 100644 --- a/Wabbajack.Lib/Downloaders/BethesdaNetDownloader.cs +++ b/Wabbajack.Lib/Downloaders/BethesdaNetDownloader.cs @@ -96,8 +96,9 @@ namespace Wabbajack.Lib.Downloaders result.ToEcryptedJson(DataName); return result; } - catch (Exception) + catch (Exception ex) { + Utils.Error(ex, "Could not save Bethesda.NET login info"); return null; } } @@ -363,6 +364,7 @@ namespace Wabbajack.Lib.Downloaders } + [JsonName("BethesdaNetData")] public class BethesdaNetData { public string body { get; set; } diff --git a/Wabbajack.Lib/Downloaders/DownloadDispatcher.cs b/Wabbajack.Lib/Downloaders/DownloadDispatcher.cs index 645c1f9f..e471cc0b 100644 --- a/Wabbajack.Lib/Downloaders/DownloadDispatcher.cs +++ b/Wabbajack.Lib/Downloaders/DownloadDispatcher.cs @@ -58,7 +58,6 @@ namespace Wabbajack.Lib.Downloaders public static T GetInstance() where T : IDownloader { var inst = (T)IndexedDownloaders[typeof(T)]; - inst.Prepare(); return inst; } @@ -79,11 +78,11 @@ namespace Wabbajack.Lib.Downloaders return Downloaders.OfType().Select(d => d.GetDownloaderState(url)).FirstOrDefault(result => result != null); } - public static void PrepareAll(IEnumerable states) + public static async Task PrepareAll(IEnumerable states) { - states.Select(s => s.GetDownloader().GetType()) + await Task.WhenAll(states.Select(s => s.GetDownloader().GetType()) .Distinct() - .Do(t => Downloaders.First(d => d.GetType() == t).Prepare()); + .Select(t => Downloaders.First(d => d.GetType() == t).Prepare())); } public static async Task DownloadWithPossibleUpgrade(Archive archive, AbsolutePath destination) diff --git a/Wabbajack.Lib/Downloaders/YouTubeDownloader.cs b/Wabbajack.Lib/Downloaders/YouTubeDownloader.cs index c72184d0..713000bd 100644 --- a/Wabbajack.Lib/Downloaders/YouTubeDownloader.cs +++ b/Wabbajack.Lib/Downloaders/YouTubeDownloader.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.IO.Compression; using System.Linq; +using System.Reactive.Linq; using System.Threading; using System.Threading.Tasks; using System.Web; @@ -144,71 +145,46 @@ namespace Wabbajack.Lib.Downloaders } - private const string FFMpegPath = "Downloaders/Converters/ffmpeg.exe"; - private const string xWMAEncodePath = "Downloaders/Converters/xWMAEncode.exe"; - private async Task ExtractTrack(AbsolutePath source, AbsolutePath dest_folder, Track track) + private AbsolutePath FFMpegPath => "Downloaders/Converters/ffmpeg.exe".RelativeTo(AbsolutePath.EntryPoint); + private AbsolutePath xWMAEncodePath = "Downloaders/Converters/xWMAEncode.exe".RelativeTo(AbsolutePath.EntryPoint); + private Extension WAVExtension = new Extension(".wav"); + private Extension XWMExtension = new Extension(".xwm"); + private async Task ExtractTrack(AbsolutePath source, AbsolutePath destFolder, Track track) { - var info = new ProcessStartInfo + var process = new ProcessHelper { - FileName = FFMpegPath, - Arguments = - $"-threads 1 -i \"{source}\" -ss {track.Start} -t {track.End - track.Start} \"{dest_folder}\\{track.Name}.wav\"", - RedirectStandardError = true, - RedirectStandardInput = true, - RedirectStandardOutput = true, - UseShellExecute = false, - CreateNoWindow = true + Path = FFMpegPath, + Arguments = new object[] {"-threads", 1, "-i", source, "-ss", track.Start, "-t", track.End - track.Start, track.Name.RelativeTo(destFolder).WithExtension(WAVExtension)}, + ThrowOnNonZeroExitCode = true }; + + var ffmpegLogs = process.Output.Where(arg => arg.Type == ProcessHelper.StreamType.Output) + .ForEachAsync(val => + { + Utils.Status($"Extracting {track.Name} - {val.Line}"); + }); - var p = new Process {StartInfo = info}; - p.Start(); - ChildProcessTracker.AddProcess(p); - - var output = await p.StandardError.ReadToEndAsync(); - - try - { - p.PriorityClass = ProcessPriorityClass.BelowNormal; - } - catch (Exception e) - { - Utils.Error(e, "Error while setting process priority level for ffmpeg.exe"); - } - p.WaitForExit(); + await process.Start(); if (track.Format == Track.FormatEnum.WAV) return; - info = new ProcessStartInfo + process = new ProcessHelper() { - FileName = xWMAEncodePath, - Arguments = - $"-b 192000 \"{dest_folder}\\{track.Name}.wav\" \"{dest_folder}\\{track.Name}.xwm\"", - RedirectStandardError = true, - RedirectStandardInput = true, - RedirectStandardOutput = true, - UseShellExecute = false, - CreateNoWindow = true + Path = xWMAEncodePath, + Arguments = new object[] {"-b", 192000, track.Name.RelativeTo(destFolder).WithExtension(WAVExtension), track.Name.RelativeTo(destFolder).WithExtension(XWMExtension)}, + ThrowOnNonZeroExitCode = true }; - p = new Process {StartInfo = info}; + var xwmLogs = process.Output.Where(arg => arg.Type == ProcessHelper.StreamType.Output) + .ForEachAsync(val => + { + Utils.Status($"Encoding {track.Name} - {val.Line}"); + }); - p.Start(); - ChildProcessTracker.AddProcess(p); - - var output2 = await p.StandardError.ReadToEndAsync(); - - try - { - p.PriorityClass = ProcessPriorityClass.BelowNormal; - } - catch (Exception e) - { - Utils.Error(e, "Error while setting process priority level for ffmpeg.exe"); - } - p.WaitForExit(); + await process.Start(); - if (File.Exists($"{dest_folder}\\{track.Name}.wav")) - File.Delete($"{dest_folder}\\{track.Name}.wav"); + if (File.Exists($"{destFolder}\\{track.Name}.wav")) + File.Delete($"{destFolder}\\{track.Name}.wav"); } diff --git a/Wabbajack.Test/DownloaderTests.cs b/Wabbajack.Test/DownloaderTests.cs index f3c6c4d1..ed1614d8 100644 --- a/Wabbajack.Test/DownloaderTests.cs +++ b/Wabbajack.Test/DownloaderTests.cs @@ -44,9 +44,9 @@ namespace Wabbajack.Test } [Fact] - public void TestAllPrepares() + public async Task TestAllPrepares() { - DownloadDispatcher.Downloaders.Do(d => d.Prepare()); + await Task.WhenAll(DownloadDispatcher.Downloaders.Select(d => d.Prepare())); } [Fact] diff --git a/Wabbajack.VirtualFileSystem/FileExtractor.cs b/Wabbajack.VirtualFileSystem/FileExtractor.cs index 0ea6ff09..8f53f144 100644 --- a/Wabbajack.VirtualFileSystem/FileExtractor.cs +++ b/Wabbajack.VirtualFileSystem/FileExtractor.cs @@ -1,6 +1,7 @@ using System; using System.Diagnostics; using System.Linq; +using System.Reactive.Linq; using System.Threading.Tasks; using Alphaleonis.Win32.Filesystem; using Compression.BSA; @@ -25,9 +26,9 @@ namespace Wabbajack.VirtualFileSystem else if (source.Extension == Consts.OMOD) ExtractAllWithOMOD(source, dest); else if (source.Extension == Consts.EXE) - ExtractAllEXE(source, dest); + await ExtractAllExe(source, dest); else - ExtractAllWith7Zip(source, dest); + await ExtractAllWith7Zip(source, dest); } catch (Exception ex) { @@ -35,71 +36,40 @@ namespace Wabbajack.VirtualFileSystem } } - private static void ExtractAllEXE(AbsolutePath source, AbsolutePath dest) + private static async Task ExtractAllExe(AbsolutePath source, AbsolutePath dest) { - var isArchive = TestWith7z(source); + var isArchive = await TestWith7z(source); if (isArchive) { - ExtractAllWith7Zip(source, dest); + await ExtractAllWith7Zip(source, dest); return; } Utils.Log($"Extracting {(string)source.FileName}"); - var info = new ProcessStartInfo + var process = new ProcessHelper { - FileName = @"Extractors\innounp.exe", - Arguments = $"-x -y -b -d\"{(string)dest}\" \"{(string)source}\"", - RedirectStandardError = true, - RedirectStandardInput = true, - RedirectStandardOutput = true, - UseShellExecute = false, - CreateNoWindow = true + Path = @"Extractors\innounp.exe".RelativeTo(AbsolutePath.EntryPoint), + Arguments = new object[] {"-x", "-y", "-b", $"-d\"{dest}\"", source} }; - var p = new Process {StartInfo = info}; - - p.Start(); - ChildProcessTracker.AddProcess(p); - - try - { - p.PriorityClass = ProcessPriorityClass.BelowNormal; - } - catch (Exception e) - { - Utils.Error(e, "Error while setting process priority level for innounp.exe"); - } - - var name = source.FileName; - try - { - while (!p.HasExited) + + var result = process.Output.Where(d => d.Type == ProcessHelper.StreamType.Output) + .ForEachAsync(p => { - var line = p.StandardOutput.ReadLine(); + var (_, line) = p; if (line == null) - break; + return; if (line.Length <= 4 || line[3] != '%') - continue; + return; int.TryParse(line.Substring(0, 3), out var percentInt); - Utils.Status($"Extracting {(string)name} - {line.Trim()}", Percent.FactoryPutInRange(percentInt / 100d)); - } - } - catch (Exception e) - { - Utils.Error(e, "Error while reading StandardOutput for innounp.exe"); - } - - p.WaitForExitAndWarn(TimeSpan.FromSeconds(30), $"Extracting {(string)name}"); - if (p.ExitCode == 0) - return; - - Utils.Log(p.StandardOutput.ReadToEnd()); - Utils.Log($"Extraction error extracting {source}"); - } + Utils.Status($"Extracting {source.FileName} - {line.Trim()}", Percent.FactoryPutInRange(percentInt / 100d)); + }); + await process.Start(); + } private class OMODProgress : ICodeProgress { @@ -159,60 +129,42 @@ namespace Wabbajack.VirtualFileSystem } } - private static void ExtractAllWith7Zip(AbsolutePath source, AbsolutePath dest) + private static async Task ExtractAllWith7Zip(AbsolutePath source, AbsolutePath dest) { Utils.Log(new GenericInfo($"Extracting {(string)source.FileName}", $"The contents of {(string)source.FileName} are being extracted to {(string)source.FileName} using 7zip.exe")); - var info = new ProcessStartInfo + + var process = new ProcessHelper { - FileName = @"Extractors\7z.exe", - Arguments = $"x -bsp1 -y -o\"{(string)dest}\" \"{(string)source}\" -mmt=off", - RedirectStandardError = true, - RedirectStandardInput = true, - RedirectStandardOutput = true, - UseShellExecute = false, - CreateNoWindow = true + Path = @"Extractors\7z.exe".RelativeTo(AbsolutePath.EntryPoint), + Arguments = new object[] {"x", "-bsp1", "-y", $"-o\"{dest}\"", source, "-mmt=off"} }; + - var p = new Process {StartInfo = info}; - - p.Start(); - ChildProcessTracker.AddProcess(p); - try - { - p.PriorityClass = ProcessPriorityClass.BelowNormal; - } - catch (Exception) - { - } - - var name = source.FileName; - try - { - while (!p.HasExited) + var result = process.Output.Where(d => d.Type == ProcessHelper.StreamType.Output) + .ForEachAsync(p => { - var line = p.StandardOutput.ReadLine(); + var (_, line) = p; if (line == null) - break; + return; - if (line.Length <= 4 || line[3] != '%') continue; + if (line.Length <= 4 || line[3] != '%') return; int.TryParse(line.Substring(0, 3), out var percentInt); - Utils.Status($"Extracting {(string)name} - {line.Trim()}", Percent.FactoryPutInRange(percentInt / 100d)); - } - } - catch (Exception) - { - } + Utils.Status($"Extracting {(string)source.FileName} - {line.Trim()}", Percent.FactoryPutInRange(percentInt / 100d)); + }); - p.WaitForExitAndWarn(TimeSpan.FromSeconds(30), $"Extracting {name}"); + var exitCode = await process.Start(); - if (p.ExitCode == 0) + + if (exitCode != 0) { - Utils.Status($"Extracting {name} - 100%", Percent.One, alsoLog: true); - return; + Utils.Error(new _7zipReturnError(exitCode, source, dest, "")); + } + else + { + Utils.Status($"Extracting {source.FileName} - done", Percent.One, alsoLog: true); } - Utils.Error(new _7zipReturnError(p.ExitCode, source, dest, p.StandardOutput.ReadToEnd())); } /// @@ -220,92 +172,35 @@ namespace Wabbajack.VirtualFileSystem /// /// /// - public static bool CanExtract(AbsolutePath v) + public static async Task CanExtract(AbsolutePath v) { var ext = v.Extension; if(ext != _exeExtension && !Consts.TestArchivesBeforeExtraction.Contains(ext)) return Consts.SupportedArchives.Contains(ext) || Consts.SupportedBSAs.Contains(ext); - var isArchive = TestWith7z(v); + var isArchive = await TestWith7z(v); if (isArchive) return true; - var info = new ProcessStartInfo + var process = new ProcessHelper { - FileName = @"Extractors\innounp.exe", - Arguments = $"-t \"{v}\" ", - RedirectStandardError = true, - RedirectStandardInput = true, - RedirectStandardOutput = true, - UseShellExecute = false, - CreateNoWindow = true + Path = @"Extractors\innounp.exe".RelativeTo(AbsolutePath.EntryPoint), + Arguments = new object[] {"-t", v}, }; - var p = new Process {StartInfo = info}; - - p.Start(); - ChildProcessTracker.AddProcess(p); - - var name = v.FileName; - while (!p.HasExited) - { - var line = p.StandardOutput.ReadLine(); - if (line == null) - break; - - if (line[0] != '#') - continue; - - Utils.Status($"Testing {(string)name} - {line.Trim()}"); - } - - p.WaitForExitAndWarn(TimeSpan.FromSeconds(30), $"Testing {name}"); - return p.ExitCode == 0; + return await process.Start() == 0; } - public static bool TestWith7z(AbsolutePath file) + public static async Task TestWith7z(AbsolutePath file) { - var testInfo = new ProcessStartInfo + var process = new ProcessHelper() { - FileName = @"Extractors\7z.exe", - Arguments = $"t \"{file}\"", - RedirectStandardError = true, - RedirectStandardInput = true, - RedirectStandardOutput = true, - UseShellExecute = false, - CreateNoWindow = true + Path = @"Extractors\7z.exe".RelativeTo(AbsolutePath.EntryPoint), + Arguments = new object[] {"t", file}, }; - var testP = new Process {StartInfo = testInfo}; - - testP.Start(); - ChildProcessTracker.AddProcess(testP); - try - { - testP.PriorityClass = ProcessPriorityClass.BelowNormal; - } - catch (Exception) - { - return false; - } - - try - { - while (!testP.HasExited) - { - var line = testP.StandardOutput.ReadLine(); - if (line == null) - break; - } - } - catch (Exception) - { - return false; - } - - testP.WaitForExitAndWarn(TimeSpan.FromSeconds(30), $"Can Extract Check {file}"); - return testP.ExitCode == 0; + return await process.Start() == 0; } private static Extension _exeExtension = new Extension(".exe"); diff --git a/Wabbajack.VirtualFileSystem/VirtualFile.cs b/Wabbajack.VirtualFileSystem/VirtualFile.cs index 2dac0afe..2c99b5bb 100644 --- a/Wabbajack.VirtualFileSystem/VirtualFile.cs +++ b/Wabbajack.VirtualFileSystem/VirtualFile.cs @@ -180,7 +180,7 @@ namespace Wabbajack.VirtualFileSystem if (context.UseExtendedHashes) self.ExtendedHashes = ExtendedHashes.FromFile(absPath); - if (FileExtractor.CanExtract(absPath)) + if (await FileExtractor.CanExtract(absPath)) { await using var tempFolder = Context.GetTemporaryFolder(); await FileExtractor.ExtractAll(context.Queue, absPath, tempFolder.FullName); diff --git a/Wabbajack/Views/Compilers/VortexCompilerConfigView.xaml b/Wabbajack/Views/Compilers/VortexCompilerConfigView.xaml deleted file mode 100644 index 56b3d9d9..00000000 --- a/Wabbajack/Views/Compilers/VortexCompilerConfigView.xaml +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Wabbajack/Views/Compilers/VortexCompilerConfigView.xaml.cs b/Wabbajack/Views/Compilers/VortexCompilerConfigView.xaml.cs deleted file mode 100644 index 3e59c494..00000000 --- a/Wabbajack/Views/Compilers/VortexCompilerConfigView.xaml.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Windows.Controls; - -namespace Wabbajack -{ - /// - /// Interaction logic for VortexCompilerConfigView.xaml - /// - public partial class VortexCompilerConfigView : UserControl - { - public VortexCompilerConfigView() - { - InitializeComponent(); - } - } -}