From dabcb37846e8f6da9d43984863678e9a4cf57b3e Mon Sep 17 00:00:00 2001 From: Bob Arnson Date: Thu, 14 Mar 2024 13:51:07 -0400 Subject: Handle directories a bit better for `Files`. Fixes https://github.com/wixtoolset/issues/issues/8040. --- src/wix/WixToolset.Core/HarvestFilesCommand.cs | 4 +- .../HarvestFilesFixture.cs | 47 +++++++++++++++++----- .../TestData/HarvestFiles/ComponentGroup.wxs | 2 - .../TestData/HarvestFiles/CrookedTree.wxs | 5 +++ .../TestData/HarvestFiles/bigtree/a/file.ext | 0 .../TestData/HarvestFiles/bigtree/b/file.ext | 0 .../TestData/HarvestFiles/bigtree/c/file.ext | 0 .../TestData/HarvestFiles/bigtree/d/file.ext | 0 .../TestData/HarvestFiles/bigtree/e/file.ext | 0 .../TestData/HarvestFiles/bigtree/f/file.ext | 0 .../TestData/HarvestFiles/bigtree/file.ext | 0 .../TestData/HarvestFiles/bigtree/g/file.ext | 0 .../TestData/HarvestFiles/bigtree/h/file.ext | 0 .../bigtree/z/y/x/w/v/u/t/s/r/q/file.ext | 0 14 files changed, 43 insertions(+), 15 deletions(-) create mode 100644 src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/CrookedTree.wxs create mode 100644 src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/bigtree/a/file.ext create mode 100644 src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/bigtree/b/file.ext create mode 100644 src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/bigtree/c/file.ext create mode 100644 src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/bigtree/d/file.ext create mode 100644 src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/bigtree/e/file.ext create mode 100644 src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/bigtree/f/file.ext create mode 100644 src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/bigtree/file.ext create mode 100644 src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/bigtree/g/file.ext create mode 100644 src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/bigtree/h/file.ext create mode 100644 src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/bigtree/z/y/x/w/v/u/t/s/r/q/file.ext diff --git a/src/wix/WixToolset.Core/HarvestFilesCommand.cs b/src/wix/WixToolset.Core/HarvestFilesCommand.cs index c92de516..4f0c2e2a 100644 --- a/src/wix/WixToolset.Core/HarvestFilesCommand.cs +++ b/src/wix/WixToolset.Core/HarvestFilesCommand.cs @@ -45,8 +45,6 @@ namespace WixToolset.Core { var unusedSectionCachedInlinedDirectoryIds = new Dictionary(); - var directoryId = harvestFile.DirectoryRef; - var inclusions = harvestFile.Inclusions.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries); var exclusions = harvestFile.Exclusions.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries); @@ -75,6 +73,8 @@ namespace WixToolset.Core foreach (var fileByRecursiveDir in resolvedFiles.GroupBy(resolvedFile => resolvedFile.RecursiveDir, resolvedFile => resolvedFile.Path)) { + var directoryId = harvestFile.DirectoryRef; + var recursiveDir = fileByRecursiveDir.Key; if (!String.IsNullOrEmpty(recursiveDir)) diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/HarvestFilesFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/HarvestFilesFixture.cs index c9e7fb14..8bf03ebb 100644 --- a/src/wix/test/WixToolsetTest.CoreIntegration/HarvestFilesFixture.cs +++ b/src/wix/test/WixToolsetTest.CoreIntegration/HarvestFilesFixture.cs @@ -14,7 +14,7 @@ namespace WixToolsetTest.CoreIntegration [Fact] public void MustIncludeSomeFiles() { - var messages = BuildAndQueryComponentAndFileTables("BadAuthoring.wxs", isPackage: true, 10); + var messages = BuildAndQueryComponentFileDirectoryTables("BadAuthoring.wxs", isPackage: true, 10); Assert.Equal(new[] { "10", @@ -24,7 +24,7 @@ namespace WixToolsetTest.CoreIntegration [Fact] public void ZeroFilesHarvestedIsAWarning() { - var messages = BuildAndQueryComponentAndFileTables("ZeroFiles.wxs", isPackage: true, 8600); + var messages = BuildAndQueryComponentFileDirectoryTables("ZeroFiles.wxs", isPackage: true, 8600); Assert.Equal(new[] { "8600", @@ -34,7 +34,7 @@ namespace WixToolsetTest.CoreIntegration [Fact] public void MissingHarvestDirectoryIsAWarning() { - var messages = BuildAndQueryComponentAndFileTables("BadDirectory.wxs", isPackage: true, 8601); + var messages = BuildAndQueryComponentFileDirectoryTables("BadDirectory.wxs", isPackage: true, 8601); Assert.Equal(new[] { "8601", @@ -45,7 +45,7 @@ namespace WixToolsetTest.CoreIntegration [Fact] public void DuplicateFilesSomethingSomething() { - var messages = BuildAndQueryComponentAndFileTables("DuplicateFiles.wxs", isPackage: true, 8602); + var messages = BuildAndQueryComponentFileDirectoryTables("DuplicateFiles.wxs", isPackage: true, 8602); Assert.Equal(new[] { "8602", @@ -58,7 +58,7 @@ namespace WixToolsetTest.CoreIntegration [Fact] public void CanHarvestFilesInComponentGroup() { - BuildQueryAssertFiles("ComponentGroup.wxs", new[] + BuildQueryAssertFiles("ComponentGroup.wxs", new[] { "FileName.Extension", "test20.txt", @@ -71,7 +71,7 @@ namespace WixToolsetTest.CoreIntegration [Fact] public void CanHarvestFilesInDirectory() { - BuildQueryAssertFiles("Directory.wxs", new[] + BuildQueryAssertFiles("Directory.wxs", new[] { "test10.txt", "test120.txt", @@ -101,7 +101,7 @@ namespace WixToolsetTest.CoreIntegration [Fact] public void CanHarvestFilesInFeature() { - var rows = BuildAndQueryComponentAndFileTables("Feature.wxs"); + var rows = BuildAndQueryComponentFileDirectoryTables("Feature.wxs"); AssertFileComponentIds(3, rows); } @@ -123,6 +123,22 @@ namespace WixToolsetTest.CoreIntegration }); } + [Fact] + public void CanHarvestFilesInStraightAndCrookedTrees() + { + var rows = BuildAndQueryComponentFileDirectoryTables("CrookedTree.wxs"); + var directoryRows = rows.Where(row => row.StartsWith("Directory:")).Select(d => d.Substring(10)).ToArray(); + + var rootDirectoryId = directoryRows.Single(r => r.EndsWith("\troot")).Split('\t')[0]; + + foreach (var ch in new[] { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'z' }) + { + var directoryRow = directoryRows.Single(r => r.EndsWith($"\t{ch}")); + var parentDirectory = directoryRow.Split('\t')[1]; + Assert.Equal(rootDirectoryId, parentDirectory); + } + } + [Fact] public void CanHarvestFilesInFeatureRef() { @@ -186,7 +202,7 @@ namespace WixToolsetTest.CoreIntegration [Fact] public void HarvestedFilesUnderPackageWithAuthoredFeatureAreOrphaned() { - var messages = BuildAndQueryComponentAndFileTables("PackageWithoutDefaultFeature.wxs", isPackage: true, 267); + var messages = BuildAndQueryComponentFileDirectoryTables("PackageWithoutDefaultFeature.wxs", isPackage: true, 267); Assert.Equal(new[] { "267", @@ -232,14 +248,23 @@ namespace WixToolsetTest.CoreIntegration private static void BuildQueryAssertFiles(string file, string[] expectedFileNames, bool isPackage = true, int? exitCode = null) { - var rows = BuildAndQueryComponentAndFileTables(file, isPackage, exitCode); + var rows = BuildAndQueryComponentFileDirectoryTables(file, isPackage, exitCode); + + var fileNames = AssertFileComponentIds(expectedFileNames.Length, rows); + + Assert.Equal(expectedFileNames, fileNames); + } + + private static void BuildQueryDirectoryComponent(string file, string[] expectedFileNames, bool isPackage = true, int? exitCode = null) + { + var rows = BuildAndQueryComponentFileDirectoryTables(file, isPackage, exitCode); var fileNames = AssertFileComponentIds(expectedFileNames.Length, rows); Assert.Equal(expectedFileNames, fileNames); } - private static string[] BuildAndQueryComponentAndFileTables(string file, bool isPackage = true, int? exitCode = null) + private static string[] BuildAndQueryComponentFileDirectoryTables(string file, bool isPackage = true, int? exitCode = null) { var folder = TestData.Get("TestData", "HarvestFiles"); @@ -273,7 +298,7 @@ namespace WixToolsetTest.CoreIntegration { result.AssertSuccess(); - return Query.QueryDatabase(msiPath, new[] { "Component", "File" }) + return Query.QueryDatabase(msiPath, new[] { "Component", "File", "Directory" }) .OrderBy(s => s) .ToArray(); } diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/ComponentGroup.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/ComponentGroup.wxs index 963f40a5..7755ffb1 100644 --- a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/ComponentGroup.wxs +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/ComponentGroup.wxs @@ -1,7 +1,5 @@ - - diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/CrookedTree.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/CrookedTree.wxs new file mode 100644 index 00000000..4f46a81a --- /dev/null +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/CrookedTree.wxs @@ -0,0 +1,5 @@ + + + + + diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/bigtree/a/file.ext b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/bigtree/a/file.ext new file mode 100644 index 00000000..e69de29b diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/bigtree/b/file.ext b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/bigtree/b/file.ext new file mode 100644 index 00000000..e69de29b diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/bigtree/c/file.ext b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/bigtree/c/file.ext new file mode 100644 index 00000000..e69de29b diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/bigtree/d/file.ext b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/bigtree/d/file.ext new file mode 100644 index 00000000..e69de29b diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/bigtree/e/file.ext b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/bigtree/e/file.ext new file mode 100644 index 00000000..e69de29b diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/bigtree/f/file.ext b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/bigtree/f/file.ext new file mode 100644 index 00000000..e69de29b diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/bigtree/file.ext b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/bigtree/file.ext new file mode 100644 index 00000000..e69de29b diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/bigtree/g/file.ext b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/bigtree/g/file.ext new file mode 100644 index 00000000..e69de29b diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/bigtree/h/file.ext b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/bigtree/h/file.ext new file mode 100644 index 00000000..e69de29b diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/bigtree/z/y/x/w/v/u/t/s/r/q/file.ext b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/bigtree/z/y/x/w/v/u/t/s/r/q/file.ext new file mode 100644 index 00000000..e69de29b -- cgit v1.2.3-55-g6feb