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