Only packages with no dependency providers get a generated one.
Sean Hall committed
Jan 21, 2022 at 12:07 UTC
14abd47046fecdfe175b9f7a4c0a55e0bad503bf
3 files changed
+31
-17
src/wix/WixToolset.Core.Burn/Bind/ProcessDependencyProvidersCommand.cs
+8
-9
@@ -22,8 +22,6 @@ namespace WixToolset.Core.Burn.Bind
22
23
public string BundleProviderKey { get; private set; }
24
25
- public Dictionary<string, WixDependencyProviderSymbol> DependencySymbolsByKey { get; private set; }
26
-
25
private IMessaging Messaging { get; }
26
27
private IntermediateSection Section { get; }
@@ -88,7 +86,7 @@ namespace WixToolset.Core.Burn.Bind
86
}
87
}
88
91
- this.DependencySymbolsByKey = this.GetDependencySymbolsByKey(dependencySymbols);
89
+ var dependencySymbolsByPackageId = this.GetDependencySymbolsByPackageId(dependencySymbols);
90
91
// Generate providers for MSI and MSP packages that still do not have providers.
92
foreach (var facade in this.Facades.Values)
@@ -104,24 +102,23 @@ namespace WixToolset.Core.Burn.Bind
102
key = mspPackage.PatchCode;
103
}
104
107
- if (!String.IsNullOrEmpty(key) && !this.DependencySymbolsByKey.ContainsKey(key))
105
+ if (!String.IsNullOrEmpty(key) && !dependencySymbolsByPackageId.Contains(facade.PackageId))
106
{
109
- var dependency = this.Section.AddSymbol(new WixDependencyProviderSymbol(facade.PackageSymbol.SourceLineNumbers, facade.PackageSymbol.Id)
107
+ this.Section.AddSymbol(new WixDependencyProviderSymbol(facade.PackageSymbol.SourceLineNumbers, facade.PackageSymbol.Id)
108
{
109
ParentRef = facade.PackageId,
110
ProviderKey = key,
111
Version = facade.PackageSymbol.Version,
112
DisplayName = facade.PackageSymbol.DisplayName
113
});
116
-
117
- this.DependencySymbolsByKey.Add(dependency.ProviderKey, dependency);
114
}
115
}
116
}
117
122
- private Dictionary<string, WixDependencyProviderSymbol> GetDependencySymbolsByKey(IEnumerable<WixDependencyProviderSymbol> dependencySymbols)
118
+ private HashSet<string> GetDependencySymbolsByPackageId(IEnumerable<WixDependencyProviderSymbol> dependencySymbols)
119
{
120
var dependencySymbolsByKey = new Dictionary<string, WixDependencyProviderSymbol>();
121
+ var dependencySymbolsByPackageId = new HashSet<string>();
122
123
foreach (var dependency in dependencySymbols)
124
{
@@ -139,9 +136,11 @@ namespace WixToolset.Core.Burn.Bind
136
{
137
dependencySymbolsByKey.Add(dependency.ProviderKey, dependency);
138
}
139
+
140
+ dependencySymbolsByPackageId.Add(dependency.ParentRef);
141
}
142
144
- return dependencySymbolsByKey;
143
+ return dependencySymbolsByPackageId;
144
}
145
}
146
}
src/wix/test/WixToolsetTest.CoreIntegration/ContainerFixture.cs
+23
-7
@@ -9,6 +9,9 @@ namespace WixToolsetTest.CoreIntegration
9
using WixBuildTools.TestSupport;
10
using WixToolset.Core.Burn.Bundles;
11
using WixToolset.Core.TestPackage;
12
+ using WixToolset.Data;
13
+ using WixToolset.Data.WindowsInstaller;
14
+ using WixToolset.Data.WindowsInstaller.Rows;
15
using Xunit;
16
17
public class ContainerFixture
@@ -115,7 +118,7 @@ namespace WixToolsetTest.CoreIntegration
118
var baFolderPath = Path.Combine(baseFolder, "ba");
119
var extractFolderPath = Path.Combine(baseFolder, "extract");
120
118
- this.BuildMsis(folder, intermediateFolder, binFolder);
121
+ var pdbPaths = this.BuildMsis(folder, intermediateFolder, binFolder);
122
123
var result = WixRunner.Execute(new[]
124
{
@@ -138,7 +141,6 @@ namespace WixToolsetTest.CoreIntegration
141
var ignoreAttributes = new Dictionary<string, List<string>>
142
{
143
{ "MsiPackage", new List<string> { "CacheId", "InstallSize", "Size", "ProductCode" } },
141
- { "Provides", new List<string> { "Key" } },
144
};
145
var msiPackages = extractResult.SelectManifestNodes("/burn:BurnManifest/burn:Chain/burn:MsiPackage")
146
.Cast<XmlElement>()
@@ -148,7 +150,7 @@ namespace WixToolsetTest.CoreIntegration
150
{
151
"<MsiPackage Id='FirstX86.msi' Cache='keep' CacheId='*' InstallSize='*' Size='*' PerMachine='yes' Permanent='no' Vital='yes' RollbackBoundaryForward='WixDefaultBoundary' LogPathVariable='WixBundleLog_FirstX86.msi' RollbackLogPathVariable='WixBundleRollbackLog_FirstX86.msi' ProductCode='*' Language='1033' Version='1.0.0.0' UpgradeCode='{12E4699F-E774-4D05-8A01-5BDD41BBA127}'>" +
152
"<MsiProperty Id='ARPSYSTEMCOMPONENT' Value='1' />" +
151
- "<Provides Key='*' Version='1.0.0.0' DisplayName='MsiPackage' />" +
153
+ $"<Provides Key='{GetProductCodeFromMsiPdb(pdbPaths[0])}' Version='1.0.0.0' DisplayName='MsiPackage' />" +
154
"<RelatedPackage Id='{12E4699F-E774-4D05-8A01-5BDD41BBA127}' MaxVersion='1.0.0.0' MaxInclusive='no' OnlyDetect='no' LangInclusive='no'><Language Id='1033' /></RelatedPackage>" +
155
"<RelatedPackage Id='{12E4699F-E774-4D05-8A01-5BDD41BBA127}' MinVersion='1.0.0.0' MinInclusive='no' OnlyDetect='yes' LangInclusive='no'><Language Id='1033' /></RelatedPackage>" +
156
"<PayloadRef Id='FirstX86.msi' />" +
@@ -156,7 +158,7 @@ namespace WixToolsetTest.CoreIntegration
158
"</MsiPackage>",
159
"<MsiPackage Id='FirstX64.msi' Cache='keep' CacheId='*' InstallSize='*' Size='*' PerMachine='yes' Permanent='no' Vital='yes' RollbackBoundaryBackward='WixDefaultBoundary' LogPathVariable='WixBundleLog_FirstX64.msi' RollbackLogPathVariable='WixBundleRollbackLog_FirstX64.msi' ProductCode='*' Language='1033' Version='1.0.0.0' UpgradeCode='{12E4699F-E774-4D05-8A01-5BDD41BBA127}'>" +
160
"<MsiProperty Id='ARPSYSTEMCOMPONENT' Value='1' />" +
159
- "<Provides Key='*' Version='1.0.0.0' DisplayName='MsiPackage' />" +
161
+ $"<Provides Key='{GetProductCodeFromMsiPdb(pdbPaths[1])}' Version='1.0.0.0' DisplayName='MsiPackage' />" +
162
"<RelatedPackage Id='{12E4699F-E774-4D05-8A01-5BDD41BBA127}' MaxVersion='1.0.0.0' MaxInclusive='no' OnlyDetect='no' LangInclusive='no'><Language Id='1033' /></RelatedPackage>" +
163
"<RelatedPackage Id='{12E4699F-E774-4D05-8A01-5BDD41BBA127}' MinVersion='1.0.0.0' MinInclusive='no' OnlyDetect='yes' LangInclusive='no'><Language Id='1033' /></RelatedPackage>" +
164
"<PayloadRef Id='FirstX64.msi' />" +
@@ -372,8 +374,9 @@ namespace WixToolsetTest.CoreIntegration
374
}
375
}
376
375
- private void BuildMsis(string folder, string intermediateFolder, string binFolder, bool buildToSubfolder = false)
377
+ private string[] BuildMsis(string folder, string intermediateFolder, string binFolder, bool buildToSubfolder = false)
378
{
379
+ var x86OutputPath = Path.Combine(binFolder, buildToSubfolder ? "FirstX86" : ".", "FirstX86.msi");
380
var result = WixRunner.Execute(new[]
381
{
382
"build",
@@ -382,11 +385,12 @@ namespace WixToolsetTest.CoreIntegration
385
Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
386
"-bindpath", Path.Combine(folder, "SingleFile", "data"),
387
"-intermediateFolder", intermediateFolder,
385
- "-o", Path.Combine(binFolder, buildToSubfolder ? "FirstX86" : ".", "FirstX86.msi"),
388
+ "-o", x86OutputPath,
389
});
390
391
result.AssertSuccess();
392
393
+ var x64OutputPath = Path.Combine(binFolder, buildToSubfolder ? "FirstX64" : ".", "FirstX64.msi");
394
result = WixRunner.Execute(new[]
395
{
396
"build",
@@ -395,10 +399,22 @@ namespace WixToolsetTest.CoreIntegration
399
Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
400
"-bindpath", Path.Combine(folder, "SingleFile", "data"),
401
"-intermediateFolder", intermediateFolder,
398
- "-o", Path.Combine(binFolder, buildToSubfolder ? "FirstX64" : ".", "FirstX64.msi"),
402
+ "-o", x64OutputPath,
403
});
404
405
result.AssertSuccess();
406
+
407
+ return new[]
408
+ {
409
+ Path.ChangeExtension(x86OutputPath, ".wixpdb"),
410
+ Path.ChangeExtension(x64OutputPath, ".wixpdb"),
411
+ };
412
+ }
413
+
414
+ private static string GetProductCodeFromMsiPdb(string pdbPath)
415
+ {
416
+ var wiData = WindowsInstallerData.Load(pdbPath, suppressVersionCheck: false);
417
+ return wiData.Tables["Property"].Rows.Cast<PropertyRow>().Single(r => r.Property == "ProductCode").Value;
418
}
419
}
420
}
src/wix/test/WixToolsetTest.CoreIntegration/DependencyExtensionFixture.cs
-1
@@ -107,7 +107,6 @@ namespace WixToolsetTest.CoreIntegration
107
WixAssert.CompareLineByLine(new string[]
108
{
109
"<Provides Key='UsingProvides' Version='1.0.0.0' DisplayName='MsiPackage' Imported='yes' />",
110
- "<Provides Key='{A81D50F9-B696-4F3D-ABE0-E64D61590E5F}' Version='1.0.0.0' DisplayName='MsiPackage' />",
110
}, provides);
111
}
112
}