Add CreateFolder tuples for null-keypath components in the backend instead of the compiler.
Bob Arnson committed
Feb 6, 2020 at 22:04 UTC
57559c253fe8ec6f9c66662d11fbcabccc3ba057
9 files changed
+126
-17
src/WixToolset.Core.WindowsInstaller/Bind/AddCreateFoldersCommand.cs
new
+40
@@ -0,0 +1,40 @@
1
+// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
+
3
+namespace WixToolset.Core.WindowsInstaller.Bind
4
+{
5
+ using System.Collections.Generic;
6
+ using System.Linq;
7
+ using WixToolset.Data;
8
+ using WixToolset.Data.Tuples;
9
+
10
+ /// <summary>
11
+ /// Add CreateFolder tuples, if not already present, for null-keypath components.
12
+ /// </summary>
13
+ internal class AddCreateFoldersCommand
14
+ {
15
+ internal AddCreateFoldersCommand(IntermediateSection section)
16
+ {
17
+ this.Section = section;
18
+ }
19
+
20
+ private IntermediateSection Section { get; }
21
+
22
+ public void Execute()
23
+ {
24
+ var createFolderTuplesByComponentRef = new HashSet<string>(this.Section.Tuples.OfType<CreateFolderTuple>().Select(t => t.ComponentRef));
25
+ foreach (var componentTuple in this.Section.Tuples.OfType<ComponentTuple>().Where(t => t.KeyPathType == ComponentKeyPathType.Directory).ToList())
26
+ {
27
+ if (!createFolderTuplesByComponentRef.Contains(componentTuple.Id.Id))
28
+ {
29
+ var createFolderTuple = new CreateFolderTuple(componentTuple.SourceLineNumbers)
30
+ {
31
+ DirectoryRef = componentTuple.DirectoryRef,
32
+ ComponentRef = componentTuple.Id.Id,
33
+ };
34
+
35
+ this.Section.Tuples.Add(createFolderTuple);
36
+ }
37
+ }
38
+ }
39
+ }
40
+}
\ No newline at end of file
src/WixToolset.Core.WindowsInstaller/Bind/BindDatabaseCommand.cs
+6
@@ -338,6 +338,12 @@ namespace WixToolset.Core.WindowsInstaller.Bind
338
command.Execute();
339
}
340
341
+ // Add missing CreateFolder tuples to null-keypath components.
342
+ {
343
+ var command = new AddCreateFoldersCommand(section);
344
+ command.Execute();
345
+ }
346
+
347
// stop processing if an error previously occurred
348
if (this.Messaging.EncounteredError)
349
{
src/WixToolset.Core/Compiler.cs
-17
@@ -2126,7 +2126,6 @@ namespace WixToolset.Core
2126
var id = new Identifier(AccessModifier.Private, componentIdPlaceholderWixVariable);
2127
var keyFound = false;
2128
string keyPath = null;
2129
- var shouldAddCreateFolder = false;
2129
2130
var keyPathType = ComponentKeyPathType.Directory;
2131
var location = ComponentLocation.LocalOnly;
@@ -2181,7 +2180,6 @@ namespace WixToolset.Core
2180
{
2181
keyFound = true;
2182
keyPath = null;
2184
- shouldAddCreateFolder = true;
2183
}
2184
break;
2185
case "Location":
@@ -2343,10 +2341,6 @@ namespace WixToolset.Core
2341
break;
2342
case "CreateFolder":
2343
var createdFolder = this.ParseCreateFolderElement(child, id.Id, directoryId, win64);
2346
- if (directoryId == createdFolder)
2347
- {
2348
- shouldAddCreateFolder = false;
2349
- }
2344
break;
2345
case "Environment":
2346
this.ParseEnvironmentElement(child, id.Id);
@@ -2479,17 +2473,6 @@ namespace WixToolset.Core
2473
}
2474
}
2475
2482
- if (shouldAddCreateFolder)
2483
- {
2484
- var tuple = new CreateFolderTuple(sourceLineNumbers)
2485
- {
2486
- DirectoryRef = directoryId,
2487
- ComponentRef = id.Id
2488
- };
2489
-
2490
- this.Core.AddTuple(tuple);
2491
- }
2492
-
2476
// check for conditions that exclude this component from using generated guids
2477
var isGeneratableGuidOk = "*" == guid;
2478
if (isGeneratableGuidOk)
src/test/WixToolsetTest.CoreIntegration/MsiQueryFixture.cs
+33
@@ -252,6 +252,39 @@ namespace WixToolsetTest.CoreIntegration
252
}
253
}
254
255
+ [Fact]
256
+ public void PopulatesCreateFolderTableForNullKeypathComponents()
257
+ {
258
+ var folder = TestData.Get(@"TestData\Components");
259
+
260
+ using (var fs = new DisposableFileSystem())
261
+ {
262
+ var baseFolder = fs.GetFolder();
263
+ var intermediateFolder = Path.Combine(baseFolder, "obj");
264
+ var msiPath = Path.Combine(baseFolder, @"bin\test.msi");
265
+
266
+ var result = WixRunner.Execute(new[]
267
+ {
268
+ "build",
269
+ Path.Combine(folder, "Package.wxs"),
270
+ Path.Combine(folder, "PackageComponents.wxs"),
271
+ "-loc", Path.Combine(folder, "Package.en-us.wxl"),
272
+ "-bindpath", Path.Combine(folder, "data"),
273
+ "-intermediateFolder", intermediateFolder,
274
+ "-o", msiPath
275
+ });
276
+
277
+ result.AssertSuccess();
278
+
279
+ Assert.True(File.Exists(msiPath));
280
+ var results = Query.QueryDatabase(msiPath, new[] { "CreateFolder" });
281
+ Assert.Equal(new[]
282
+ {
283
+ "CreateFolder:INSTALLFOLDER\tNullKeypathComponent",
284
+ }, results);
285
+ }
286
+ }
287
+
288
[Fact]
289
public void PopulatesCustomActionTable()
290
{
src/test/WixToolsetTest.CoreIntegration/TestData/Components/Package.en-us.wxl
new
+11
@@ -0,0 +1,11 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+
3
+<!--
4
+This file contains the declaration of all the localizable strings.
5
+-->
6
+<WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Culture="en-US">
7
+
8
+ <String Id="DowngradeError">A newer version of [ProductName] is already installed.</String>
9
+ <String Id="FeatureTitle">MsiPackage</String>
10
+
11
+</WixLocalization>
src/test/WixToolsetTest.CoreIntegration/TestData/Components/Package.wxs
new
+21
@@ -0,0 +1,21 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3
+ <Product Id="*" Name="MsiPackage" Codepage="1252" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a">
4
+ <Package InstallerVersion="200" Compressed="no" InstallScope="perMachine" />
5
+
6
+ <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" />
7
+ <MediaTemplate />
8
+
9
+ <Feature Id="ProductFeature" Title="!(loc.FeatureTitle)">
10
+ <ComponentGroupRef Id="ProductComponents" />
11
+ </Feature>
12
+ </Product>
13
+
14
+ <Fragment>
15
+ <Directory Id="TARGETDIR" Name="SourceDir">
16
+ <Directory Id="ProgramFilesFolder">
17
+ <Directory Id="INSTALLFOLDER" Name="MsiPackage" />
18
+ </Directory>
19
+ </Directory>
20
+ </Fragment>
21
+</Wix>
src/test/WixToolsetTest.CoreIntegration/TestData/Components/PackageComponents.wxs
new
+10
@@ -0,0 +1,10 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3
+ <Fragment>
4
+ <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
5
+ <Component Id="NullKeypathComponent" Guid="{C493379B-D655-4331-8F03-B618C70EA779}" KeyPath="yes">
6
+ <File Source="test.txt" />
7
+ </Component>
8
+ </ComponentGroup>
9
+ </Fragment>
10
+</Wix>
src/test/WixToolsetTest.CoreIntegration/TestData/Components/data/test.txt
new
+1
@@ -0,0 +1 @@
1
+This is test.txt.
\ No newline at end of file
src/test/WixToolsetTest.CoreIntegration/WixToolsetTest.CoreIntegration.csproj
+4
@@ -156,6 +156,10 @@
156
<Content Include="TestData\ProgId\Package.en-us.wxl" CopyToOutputDirectory="PreserveNewest" />
157
<Content Include="TestData\ProgId\Package.wxs" CopyToOutputDirectory="PreserveNewest" />
158
<Content Include="TestData\ProgId\PackageComponents.wxs" CopyToOutputDirectory="PreserveNewest" />
159
+ <Content Include="TestData\Components\data\test.txt" CopyToOutputDirectory="PreserveNewest" />
160
+ <Content Include="TestData\Components\Package.en-us.wxl" CopyToOutputDirectory="PreserveNewest" />
161
+ <Content Include="TestData\Components\Package.wxs" CopyToOutputDirectory="PreserveNewest" />
162
+ <Content Include="TestData\Components\PackageComponents.wxs" CopyToOutputDirectory="PreserveNewest" />
163
</ItemGroup>
164
165
<ItemGroup>