aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2022-01-21 12:07:53 -0600
committerSean Hall <r.sean.hall@gmail.com>2022-01-21 17:29:12 -0600
commit14abd47046fecdfe175b9f7a4c0a55e0bad503bf (patch)
treead0f5f3b789b366bc35dbc04444d46c94e32f829
parent89439409a0776dce25216fcef360856ba81a86da (diff)
downloadwix-14abd47046fecdfe175b9f7a4c0a55e0bad503bf.tar.gz
wix-14abd47046fecdfe175b9f7a4c0a55e0bad503bf.tar.bz2
wix-14abd47046fecdfe175b9f7a4c0a55e0bad503bf.zip
Only packages with no dependency providers get a generated one.
-rw-r--r--src/wix/WixToolset.Core.Burn/Bind/ProcessDependencyProvidersCommand.cs17
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/ContainerFixture.cs30
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/DependencyExtensionFixture.cs1
3 files changed, 31 insertions, 17 deletions
diff --git a/src/wix/WixToolset.Core.Burn/Bind/ProcessDependencyProvidersCommand.cs b/src/wix/WixToolset.Core.Burn/Bind/ProcessDependencyProvidersCommand.cs
index 99effbc7..5df6c887 100644
--- a/src/wix/WixToolset.Core.Burn/Bind/ProcessDependencyProvidersCommand.cs
+++ b/src/wix/WixToolset.Core.Burn/Bind/ProcessDependencyProvidersCommand.cs
@@ -22,8 +22,6 @@ namespace WixToolset.Core.Burn.Bind
22 22
23 public string BundleProviderKey { get; private set; } 23 public string BundleProviderKey { get; private set; }
24 24
25 public Dictionary<string, WixDependencyProviderSymbol> DependencySymbolsByKey { get; private set; }
26
27 private IMessaging Messaging { get; } 25 private IMessaging Messaging { get; }
28 26
29 private IntermediateSection Section { get; } 27 private IntermediateSection Section { get; }
@@ -88,7 +86,7 @@ namespace WixToolset.Core.Burn.Bind
88 } 86 }
89 } 87 }
90 88
91 this.DependencySymbolsByKey = this.GetDependencySymbolsByKey(dependencySymbols); 89 var dependencySymbolsByPackageId = this.GetDependencySymbolsByPackageId(dependencySymbols);
92 90
93 // Generate providers for MSI and MSP packages that still do not have providers. 91 // Generate providers for MSI and MSP packages that still do not have providers.
94 foreach (var facade in this.Facades.Values) 92 foreach (var facade in this.Facades.Values)
@@ -104,24 +102,23 @@ namespace WixToolset.Core.Burn.Bind
104 key = mspPackage.PatchCode; 102 key = mspPackage.PatchCode;
105 } 103 }
106 104
107 if (!String.IsNullOrEmpty(key) && !this.DependencySymbolsByKey.ContainsKey(key)) 105 if (!String.IsNullOrEmpty(key) && !dependencySymbolsByPackageId.Contains(facade.PackageId))
108 { 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)
110 { 108 {
111 ParentRef = facade.PackageId, 109 ParentRef = facade.PackageId,
112 ProviderKey = key, 110 ProviderKey = key,
113 Version = facade.PackageSymbol.Version, 111 Version = facade.PackageSymbol.Version,
114 DisplayName = facade.PackageSymbol.DisplayName 112 DisplayName = facade.PackageSymbol.DisplayName
115 }); 113 });
116
117 this.DependencySymbolsByKey.Add(dependency.ProviderKey, dependency);
118 } 114 }
119 } 115 }
120 } 116 }
121 117
122 private Dictionary<string, WixDependencyProviderSymbol> GetDependencySymbolsByKey(IEnumerable<WixDependencyProviderSymbol> dependencySymbols) 118 private HashSet<string> GetDependencySymbolsByPackageId(IEnumerable<WixDependencyProviderSymbol> dependencySymbols)
123 { 119 {
124 var dependencySymbolsByKey = new Dictionary<string, WixDependencyProviderSymbol>(); 120 var dependencySymbolsByKey = new Dictionary<string, WixDependencyProviderSymbol>();
121 var dependencySymbolsByPackageId = new HashSet<string>();
125 122
126 foreach (var dependency in dependencySymbols) 123 foreach (var dependency in dependencySymbols)
127 { 124 {
@@ -139,9 +136,11 @@ namespace WixToolset.Core.Burn.Bind
139 { 136 {
140 dependencySymbolsByKey.Add(dependency.ProviderKey, dependency); 137 dependencySymbolsByKey.Add(dependency.ProviderKey, dependency);
141 } 138 }
139
140 dependencySymbolsByPackageId.Add(dependency.ParentRef);
142 } 141 }
143 142
144 return dependencySymbolsByKey; 143 return dependencySymbolsByPackageId;
145 } 144 }
146 } 145 }
147} 146}
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/ContainerFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/ContainerFixture.cs
index 482a6edd..70aca8c0 100644
--- a/src/wix/test/WixToolsetTest.CoreIntegration/ContainerFixture.cs
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/ContainerFixture.cs
@@ -9,6 +9,9 @@ namespace WixToolsetTest.CoreIntegration
9 using WixBuildTools.TestSupport; 9 using WixBuildTools.TestSupport;
10 using WixToolset.Core.Burn.Bundles; 10 using WixToolset.Core.Burn.Bundles;
11 using WixToolset.Core.TestPackage; 11 using WixToolset.Core.TestPackage;
12 using WixToolset.Data;
13 using WixToolset.Data.WindowsInstaller;
14 using WixToolset.Data.WindowsInstaller.Rows;
12 using Xunit; 15 using Xunit;
13 16
14 public class ContainerFixture 17 public class ContainerFixture
@@ -115,7 +118,7 @@ namespace WixToolsetTest.CoreIntegration
115 var baFolderPath = Path.Combine(baseFolder, "ba"); 118 var baFolderPath = Path.Combine(baseFolder, "ba");
116 var extractFolderPath = Path.Combine(baseFolder, "extract"); 119 var extractFolderPath = Path.Combine(baseFolder, "extract");
117 120
118 this.BuildMsis(folder, intermediateFolder, binFolder); 121 var pdbPaths = this.BuildMsis(folder, intermediateFolder, binFolder);
119 122
120 var result = WixRunner.Execute(new[] 123 var result = WixRunner.Execute(new[]
121 { 124 {
@@ -138,7 +141,6 @@ namespace WixToolsetTest.CoreIntegration
138 var ignoreAttributes = new Dictionary<string, List<string>> 141 var ignoreAttributes = new Dictionary<string, List<string>>
139 { 142 {
140 { "MsiPackage", new List<string> { "CacheId", "InstallSize", "Size", "ProductCode" } }, 143 { "MsiPackage", new List<string> { "CacheId", "InstallSize", "Size", "ProductCode" } },
141 { "Provides", new List<string> { "Key" } },
142 }; 144 };
143 var msiPackages = extractResult.SelectManifestNodes("/burn:BurnManifest/burn:Chain/burn:MsiPackage") 145 var msiPackages = extractResult.SelectManifestNodes("/burn:BurnManifest/burn:Chain/burn:MsiPackage")
144 .Cast<XmlElement>() 146 .Cast<XmlElement>()
@@ -148,7 +150,7 @@ namespace WixToolsetTest.CoreIntegration
148 { 150 {
149 "<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}'>" + 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}'>" +
150 "<MsiProperty Id='ARPSYSTEMCOMPONENT' Value='1' />" + 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' />" +
152 "<RelatedPackage Id='{12E4699F-E774-4D05-8A01-5BDD41BBA127}' MaxVersion='1.0.0.0' MaxInclusive='no' OnlyDetect='no' LangInclusive='no'><Language Id='1033' /></RelatedPackage>" + 154 "<RelatedPackage Id='{12E4699F-E774-4D05-8A01-5BDD41BBA127}' MaxVersion='1.0.0.0' MaxInclusive='no' OnlyDetect='no' LangInclusive='no'><Language Id='1033' /></RelatedPackage>" +
153 "<RelatedPackage Id='{12E4699F-E774-4D05-8A01-5BDD41BBA127}' MinVersion='1.0.0.0' MinInclusive='no' OnlyDetect='yes' 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>" +
154 "<PayloadRef Id='FirstX86.msi' />" + 156 "<PayloadRef Id='FirstX86.msi' />" +
@@ -156,7 +158,7 @@ namespace WixToolsetTest.CoreIntegration
156 "</MsiPackage>", 158 "</MsiPackage>",
157 "<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}'>" + 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}'>" +
158 "<MsiProperty Id='ARPSYSTEMCOMPONENT' Value='1' />" + 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' />" +
160 "<RelatedPackage Id='{12E4699F-E774-4D05-8A01-5BDD41BBA127}' MaxVersion='1.0.0.0' MaxInclusive='no' OnlyDetect='no' LangInclusive='no'><Language Id='1033' /></RelatedPackage>" + 162 "<RelatedPackage Id='{12E4699F-E774-4D05-8A01-5BDD41BBA127}' MaxVersion='1.0.0.0' MaxInclusive='no' OnlyDetect='no' LangInclusive='no'><Language Id='1033' /></RelatedPackage>" +
161 "<RelatedPackage Id='{12E4699F-E774-4D05-8A01-5BDD41BBA127}' MinVersion='1.0.0.0' MinInclusive='no' OnlyDetect='yes' 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>" +
162 "<PayloadRef Id='FirstX64.msi' />" + 164 "<PayloadRef Id='FirstX64.msi' />" +
@@ -372,8 +374,9 @@ namespace WixToolsetTest.CoreIntegration
372 } 374 }
373 } 375 }
374 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)
376 { 378 {
379 var x86OutputPath = Path.Combine(binFolder, buildToSubfolder ? "FirstX86" : ".", "FirstX86.msi");
377 var result = WixRunner.Execute(new[] 380 var result = WixRunner.Execute(new[]
378 { 381 {
379 "build", 382 "build",
@@ -382,11 +385,12 @@ namespace WixToolsetTest.CoreIntegration
382 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"), 385 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
383 "-bindpath", Path.Combine(folder, "SingleFile", "data"), 386 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
384 "-intermediateFolder", intermediateFolder, 387 "-intermediateFolder", intermediateFolder,
385 "-o", Path.Combine(binFolder, buildToSubfolder ? "FirstX86" : ".", "FirstX86.msi"), 388 "-o", x86OutputPath,
386 }); 389 });
387 390
388 result.AssertSuccess(); 391 result.AssertSuccess();
389 392
393 var x64OutputPath = Path.Combine(binFolder, buildToSubfolder ? "FirstX64" : ".", "FirstX64.msi");
390 result = WixRunner.Execute(new[] 394 result = WixRunner.Execute(new[]
391 { 395 {
392 "build", 396 "build",
@@ -395,10 +399,22 @@ namespace WixToolsetTest.CoreIntegration
395 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"), 399 Path.Combine(folder, "ProductWithComponentGroupRef", "Product.wxs"),
396 "-bindpath", Path.Combine(folder, "SingleFile", "data"), 400 "-bindpath", Path.Combine(folder, "SingleFile", "data"),
397 "-intermediateFolder", intermediateFolder, 401 "-intermediateFolder", intermediateFolder,
398 "-o", Path.Combine(binFolder, buildToSubfolder ? "FirstX64" : ".", "FirstX64.msi"), 402 "-o", x64OutputPath,
399 }); 403 });
400 404
401 result.AssertSuccess(); 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;
402 } 418 }
403 } 419 }
404} 420}
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/DependencyExtensionFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/DependencyExtensionFixture.cs
index 1f1a121e..36855c84 100644
--- a/src/wix/test/WixToolsetTest.CoreIntegration/DependencyExtensionFixture.cs
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/DependencyExtensionFixture.cs
@@ -107,7 +107,6 @@ namespace WixToolsetTest.CoreIntegration
107 WixAssert.CompareLineByLine(new string[] 107 WixAssert.CompareLineByLine(new string[]
108 { 108 {
109 "<Provides Key='UsingProvides' Version='1.0.0.0' DisplayName='MsiPackage' Imported='yes' />", 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' />",
111 }, provides); 110 }, provides);
112 } 111 }
113 } 112 }