aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Mensching <rob@firegiant.com>2021-03-23 14:00:43 -0700
committerRob Mensching <rob@firegiant.com>2021-03-23 14:04:13 -0700
commit26442d4177bd6e108f2cf4cc2fb2599e624ff6c4 (patch)
treebaf551bad4acc1644339b27f3060def1b4e9217b
parent8a3ce82d689e16424620e3b52161f19771d19d1d (diff)
downloadwix-26442d4177bd6e108f2cf4cc2fb2599e624ff6c4.tar.gz
wix-26442d4177bd6e108f2cf4cc2fb2599e624ff6c4.tar.bz2
wix-26442d4177bd6e108f2cf4cc2fb2599e624ff6c4.zip
Fix dependency providers in a Bundle chain
Fixes wixtoolset/issues#6388
-rw-r--r--src/WixToolset.Core.Burn/Bind/BindBundleCommand.cs4
-rw-r--r--src/WixToolset.Core.Burn/Bind/ProcessDependencyProvidersCommand.cs57
-rw-r--r--src/WixToolset.Core.Burn/Bundles/CreateBurnManifestCommand.cs4
-rw-r--r--src/WixToolset.Core.Burn/Bundles/ProcessMsiPackageCommand.cs9
-rw-r--r--src/WixToolset.Core.WindowsInstaller/Bind/ProcessDependencyReferencesCommand.cs2
-rw-r--r--src/WixToolset.Core/Compiler_Dependency.cs4
-rw-r--r--src/test/WixToolsetTest.CoreIntegration/DependencyExtensionFixture.cs6
7 files changed, 35 insertions, 51 deletions
diff --git a/src/WixToolset.Core.Burn/Bind/BindBundleCommand.cs b/src/WixToolset.Core.Burn/Bind/BindBundleCommand.cs
index d154fef9..1cc9987e 100644
--- a/src/WixToolset.Core.Burn/Bind/BindBundleCommand.cs
+++ b/src/WixToolset.Core.Burn/Bind/BindBundleCommand.cs
@@ -369,7 +369,7 @@ namespace WixToolset.Core.Burn
369 this.BackendHelper.ResolveDelayedFields(this.DelayedFields, variableCache); 369 this.BackendHelper.ResolveDelayedFields(this.DelayedFields, variableCache);
370 } 370 }
371 371
372 Dictionary<string, ProvidesDependencySymbol> dependencySymbolsByKey; 372 Dictionary<string, WixDependencyProviderSymbol> dependencySymbolsByKey;
373 { 373 {
374 var command = new ProcessDependencyProvidersCommand(this.Messaging, section, facades); 374 var command = new ProcessDependencyProvidersCommand(this.Messaging, section, facades);
375 command.Execute(); 375 command.Execute();
@@ -542,7 +542,7 @@ namespace WixToolset.Core.Burn
542 542
543 private void ResolveBundleInstallScope(IntermediateSection section, WixBundleSymbol bundleSymbol, IEnumerable<PackageFacade> facades) 543 private void ResolveBundleInstallScope(IntermediateSection section, WixBundleSymbol bundleSymbol, IEnumerable<PackageFacade> facades)
544 { 544 {
545 var dependencySymbolsById = section.Symbols.OfType<ProvidesDependencySymbol>().ToDictionary(t => t.Id.Id); 545 var dependencySymbolsById = section.Symbols.OfType<WixDependencyProviderSymbol>().ToDictionary(t => t.Id.Id);
546 546
547 foreach (var facade in facades) 547 foreach (var facade in facades)
548 { 548 {
diff --git a/src/WixToolset.Core.Burn/Bind/ProcessDependencyProvidersCommand.cs b/src/WixToolset.Core.Burn/Bind/ProcessDependencyProvidersCommand.cs
index 29815203..99effbc7 100644
--- a/src/WixToolset.Core.Burn/Bind/ProcessDependencyProvidersCommand.cs
+++ b/src/WixToolset.Core.Burn/Bind/ProcessDependencyProvidersCommand.cs
@@ -22,7 +22,7 @@ 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, ProvidesDependencySymbol> DependencySymbolsByKey { get; private set; } 25 public Dictionary<string, WixDependencyProviderSymbol> DependencySymbolsByKey { get; private set; }
26 26
27 private IMessaging Messaging { get; } 27 private IMessaging Messaging { get; }
28 28
@@ -38,43 +38,34 @@ namespace WixToolset.Core.Burn.Bind
38 /// </summary> 38 /// </summary>
39 public void Execute() 39 public void Execute()
40 { 40 {
41 var wixDependencyProviderSymbols = this.Section.Symbols.OfType<WixDependencyProviderSymbol>(); 41 var dependencySymbols = this.Section.Symbols.OfType<WixDependencyProviderSymbol>();
42 42
43 foreach (var wixDependencyProviderSymbol in wixDependencyProviderSymbols) 43 foreach (var dependency in dependencySymbols)
44 { 44 {
45 // Sets the provider key for the bundle, if it is not set already. 45 // Sets the provider key for the bundle, if it is not set already.
46 if (String.IsNullOrEmpty(this.BundleProviderKey)) 46 if (String.IsNullOrEmpty(this.BundleProviderKey))
47 { 47 {
48 if (wixDependencyProviderSymbol.Bundle) 48 if (dependency.Bundle)
49 { 49 {
50 this.BundleProviderKey = wixDependencyProviderSymbol.ProviderKey; 50 this.BundleProviderKey = dependency.ProviderKey;
51 } 51 }
52 } 52 }
53 53
54 // Import any authored dependencies. These may merge with imported provides from MSI packages. 54 // Import any authored dependencies. These may merge with imported provides from MSI packages.
55 var packageId = wixDependencyProviderSymbol.Id.Id; 55 var packageId = dependency.ParentRef;
56 56
57 if (this.Facades.TryGetValue(packageId, out var facade)) 57 if (this.Facades.TryGetValue(packageId, out var facade))
58 { 58 {
59 var dependency = this.Section.AddSymbol(new ProvidesDependencySymbol(wixDependencyProviderSymbol.SourceLineNumbers, wixDependencyProviderSymbol.Id) 59 if (String.IsNullOrEmpty(dependency.ProviderKey))
60 {
61 PackageRef = packageId,
62 Key = wixDependencyProviderSymbol.ProviderKey,
63 Version = wixDependencyProviderSymbol.Version,
64 DisplayName = wixDependencyProviderSymbol.DisplayName,
65 Attributes = (int)wixDependencyProviderSymbol.Attributes
66 });
67
68 if (String.IsNullOrEmpty(dependency.Key))
69 { 60 {
70 switch (facade.SpecificPackageSymbol) 61 switch (facade.SpecificPackageSymbol)
71 { 62 {
72 // The WixDependencyExtension allows an empty Key for MSIs and MSPs. 63 // The WixDependencyExtension allows an empty Key for MSIs and MSPs.
73 case WixBundleMsiPackageSymbol msiPackage: 64 case WixBundleMsiPackageSymbol msiPackage:
74 dependency.Key = msiPackage.ProductCode; 65 dependency.ProviderKey = msiPackage.ProductCode;
75 break; 66 break;
76 case WixBundleMspPackageSymbol mspPackage: 67 case WixBundleMspPackageSymbol mspPackage:
77 dependency.Key = mspPackage.PatchCode; 68 dependency.ProviderKey = mspPackage.PatchCode;
78 break; 69 break;
79 } 70 }
80 } 71 }
@@ -84,7 +75,7 @@ namespace WixToolset.Core.Burn.Bind
84 dependency.Version = facade.PackageSymbol.Version; 75 dependency.Version = facade.PackageSymbol.Version;
85 } 76 }
86 77
87 // If the version is still missing, a version could not be harvested from the package and was not authored. 78 // If the version is still missing, a version could not be gathered from the package and was not authored.
88 if (String.IsNullOrEmpty(dependency.Version)) 79 if (String.IsNullOrEmpty(dependency.Version))
89 { 80 {
90 this.Messaging.Write(ErrorMessages.MissingDependencyVersion(facade.PackageId)); 81 this.Messaging.Write(ErrorMessages.MissingDependencyVersion(facade.PackageId));
@@ -97,62 +88,56 @@ namespace WixToolset.Core.Burn.Bind
97 } 88 }
98 } 89 }
99 90
100 this.DependencySymbolsByKey = this.GetDependencySymbolsByKey(); 91 this.DependencySymbolsByKey = this.GetDependencySymbolsByKey(dependencySymbols);
101 92
102 // Generate providers for MSI and MSP packages that still do not have providers. 93 // Generate providers for MSI and MSP packages that still do not have providers.
103 foreach (var facade in this.Facades.Values) 94 foreach (var facade in this.Facades.Values)
104 { 95 {
105 string key = null; 96 string key = null;
106 97
107 //if (WixBundlePackageType.Msi == facade.PackageSymbol.Type)
108 if (facade.SpecificPackageSymbol is WixBundleMsiPackageSymbol msiPackage) 98 if (facade.SpecificPackageSymbol is WixBundleMsiPackageSymbol msiPackage)
109 { 99 {
110 //var msiPackage = (WixBundleMsiPackageSymbol)facade.SpecificPackageSymbol;
111 key = msiPackage.ProductCode; 100 key = msiPackage.ProductCode;
112 } 101 }
113 //else if (WixBundlePackageType.Msp == facade.PackageSymbol.Type)
114 else if (facade.SpecificPackageSymbol is WixBundleMspPackageSymbol mspPackage) 102 else if (facade.SpecificPackageSymbol is WixBundleMspPackageSymbol mspPackage)
115 { 103 {
116 //var mspPackage = (WixBundleMspPackageSymbol)facade.SpecificPackageSymbol;
117 key = mspPackage.PatchCode; 104 key = mspPackage.PatchCode;
118 } 105 }
119 106
120 if (!String.IsNullOrEmpty(key) && !this.DependencySymbolsByKey.ContainsKey(key)) 107 if (!String.IsNullOrEmpty(key) && !this.DependencySymbolsByKey.ContainsKey(key))
121 { 108 {
122 var dependency = this.Section.AddSymbol(new ProvidesDependencySymbol(facade.PackageSymbol.SourceLineNumbers, facade.PackageSymbol.Id) 109 var dependency = this.Section.AddSymbol(new WixDependencyProviderSymbol(facade.PackageSymbol.SourceLineNumbers, facade.PackageSymbol.Id)
123 { 110 {
124 PackageRef = facade.PackageId, 111 ParentRef = facade.PackageId,
125 Key = key, 112 ProviderKey = key,
126 Version = facade.PackageSymbol.Version, 113 Version = facade.PackageSymbol.Version,
127 DisplayName = facade.PackageSymbol.DisplayName 114 DisplayName = facade.PackageSymbol.DisplayName
128 }); 115 });
129 116
130 this.DependencySymbolsByKey.Add(dependency.Key, dependency); 117 this.DependencySymbolsByKey.Add(dependency.ProviderKey, dependency);
131 } 118 }
132 } 119 }
133 } 120 }
134 121
135 private Dictionary<string, ProvidesDependencySymbol> GetDependencySymbolsByKey() 122 private Dictionary<string, WixDependencyProviderSymbol> GetDependencySymbolsByKey(IEnumerable<WixDependencyProviderSymbol> dependencySymbols)
136 { 123 {
137 var dependencySymbolsByKey = new Dictionary<string, ProvidesDependencySymbol>(); 124 var dependencySymbolsByKey = new Dictionary<string, WixDependencyProviderSymbol>();
138
139 var dependencySymbols = this.Section.Symbols.OfType<ProvidesDependencySymbol>();
140 125
141 foreach (var dependency in dependencySymbols) 126 foreach (var dependency in dependencySymbols)
142 { 127 {
143 if (dependencySymbolsByKey.TryGetValue(dependency.Key, out var collision)) 128 if (dependencySymbolsByKey.TryGetValue(dependency.ProviderKey, out var collision))
144 { 129 {
145 // If not a perfect dependency collision, display an error. 130 // If not a perfect dependency collision, display an error.
146 if (dependency.Key != collision.Key || 131 if (dependency.ProviderKey != collision.ProviderKey ||
147 dependency.Version != collision.Version || 132 dependency.Version != collision.Version ||
148 dependency.DisplayName != collision.DisplayName) 133 dependency.DisplayName != collision.DisplayName)
149 { 134 {
150 this.Messaging.Write(ErrorMessages.DuplicateProviderDependencyKey(dependency.Key, dependency.PackageRef)); 135 this.Messaging.Write(ErrorMessages.DuplicateProviderDependencyKey(dependency.ProviderKey, dependency.ParentRef));
151 } 136 }
152 } 137 }
153 else 138 else
154 { 139 {
155 dependencySymbolsByKey.Add(dependency.Key, dependency); 140 dependencySymbolsByKey.Add(dependency.ProviderKey, dependency);
156 } 141 }
157 } 142 }
158 143
diff --git a/src/WixToolset.Core.Burn/Bundles/CreateBurnManifestCommand.cs b/src/WixToolset.Core.Burn/Bundles/CreateBurnManifestCommand.cs
index 0c16ea26..016850e9 100644
--- a/src/WixToolset.Core.Burn/Bundles/CreateBurnManifestCommand.cs
+++ b/src/WixToolset.Core.Burn/Bundles/CreateBurnManifestCommand.cs
@@ -336,7 +336,7 @@ namespace WixToolset.Core.Burn.Bundles
336 var exitCodesByPackage = this.Section.Symbols.OfType<WixBundlePackageExitCodeSymbol>().ToLookup(r => r.ChainPackageId); 336 var exitCodesByPackage = this.Section.Symbols.OfType<WixBundlePackageExitCodeSymbol>().ToLookup(r => r.ChainPackageId);
337 var commandLinesByPackage = this.Section.Symbols.OfType<WixBundlePackageCommandLineSymbol>().ToLookup(r => r.WixBundlePackageRef); 337 var commandLinesByPackage = this.Section.Symbols.OfType<WixBundlePackageCommandLineSymbol>().ToLookup(r => r.WixBundlePackageRef);
338 338
339 var dependenciesByPackage = this.Section.Symbols.OfType<ProvidesDependencySymbol>().ToLookup(p => p.PackageRef); 339 var dependenciesByPackage = this.Section.Symbols.OfType<WixDependencyProviderSymbol>().ToLookup(p => p.ParentRef);
340 340
341 341
342 // Build up the list of target codes from all the MSPs in the chain. 342 // Build up the list of target codes from all the MSPs in the chain.
@@ -511,7 +511,7 @@ namespace WixToolset.Core.Burn.Bundles
511 foreach (var dependency in dependencies) 511 foreach (var dependency in dependencies)
512 { 512 {
513 writer.WriteStartElement("Provides"); 513 writer.WriteStartElement("Provides");
514 writer.WriteAttributeString("Key", dependency.Key); 514 writer.WriteAttributeString("Key", dependency.ProviderKey);
515 515
516 if (!String.IsNullOrEmpty(dependency.Version)) 516 if (!String.IsNullOrEmpty(dependency.Version))
517 { 517 {
diff --git a/src/WixToolset.Core.Burn/Bundles/ProcessMsiPackageCommand.cs b/src/WixToolset.Core.Burn/Bundles/ProcessMsiPackageCommand.cs
index 4bc40011..ec472a53 100644
--- a/src/WixToolset.Core.Burn/Bundles/ProcessMsiPackageCommand.cs
+++ b/src/WixToolset.Core.Burn/Bundles/ProcessMsiPackageCommand.cs
@@ -541,14 +541,13 @@ namespace WixToolset.Core.Burn.Bundles
541 var id = new Identifier(AccessModifier.Section, this.BackendHelper.GenerateIdentifier("dep", msiPackage.Id.Id, record.GetString(1))); 541 var id = new Identifier(AccessModifier.Section, this.BackendHelper.GenerateIdentifier("dep", msiPackage.Id.Id, record.GetString(1)));
542 542
543 // Import the provider key and attributes. 543 // Import the provider key and attributes.
544 this.Section.AddSymbol(new ProvidesDependencySymbol(msiPackage.SourceLineNumbers, id) 544 this.Section.AddSymbol(new WixDependencyProviderSymbol(msiPackage.SourceLineNumbers, id)
545 { 545 {
546 PackageRef = msiPackage.Id.Id, 546 ParentRef = msiPackage.Id.Id,
547 Key = record.GetString(2), 547 ProviderKey = record.GetString(2),
548 Version = record.GetString(3) ?? msiPackage.ProductVersion, 548 Version = record.GetString(3) ?? msiPackage.ProductVersion,
549 DisplayName = record.GetString(4) ?? this.Facade.PackageSymbol.DisplayName, 549 DisplayName = record.GetString(4) ?? this.Facade.PackageSymbol.DisplayName,
550 Attributes = record.GetInteger(5), 550 Attributes = WixDependencyProviderAttributes.ProvidesAttributesImported | (WixDependencyProviderAttributes)record.GetInteger(5),
551 Imported = true
552 }); 551 });
553 } 552 }
554 } 553 }
diff --git a/src/WixToolset.Core.WindowsInstaller/Bind/ProcessDependencyReferencesCommand.cs b/src/WixToolset.Core.WindowsInstaller/Bind/ProcessDependencyReferencesCommand.cs
index 5ec93f49..1bd2a427 100644
--- a/src/WixToolset.Core.WindowsInstaller/Bind/ProcessDependencyReferencesCommand.cs
+++ b/src/WixToolset.Core.WindowsInstaller/Bind/ProcessDependencyReferencesCommand.cs
@@ -58,7 +58,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
58 var keyRequires = String.Format(@"{0}{1}\{2}\{3}", DependencyRegistryRoot, requiresKey, RegistryDependents, providesKey); 58 var keyRequires = String.Format(@"{0}{1}\{2}\{3}", DependencyRegistryRoot, requiresKey, RegistryDependents, providesKey);
59 59
60 // Get the component ID from the provider. 60 // Get the component ID from the provider.
61 var componentId = wixDependencyProviderRow.ComponentRef; 61 var componentId = wixDependencyProviderRow.ParentRef;
62 62
63 var id = this.BackendHelper.GenerateIdentifier("reg", providesId, requiresId, "(Default)"); 63 var id = this.BackendHelper.GenerateIdentifier("reg", providesId, requiresId, "(Default)");
64 this.Section.AddSymbol(new RegistrySymbol(wixDependencyRefRow.SourceLineNumbers, new Identifier(AccessModifier.Section, id)) 64 this.Section.AddSymbol(new RegistrySymbol(wixDependencyRefRow.SourceLineNumbers, new Identifier(AccessModifier.Section, id))
diff --git a/src/WixToolset.Core/Compiler_Dependency.cs b/src/WixToolset.Core/Compiler_Dependency.cs
index 74982fba..6825711f 100644
--- a/src/WixToolset.Core/Compiler_Dependency.cs
+++ b/src/WixToolset.Core/Compiler_Dependency.cs
@@ -53,7 +53,7 @@ namespace WixToolset.Core
53 // in the table definition but unused for bundles, so just set it to the valid ID. 53 // in the table definition but unused for bundles, so just set it to the valid ID.
54 this.Core.AddSymbol(new WixDependencyProviderSymbol(sourceLineNumbers, id) 54 this.Core.AddSymbol(new WixDependencyProviderSymbol(sourceLineNumbers, id)
55 { 55 {
56 ComponentRef = id.Id, 56 ParentRef = id.Id,
57 ProviderKey = providerKey, 57 ProviderKey = providerKey,
58 Attributes = WixDependencyProviderAttributes.ProvidesAttributesBundle, 58 Attributes = WixDependencyProviderAttributes.ProvidesAttributesBundle,
59 }); 59 });
@@ -187,7 +187,7 @@ namespace WixToolset.Core
187 { 187 {
188 var symbol = this.Core.AddSymbol(new WixDependencyProviderSymbol(sourceLineNumbers, id) 188 var symbol = this.Core.AddSymbol(new WixDependencyProviderSymbol(sourceLineNumbers, id)
189 { 189 {
190 ComponentRef = parentId, 190 ParentRef = parentId,
191 ProviderKey = key, 191 ProviderKey = key,
192 }); 192 });
193 193
diff --git a/src/test/WixToolsetTest.CoreIntegration/DependencyExtensionFixture.cs b/src/test/WixToolsetTest.CoreIntegration/DependencyExtensionFixture.cs
index 5d61828f..840b411e 100644
--- a/src/test/WixToolsetTest.CoreIntegration/DependencyExtensionFixture.cs
+++ b/src/test/WixToolsetTest.CoreIntegration/DependencyExtensionFixture.cs
@@ -12,7 +12,7 @@ namespace WixToolsetTest.CoreIntegration
12 12
13 public class DependencyExtensionFixture 13 public class DependencyExtensionFixture
14 { 14 {
15 [Fact(Skip = "https://github.com/wixtoolset/issues/issues/6388")] 15 [Fact]
16 public void CanBuildBundleUsingExePackageWithProvides() 16 public void CanBuildBundleUsingExePackageWithProvides()
17 { 17 {
18 var folder = TestData.Get(@"TestData"); 18 var folder = TestData.Get(@"TestData");
@@ -50,7 +50,7 @@ namespace WixToolsetTest.CoreIntegration
50 .ToArray(); 50 .ToArray();
51 WixAssert.CompareLineByLine(new string[] 51 WixAssert.CompareLineByLine(new string[]
52 { 52 {
53 "<Provides Key='DependencyTests_ExeA,v1.0' Version='1.0.0.0' />", 53 "<Provides Key='DependencyTests_ExeA,v1.0' Version='1.0.0.0' DisplayName='Windows Installer XML Toolset' />",
54 }, provides); 54 }, provides);
55 } 55 }
56 } 56 }
@@ -106,7 +106,7 @@ namespace WixToolsetTest.CoreIntegration
106 .ToArray(); 106 .ToArray();
107 WixAssert.CompareLineByLine(new string[] 107 WixAssert.CompareLineByLine(new string[]
108 { 108 {
109 "<Provides Key='UsingProvides' 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' />", 110 "<Provides Key='{A81D50F9-B696-4F3D-ABE0-E64D61590E5F}' Version='1.0.0.0' DisplayName='MsiPackage' />",
111 }, provides); 111 }, provides);
112 } 112 }