@joebigelow / wix / commits / 57559c25

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>