@joebigelow / wix / commits / 14abd470

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 }