@joebigelow / wix-1 / commits / da34545f

Handle rooted file harvesting.

Also don't fail-fast when directory doesn't exist. Fixes https://github.com/wixtoolset/issues/issues/8740.

Bob Arnson committed Sep 21, 2024 at 22:55 UTC da34545f4caddf3ccc353392531139e2500cf578
3 files changed +56 -52
src/wix/WixToolset.Core/HarvestFilesCommand.cs
+44 -48
@@ -52,28 +52,19 @@ namespace WixToolset.Core
52
53 var resolvedFiles = Enumerable.Empty<WildcardFile>();
54
55 - try
56 - {
57 - var included = this.GetWildcardFiles(harvestFile, inclusions);
58 - var excluded = this.GetWildcardFiles(harvestFile, exclusions);
55 + var included = this.GetWildcardFiles(harvestFile, inclusions);
56 + var excluded = this.GetWildcardFiles(harvestFile, exclusions);
57
60 - foreach (var excludedFile in excluded)
61 - {
62 - this.Messaging.Write(OptimizerVerboses.ExcludedFile(harvestFile.SourceLineNumbers, excludedFile.Path));
63 - }
58 + foreach (var excludedFile in excluded)
59 + {
60 + this.Messaging.Write(OptimizerVerboses.ExcludedFile(harvestFile.SourceLineNumbers, excludedFile.Path));
61 + }
62
65 - resolvedFiles = included.Except(excluded, comparer).ToList();
63 + resolvedFiles = included.Except(excluded, comparer).ToList();
64
67 - if (!resolvedFiles.Any())
68 - {
69 - this.Messaging.Write(OptimizerWarnings.ZeroFilesHarvested(harvestFile.SourceLineNumbers));
70 - }
71 - }
72 - catch (DirectoryNotFoundException e)
65 + if (!resolvedFiles.Any())
66 {
74 - this.Messaging.Write(OptimizerWarnings.ExpectedDirectory(harvestFile.SourceLineNumbers, e.Message));
75 -
76 - return;
67 + this.Messaging.Write(OptimizerWarnings.ZeroFilesHarvested(harvestFile.SourceLineNumbers));
68 }
69
70 foreach (var fileByRecursiveDir in resolvedFiles.GroupBy(resolvedFile => resolvedFile.RecursiveDir, resolvedFile => resolvedFile.Path))
@@ -139,48 +130,53 @@ namespace WixToolset.Core
130
131 var files = new List<WildcardFile>();
132
142 - foreach (var pattern in patterns)
133 + try
134 {
144 - // Resolve bind paths, if any, which might result in multiple directories.
145 - foreach (var path in this.ResolveBindPaths(sourceLineNumbers, pattern))
135 + foreach (var pattern in patterns)
136 {
147 - var sourceDirectory = String.IsNullOrEmpty(sourcePath) ? Path.GetDirectoryName(sourceLineNumbers.FileName) : sourcePath;
148 - var recursive = path.IndexOf("**") >= 0;
149 - var filePortion = Path.GetFileName(path);
150 - var directoryPortion = Path.GetDirectoryName(path);
151 -
152 - if (directoryPortion?.EndsWith(@"\**") == true)
137 + // Resolve bind paths, if any, which might result in multiple directories.
138 + foreach (var path in this.ResolveBindPaths(sourceLineNumbers, pattern))
139 {
154 - directoryPortion = directoryPortion.Substring(0, directoryPortion.Length - 3);
155 - }
140 + var sourceDirectory = String.IsNullOrEmpty(sourcePath) ? Path.GetDirectoryName(sourceLineNumbers.FileName) : sourcePath;
141 + var recursive = path.IndexOf("**") >= 0;
142 + var filePortion = Path.GetFileName(path);
143 + var directoryPortion = Path.GetDirectoryName(path).TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar);
144
157 - var recursiveDirOffset = directoryPortion.Length + 1;
145 + if (directoryPortion?.EndsWith(@"\**") == true)
146 + {
147 + directoryPortion = directoryPortion.Substring(0, directoryPortion.Length - 3);
148 + }
149
159 - if (directoryPortion is null || directoryPortion.Length == 0 || directoryPortion == "**")
160 - {
161 - directoryPortion = sourceDirectory;
162 - recursiveDirOffset = sourceDirectory.Length + 1;
150 + if (directoryPortion is null || directoryPortion.Length == 0 || directoryPortion == "**")
151 + {
152 + directoryPortion = sourceDirectory;
153
164 - }
165 - else if (!Path.IsPathRooted(directoryPortion))
166 - {
167 - directoryPortion = Path.Combine(sourceDirectory, directoryPortion);
168 - recursiveDirOffset = directoryPortion.Length + 1;
169 - }
154 + }
155 + else if (!Path.IsPathRooted(directoryPortion))
156 + {
157 + directoryPortion = Path.Combine(sourceDirectory, directoryPortion);
158 + }
159
171 - var foundFiles = Directory.EnumerateFiles(directoryPortion, filePortion, recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly);
160 + var recursiveDirOffset = directoryPortion.Length + 1;
161
173 - foreach (var foundFile in foundFiles)
174 - {
175 - var recursiveDir = Path.GetDirectoryName(foundFile.Substring(recursiveDirOffset));
176 - files.Add(new WildcardFile()
162 + var foundFiles = Directory.EnumerateFiles(directoryPortion, filePortion, recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly);
163 +
164 + foreach (var foundFile in foundFiles)
165 {
178 - RecursiveDir = recursiveDir,
179 - Path = foundFile,
180 - });
166 + var recursiveDir = Path.GetDirectoryName(foundFile.Substring(recursiveDirOffset));
167 + files.Add(new WildcardFile()
168 + {
169 + RecursiveDir = recursiveDir,
170 + Path = foundFile,
171 + });
172 + }
173 }
174 }
175 }
176 + catch (DirectoryNotFoundException e)
177 + {
178 + this.Messaging.Write(OptimizerWarnings.ExpectedDirectory(harvestFile.SourceLineNumbers, e.Message));
179 + }
180
181 return files;
182 }
src/wix/test/WixToolsetTest.CoreIntegration/HarvestFilesFixture.cs
+9 -3
@@ -48,7 +48,9 @@ namespace WixToolsetTest.CoreIntegration
48 Assert.Equal(new[]
49 {
50 8601,
51 + 8600,
52 8601,
53 + 8600,
54 }, messages);
55 });
56 }
@@ -272,7 +274,11 @@ namespace WixToolsetTest.CoreIntegration
274 @"flsCgt3Noa1VJHlHG5HOVjD5vdJm5Q=PFiles\MsiPackage\files2_sub3\FileName.Extension",
275 };
276
275 - Build("StandardDirectory.wxs", (msiPath, _) => AssertFileIdsAndTargetPaths(msiPath, expected));
277 + Build("StandardDirectory.wxs", (msiPath, result) =>
278 + {
279 + result.AssertSuccess();
280 + AssertFileIdsAndTargetPaths(msiPath, expected);
281 + }, warningsAsErrors: false);
282 }
283
284 [Fact]
@@ -319,7 +325,7 @@ namespace WixToolsetTest.CoreIntegration
325 Assert.Equal(sortedExpected, actual);
326 }
327
322 - private static void Build(string file, Action<string, WixRunnerResult> tester, bool isPackage = true, params string[] additionalCommandLineArguments)
328 + private static void Build(string file, Action<string, WixRunnerResult> tester, bool isPackage = true, bool warningsAsErrors = true, params string[] additionalCommandLineArguments)
329 {
330 var folder = TestData.Get("TestData", "HarvestFiles");
331
@@ -346,7 +352,7 @@ namespace WixToolsetTest.CoreIntegration
352 arguments.AddRange(additionalCommandLineArguments);
353 }
354
349 - var result = WixRunner.Execute(arguments.ToArray());
355 + var result = WixRunner.Execute(warningsAsErrors, arguments.ToArray());
356
357 tester(msiPath, result);
358 }
src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/StandardDirectory.wxs
+3 -1
@@ -5,7 +5,9 @@
5 <StandardDirectory Id="ProgramFiles6432Folder">
6 <!-- Relies on default-feature feature to include naked files in package. -->
7 <Files Subdirectory="MsiPackage" Include="files1\**" />
8 - <Files Subdirectory="MsiPackage" Include="files2\**" />
8 + <Files Subdirectory="MsiPackage" Include="files2\**">
9 + <Exclude Files="notfound\**" />
10 + </Files>
11 </StandardDirectory>
12 </Package>
13 </Wix>