From 669057f49c207de597604f847fb6ec55f17df121 Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Wed, 19 Mar 2025 07:40:06 -0700 Subject: Harvesting no longer aborts if any exclusions reference missing folders Fixes 8989 --- src/wix/WixToolset.Core/HarvestFilesCommand.cs | 51 +++++++++++----------- .../HarvestFilesFixture.cs | 24 ++++++++++ .../HarvestFiles/SomeExclusionsMissing.wxs | 17 ++++++++ 3 files changed, 66 insertions(+), 26 deletions(-) create mode 100644 src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/SomeExclusionsMissing.wxs (limited to 'src') diff --git a/src/wix/WixToolset.Core/HarvestFilesCommand.cs b/src/wix/WixToolset.Core/HarvestFilesCommand.cs index ed78e808..25698ece 100644 --- a/src/wix/WixToolset.Core/HarvestFilesCommand.cs +++ b/src/wix/WixToolset.Core/HarvestFilesCommand.cs @@ -135,33 +135,32 @@ namespace WixToolset.Core var files = new List(); - try + foreach (var pattern in patterns) { - foreach (var pattern in patterns) + // Resolve bind paths, if any, which might result in multiple directories. + foreach (var path in this.ResolveBindPaths(sourceLineNumbers, pattern)) { - // Resolve bind paths, if any, which might result in multiple directories. - foreach (var path in this.ResolveBindPaths(sourceLineNumbers, pattern)) - { - var sourceDirectory = String.IsNullOrEmpty(sourcePath) ? Path.GetDirectoryName(sourceLineNumbers.FileName) : sourcePath; - var recursive = path.IndexOf("**") >= 0; - var filePortion = Path.GetFileName(path); - var directoryPortion = Path.GetDirectoryName(path).TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar); + var sourceDirectory = String.IsNullOrEmpty(sourcePath) ? Path.GetDirectoryName(sourceLineNumbers.FileName) : sourcePath; + var recursive = path.IndexOf("**") >= 0; + var filePortion = Path.GetFileName(path); + var directoryPortion = Path.GetDirectoryName(path).TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar); - if (directoryPortion?.EndsWith(@"\**") == true) - { - directoryPortion = directoryPortion.Substring(0, directoryPortion.Length - 3); - } - - if (directoryPortion is null || directoryPortion.Length == 0 || directoryPortion == "**") - { - directoryPortion = sourceDirectory; + if (directoryPortion?.EndsWith(@"\**") == true) + { + directoryPortion = directoryPortion.Substring(0, directoryPortion.Length - 3); + } - } - else if (!Path.IsPathRooted(directoryPortion)) - { - directoryPortion = Path.Combine(sourceDirectory, directoryPortion); - } + if (directoryPortion is null || directoryPortion.Length == 0 || directoryPortion == "**") + { + directoryPortion = sourceDirectory; + } + else if (!Path.IsPathRooted(directoryPortion)) + { + directoryPortion = Path.Combine(sourceDirectory, directoryPortion); + } + try + { var recursiveDirOffset = directoryPortion.Length + 1; var foundFiles = Directory.EnumerateFiles(directoryPortion, filePortion, recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly); @@ -176,12 +175,12 @@ namespace WixToolset.Core }); } } + catch (DirectoryNotFoundException e) + { + this.Messaging.Write(OptimizerWarnings.ExpectedDirectory(harvestFile.SourceLineNumbers, e.Message)); + } } } - catch (DirectoryNotFoundException e) - { - this.Messaging.Write(OptimizerWarnings.ExpectedDirectory(harvestFile.SourceLineNumbers, e.Message)); - } return files; } diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/HarvestFilesFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/HarvestFilesFixture.cs index 949746ac..a680d145 100644 --- a/src/wix/test/WixToolsetTest.CoreIntegration/HarvestFilesFixture.cs +++ b/src/wix/test/WixToolsetTest.CoreIntegration/HarvestFilesFixture.cs @@ -56,6 +56,30 @@ namespace WixToolsetTest.CoreIntegration }); } + [Fact] + public void MissingHarvestExclusionsDoesNotBlockAllHarvesting() + { + Build("SomeExclusionsMissing.wxs", (msiPath, sourceFolder, baseFolder, result) => + { + var expectedWarnings = new[] + { + @"8601: Missing directory for harvesting files: Could not find a part of the path '\files2\files2_sub2\MissingDirectory'.", + @"8601: Missing directory for harvesting files: Could not find a part of the path '\files2\files2_sub2\ThisDirectoryIsAlsoMissing'.", + }; + + var expectedFiles = new[] + { + @"flsCswDB8sBfZz7_oHNtra3tiFivPE=PFiles\MsiPackage\test20.txt", + @"fls4200C_IADZMINQyhQg52G3WxxfU=PFiles\MsiPackage\test21.txt", + }; + + var messages = result.Messages.Select(m => FormatMessage(m, sourceFolder, baseFolder)).ToArray(); + WixAssert.CompareLineByLine(expectedWarnings, messages); + + AssertFileIdsAndTargetPaths(msiPath, expectedFiles); + }, warningsAsErrors: false); + } + [Fact] public void DuplicateFilesSomethingSomething() { diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/SomeExclusionsMissing.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/SomeExclusionsMissing.wxs new file mode 100644 index 00000000..104518bd --- /dev/null +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/SomeExclusionsMissing.wxs @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + -- cgit v1.2.3-55-g6feb