diff --git a/Wabbajack.Lib/AInstaller.cs b/Wabbajack.Lib/AInstaller.cs index ce4550d4..27efbcb0 100644 --- a/Wabbajack.Lib/AInstaller.cs +++ b/Wabbajack.Lib/AInstaller.cs @@ -377,6 +377,30 @@ namespace Wabbajack.Lib .Where(d => d != null) .Do(d => indexed.Remove(d.To)); + Utils.Log("Cleaning empty folders"); + var expectedFolders = indexed.Keys.SelectMany(path => + { + // Get all the folders and all the folder parents + // so for foo\bar\baz\qux.txt this emits ["foo", "foo\\bar", "foo\\bar\\baz"] + var split = path.Split('\\'); + return Enumerable.Range(1, split.Length - 1).Select(t => string.Join("\\", split.Take(t))); + }).Distinct() + .Select(p => Path.Combine(OutputFolder, p)) + .ToHashSet(); + + try + { + Directory.EnumerateDirectories(OutputFolder, DirectoryEnumerationOptions.Recursive) + .Where(p => !expectedFolders.Contains(p)) + .OrderByDescending(p => p.Length) + .Do(p => Directory.Delete(p)); + } + catch (Exception) + { + // ignored because it's not worth throwing a fit over + Utils.Log("Error when trying to clean empty folders. This doesn't really matter."); + } + UpdateTracker.NextStep("Updating Modlist"); Utils.Log($"Optimized {ModList.Directives.Count} directives to {indexed.Count} required"); var requiredArchives = indexed.Values.OfType() diff --git a/Wabbajack.Test/SanityTests.cs b/Wabbajack.Test/SanityTests.cs index 411ad9d3..e2f9c732 100644 --- a/Wabbajack.Test/SanityTests.cs +++ b/Wabbajack.Test/SanityTests.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -87,6 +88,11 @@ namespace Wabbajack.Test var extra_path = utils.PathOfInstalledFile(mod, @"something_i_made.foo"); File.WriteAllText(extra_path, "bleh"); + var extra_folder = Path.Combine(Path.GetDirectoryName(utils.PathOfInstalledFile(mod, @"something_i_made.foo")), "folder_i_made"); + Directory.CreateDirectory(extra_folder); + + Assert.IsTrue(Directory.Exists(extra_folder)); + var unchanged_modified = File.GetLastWriteTime(unchanged_path); var modified_modified = File.GetLastWriteTime(modified_path); @@ -105,6 +111,7 @@ namespace Wabbajack.Test Assert.AreEqual(unchanged_modified, File.GetLastWriteTime(unchanged_path)); Assert.AreNotEqual(modified_modified, File.GetLastWriteTime(modified_path)); Assert.IsFalse(File.Exists(extra_path)); + Assert.IsFalse(Directory.Exists(extra_folder)); }