Skip to content

Commit 372d892

Browse files
committed
Handle rooted file harvesting.
Also don't fail-fast when directory doesn't exist. Fixes wixtoolset/issues#8740.
1 parent dd2fe20 commit 372d892

File tree

3 files changed

+56
-52
lines changed

3 files changed

+56
-52
lines changed

src/wix/WixToolset.Core/HarvestFilesCommand.cs

Lines changed: 44 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -52,28 +52,19 @@ private void HarvestFiles(HarvestFilesSymbol harvestFile, IntermediateSection se
5252

5353
var resolvedFiles = Enumerable.Empty<WildcardFile>();
5454

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);
5957

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+
}
6462

65-
resolvedFiles = included.Except(excluded, comparer).ToList();
63+
resolvedFiles = included.Except(excluded, comparer).ToList();
6664

67-
if (!resolvedFiles.Any())
68-
{
69-
this.Messaging.Write(OptimizerWarnings.ZeroFilesHarvested(harvestFile.SourceLineNumbers));
70-
}
71-
}
72-
catch (DirectoryNotFoundException e)
65+
if (!resolvedFiles.Any())
7366
{
74-
this.Messaging.Write(OptimizerWarnings.ExpectedDirectory(harvestFile.SourceLineNumbers, e.Message));
75-
76-
return;
67+
this.Messaging.Write(OptimizerWarnings.ZeroFilesHarvested(harvestFile.SourceLineNumbers));
7768
}
7869

7970
foreach (var fileByRecursiveDir in resolvedFiles.GroupBy(resolvedFile => resolvedFile.RecursiveDir, resolvedFile => resolvedFile.Path))
@@ -139,48 +130,53 @@ private IEnumerable<WildcardFile> GetWildcardFiles(HarvestFilesSymbol harvestFil
139130

140131
var files = new List<WildcardFile>();
141132

142-
foreach (var pattern in patterns)
133+
try
143134
{
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)
146136
{
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))
153139
{
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);
156144

157-
var recursiveDirOffset = directoryPortion.Length + 1;
145+
if (directoryPortion?.EndsWith(@"\**") == true)
146+
{
147+
directoryPortion = directoryPortion.Substring(0, directoryPortion.Length - 3);
148+
}
158149

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;
163153

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+
}
170159

171-
var foundFiles = Directory.EnumerateFiles(directoryPortion, filePortion, recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly);
160+
var recursiveDirOffset = directoryPortion.Length + 1;
172161

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)
177165
{
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+
}
181173
}
182174
}
183175
}
176+
catch (DirectoryNotFoundException e)
177+
{
178+
this.Messaging.Write(OptimizerWarnings.ExpectedDirectory(harvestFile.SourceLineNumbers, e.Message));
179+
}
184180

185181
return files;
186182
}

src/wix/test/WixToolsetTest.CoreIntegration/HarvestFilesFixture.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,9 @@ public void MissingHarvestDirectoryIsAWarning()
4848
Assert.Equal(new[]
4949
{
5050
8601,
51+
8600,
5152
8601,
53+
8600,
5254
}, messages);
5355
});
5456
}
@@ -272,7 +274,11 @@ public void CanHarvestFilesInStandardDirectory()
272274
@"flsCgt3Noa1VJHlHG5HOVjD5vdJm5Q=PFiles\MsiPackage\files2_sub3\FileName.Extension",
273275
};
274276

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);
276282
}
277283

278284
[Fact]
@@ -319,7 +325,7 @@ private static void AssertFileIdsAndTargetPaths(string msiPath, string[] expecte
319325
Assert.Equal(sortedExpected, actual);
320326
}
321327

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)
323329
{
324330
var folder = TestData.Get("TestData", "HarvestFiles");
325331

@@ -346,7 +352,7 @@ private static void Build(string file, Action<string, WixRunnerResult> tester, b
346352
arguments.AddRange(additionalCommandLineArguments);
347353
}
348354

349-
var result = WixRunner.Execute(arguments.ToArray());
355+
var result = WixRunner.Execute(warningsAsErrors, arguments.ToArray());
350356

351357
tester(msiPath, result);
352358
}

src/wix/test/WixToolsetTest.CoreIntegration/TestData/HarvestFiles/StandardDirectory.wxs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
<StandardDirectory Id="ProgramFiles6432Folder">
66
<!-- Relies on default-feature feature to include naked files in package. -->
77
<Files Subdirectory="MsiPackage" Include="files1\**" />
8-
<Files Subdirectory="MsiPackage" Include="files2\**" />
8+
<Files Subdirectory="MsiPackage" Include="files2\**">
9+
<Exclude Files="notfound\**" />
10+
</Files>
911
</StandardDirectory>
1012
</Package>
1113
</Wix>

0 commit comments

Comments
 (0)