aboutsummaryrefslogtreecommitdiff
path: root/src/WixToolset.Core.Burn/Bind/ProcessDependencyProvidersCommand.cs
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/Bind/ProcessDependencyProvidersCommand.cs
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/Bind/ProcessDependencyProvidersCommand.cs')
-rw-r--r--src/WixToolset.Core.Burn/Bind/ProcessDependencyProvidersCommand.cs57
1 files changed, 21 insertions, 36 deletions
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