aboutsummaryrefslogtreecommitdiff
path: root/src/WixToolset.Core.Burn
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 /src/WixToolset.Core.Burn
parent8a3ce82d689e16424620e3b52161f19771d19d1d (diff)
downloadwix-26442d4177bd6e108f2cf4cc2fb2599e624ff6c4.tar.gz
wix-26442d4177bd6e108f2cf4cc2fb2599e624ff6c4.tar.bz2
wix-26442d4177bd6e108f2cf4cc2fb2599e624ff6c4.zip
Fix dependency providers in a Bundle chain
Fixes wixtoolset/issues#6388
Diffstat (limited to 'src/WixToolset.Core.Burn')
-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
4 files changed, 29 insertions, 45 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 }