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>