@joebigelow / wix-1 / commits / 1f465251

Fix harvesting providers from MSI packages.

Sean Hall committed Mar 5, 2021 at 17:38 UTC 1f4652516a385aeeeea1558738efa0863f63c9fc
4 files changed +76 -8
src/WixToolset.Core.Burn/Bundles/ProcessMsiPackageCommand.cs
+8 -6
@@ -512,7 +512,7 @@ namespace WixToolset.Core.Burn.Bundles
512 {
513 if (db.Tables.Contains("WixDependencyProvider"))
514 {
515 - var query = "SELECT `ProviderKey`, `Version`, `DisplayName`, `Attributes` FROM `WixDependencyProvider`";
515 + var query = "SELECT `WixDependencyProvider`, `ProviderKey`, `Version`, `DisplayName`, `Attributes` FROM `WixDependencyProvider`";
516
517 using (var view = db.OpenView(query))
518 {
@@ -526,14 +526,16 @@ namespace WixToolset.Core.Burn.Bundles
526 break;
527 }
528
529 + var id = new Identifier(AccessModifier.Section, Common.GenerateIdentifier("dep", msiPackage.Id.Id, record.GetString(1)));
530 +
531 // Import the provider key and attributes.
530 - this.Section.AddSymbol(new ProvidesDependencySymbol(msiPackage.SourceLineNumbers)
532 + this.Section.AddSymbol(new ProvidesDependencySymbol(msiPackage.SourceLineNumbers, id)
533 {
534 PackageRef = msiPackage.Id.Id,
533 - Key = record.GetString(1),
534 - Version = record.GetString(2) ?? msiPackage.ProductVersion,
535 - DisplayName = record.GetString(3) ?? this.Facade.PackageSymbol.DisplayName,
536 - Attributes = record.GetInteger(4),
535 + Key = record.GetString(2),
536 + Version = record.GetString(3) ?? msiPackage.ProductVersion,
537 + DisplayName = record.GetString(4) ?? this.Facade.PackageSymbol.DisplayName,
538 + Attributes = record.GetInteger(5),
539 Imported = true
540 });
541 }
src/test/WixToolsetTest.CoreIntegration/DependencyExtensionFixture.cs
+59 -1
@@ -2,6 +2,10 @@
2
3 namespace WixToolsetTest.CoreIntegration
4 {
5 + using System.Collections.Generic;
6 + using System.IO;
7 + using System.Linq;
8 + using System.Xml;
9 using WixBuildTools.TestSupport;
10 using WixToolset.Core.TestPackage;
11 using Xunit;
@@ -9,7 +13,61 @@ namespace WixToolsetTest.CoreIntegration
13 public class DependencyExtensionFixture
14 {
15 [Fact]
12 - public void CanBuildUsingProvides()
16 + public void CanBuildBundleUsingMsiWithProvides()
17 + {
18 + var folder = TestData.Get(@"TestData");
19 +
20 + using (var fs = new DisposableFileSystem())
21 + {
22 + var baseFolder = fs.GetFolder();
23 + var intermediateFolder = Path.Combine(baseFolder, "obj");
24 + var binFolder = Path.Combine(baseFolder, "bin");
25 + var bundlePath = Path.Combine(binFolder, "test.exe");
26 + var baFolderPath = Path.Combine(baseFolder, "ba");
27 + var extractFolderPath = Path.Combine(baseFolder, "extract");
28 +
29 + var result = WixRunner.Execute(new[]
30 + {
31 + "build",
32 + Path.Combine(folder, "UsingProvides", "Package.wxs"),
33 + Path.Combine(folder, "UsingProvides", "PackageComponents.wxs"),
34 + "-loc", Path.Combine(folder, "UsingProvides", "Package.en-us.wxl"),
35 + "-bindpath", Path.Combine(folder, "UsingProvides"),
36 + "-intermediateFolder", intermediateFolder,
37 + "-o", Path.Combine(binFolder, "UsingProvides.msi"),
38 + });
39 +
40 + result.AssertSuccess();
41 +
42 + result = WixRunner.Execute(new[]
43 + {
44 + "build",
45 + Path.Combine(folder, "Dependency", "UsingProvidesBundle.wxs"),
46 + Path.Combine(folder, "BundleWithPackageGroupRef", "Bundle.wxs"),
47 + "-bindpath", Path.Combine(folder, "SimpleBundle", "data"),
48 + "-bindpath", binFolder,
49 + "-intermediateFolder", intermediateFolder,
50 + "-o", bundlePath,
51 + });
52 +
53 + result.AssertSuccess();
54 +
55 + Assert.True(File.Exists(bundlePath));
56 +
57 + var extractResult = BundleExtractor.ExtractBAContainer(null, bundlePath, baFolderPath, extractFolderPath);
58 + extractResult.AssertSuccess();
59 +
60 + var provides = extractResult.SelectManifestNodes("/burn:BurnManifest/burn:Chain/burn:MsiPackage/burn:Provides");
61 + WixAssert.CompareLineByLine(new string[]
62 + {
63 + "<Provides Key='UsingProvides' Imported='yes' />",
64 + "<Provides Key='{A81D50F9-B696-4F3D-ABE0-E64D61590E5F}' Version='1.0.0.0' DisplayName='MsiPackage' />",
65 + }, provides.Cast<XmlElement>().Select(e => e.GetTestXml()).ToArray());
66 + }
67 + }
68 +
69 + [Fact]
70 + public void CanBuildPackageUsingProvides()
71 {
72 var folder = TestData.Get(@"TestData\UsingProvides");
73 var build = new Builder(folder, null, new[] { folder });
src/test/WixToolsetTest.CoreIntegration/TestData/Dependency/UsingProvidesBundle.wxs new
+8
@@ -0,0 +1,8 @@
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 + <Fragment>
4 + <PackageGroup Id="BundlePackages">
5 + <MsiPackage SourceFile="UsingProvides.msi" />
6 + </PackageGroup>
7 + </Fragment>
8 +</Wix>
src/test/WixToolsetTest.CoreIntegration/TestData/UsingProvides/Package.wxs
+1 -1
@@ -1,5 +1,5 @@
1 <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 - <Package Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a">
2 + <Package ProductCode="{A81D50F9-B696-4F3D-ABE0-E64D61590E5F}" Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a">
3
4 <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" />
5