@joebigelow / wix-1 / commits / 26442d41

Fix dependency providers in a Bundle chain

Fixes wixtoolset/issues#6388

Rob Mensching committed Mar 23, 2021 at 14:00 UTC 26442d4177bd6e108f2cf4cc2fb2599e624ff6c4
7 files changed +35 -51
src/WixToolset.Core.Burn/Bind/BindBundleCommand.cs
+2 -2
@@ -369,7 +369,7 @@ namespace WixToolset.Core.Burn
369 this.BackendHelper.ResolveDelayedFields(this.DelayedFields, variableCache);
370 }
371
372 - Dictionary<string, ProvidesDependencySymbol> dependencySymbolsByKey;
372 + Dictionary<string, WixDependencyProviderSymbol> dependencySymbolsByKey;
373 {
374 var command = new ProcessDependencyProvidersCommand(this.Messaging, section, facades);
375 command.Execute();
@@ -542,7 +542,7 @@ namespace WixToolset.Core.Burn
542
543 private void ResolveBundleInstallScope(IntermediateSection section, WixBundleSymbol bundleSymbol, IEnumerable<PackageFacade> facades)
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
547 foreach (var facade in facades)
548 {
src/WixToolset.Core.Burn/Bind/ProcessDependencyProvidersCommand.cs
+21 -36
@@ -22,7 +22,7 @@ namespace WixToolset.Core.Burn.Bind
22
23 public string BundleProviderKey { get; private set; }
24
25 - public Dictionary<string, ProvidesDependencySymbol> DependencySymbolsByKey { get; private set; }
25 + public Dictionary<string, WixDependencyProviderSymbol> DependencySymbolsByKey { get; private set; }
26
27 private IMessaging Messaging { get; }
28
@@ -38,43 +38,34 @@ namespace WixToolset.Core.Burn.Bind
38 /// </summary>
39 public void Execute()
40 {
41 - var wixDependencyProviderSymbols = this.Section.Symbols.OfType<WixDependencyProviderSymbol>();
41 + var dependencySymbols = this.Section.Symbols.OfType<WixDependencyProviderSymbol>();
42
43 - foreach (var wixDependencyProviderSymbol in wixDependencyProviderSymbols)
43 + foreach (var dependency in dependencySymbols)
44 {
45 // Sets the provider key for the bundle, if it is not set already.
46 if (String.IsNullOrEmpty(this.BundleProviderKey))
47 {
48 - if (wixDependencyProviderSymbol.Bundle)
48 + if (dependency.Bundle)
49 {
50 - this.BundleProviderKey = wixDependencyProviderSymbol.ProviderKey;
50 + this.BundleProviderKey = dependency.ProviderKey;
51 }
52 }
53
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
57 if (this.Facades.TryGetValue(packageId, out var facade))
58 {
59 - var dependency = this.Section.AddSymbol(new ProvidesDependencySymbol(wixDependencyProviderSymbol.SourceLineNumbers, wixDependencyProviderSymbol.Id)
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))
59 + if (String.IsNullOrEmpty(dependency.ProviderKey))
60 {
61 switch (facade.SpecificPackageSymbol)
62 {
63 // The WixDependencyExtension allows an empty Key for MSIs and MSPs.
64 case WixBundleMsiPackageSymbol msiPackage:
74 - dependency.Key = msiPackage.ProductCode;
65 + dependency.ProviderKey = msiPackage.ProductCode;
66 break;
67 case WixBundleMspPackageSymbol mspPackage:
77 - dependency.Key = mspPackage.PatchCode;
68 + dependency.ProviderKey = mspPackage.PatchCode;
69 break;
70 }
71 }
@@ -84,7 +75,7 @@ namespace WixToolset.Core.Burn.Bind
75 dependency.Version = facade.PackageSymbol.Version;
76 }
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.
79 if (String.IsNullOrEmpty(dependency.Version))
80 {
81 this.Messaging.Write(ErrorMessages.MissingDependencyVersion(facade.PackageId));
@@ -97,62 +88,56 @@ namespace WixToolset.Core.Burn.Bind
88 }
89 }
90
100 - this.DependencySymbolsByKey = this.GetDependencySymbolsByKey();
91 + this.DependencySymbolsByKey = this.GetDependencySymbolsByKey(dependencySymbols);
92
93 // Generate providers for MSI and MSP packages that still do not have providers.
94 foreach (var facade in this.Facades.Values)
95 {
96 string key = null;
97
107 - //if (WixBundlePackageType.Msi == facade.PackageSymbol.Type)
98 if (facade.SpecificPackageSymbol is WixBundleMsiPackageSymbol msiPackage)
99 {
110 - //var msiPackage = (WixBundleMsiPackageSymbol)facade.SpecificPackageSymbol;
100 key = msiPackage.ProductCode;
101 }
113 - //else if (WixBundlePackageType.Msp == facade.PackageSymbol.Type)
102 else if (facade.SpecificPackageSymbol is WixBundleMspPackageSymbol mspPackage)
103 {
116 - //var mspPackage = (WixBundleMspPackageSymbol)facade.SpecificPackageSymbol;
104 key = mspPackage.PatchCode;
105 }
106
107 if (!String.IsNullOrEmpty(key) && !this.DependencySymbolsByKey.ContainsKey(key))
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)
110 {
124 - PackageRef = facade.PackageId,
125 - Key = key,
111 + ParentRef = facade.PackageId,
112 + ProviderKey = key,
113 Version = facade.PackageSymbol.Version,
114 DisplayName = facade.PackageSymbol.DisplayName
115 });
116
130 - this.DependencySymbolsByKey.Add(dependency.Key, dependency);
117 + this.DependencySymbolsByKey.Add(dependency.ProviderKey, dependency);
118 }
119 }
120 }
121
135 - private Dictionary<string, ProvidesDependencySymbol> GetDependencySymbolsByKey()
122 + private Dictionary<string, WixDependencyProviderSymbol> GetDependencySymbolsByKey(IEnumerable<WixDependencyProviderSymbol> dependencySymbols)
123 {
137 - var dependencySymbolsByKey = new Dictionary<string, ProvidesDependencySymbol>();
138 -
139 - var dependencySymbols = this.Section.Symbols.OfType<ProvidesDependencySymbol>();
124 + var dependencySymbolsByKey = new Dictionary<string, WixDependencyProviderSymbol>();
125
126 foreach (var dependency in dependencySymbols)
127 {
143 - if (dependencySymbolsByKey.TryGetValue(dependency.Key, out var collision))
128 + if (dependencySymbolsByKey.TryGetValue(dependency.ProviderKey, out var collision))
129 {
130 // If not a perfect dependency collision, display an error.
146 - if (dependency.Key != collision.Key ||
131 + if (dependency.ProviderKey != collision.ProviderKey ||
132 dependency.Version != collision.Version ||
133 dependency.DisplayName != collision.DisplayName)
134 {
150 - this.Messaging.Write(ErrorMessages.DuplicateProviderDependencyKey(dependency.Key, dependency.PackageRef));
135 + this.Messaging.Write(ErrorMessages.DuplicateProviderDependencyKey(dependency.ProviderKey, dependency.ParentRef));
136 }
137 }
138 else
139 {
155 - dependencySymbolsByKey.Add(dependency.Key, dependency);
140 + dependencySymbolsByKey.Add(dependency.ProviderKey, dependency);
141 }
142 }
143
src/WixToolset.Core.Burn/Bundles/CreateBurnManifestCommand.cs
+2 -2
@@ -336,7 +336,7 @@ namespace WixToolset.Core.Burn.Bundles
336 var exitCodesByPackage = this.Section.Symbols.OfType<WixBundlePackageExitCodeSymbol>().ToLookup(r => r.ChainPackageId);
337 var commandLinesByPackage = this.Section.Symbols.OfType<WixBundlePackageCommandLineSymbol>().ToLookup(r => r.WixBundlePackageRef);
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
341
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)
512 {
513 writer.WriteStartElement("Provides");
514 - writer.WriteAttributeString("Key", dependency.Key);
514 + writer.WriteAttributeString("Key", dependency.ProviderKey);
515
516 if (!String.IsNullOrEmpty(dependency.Version))
517 {
src/WixToolset.Core.Burn/Bundles/ProcessMsiPackageCommand.cs
+4 -5
@@ -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)));
542
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 {
546 - PackageRef = msiPackage.Id.Id,
547 - Key = record.GetString(2),
546 + ParentRef = msiPackage.Id.Id,
547 + ProviderKey = record.GetString(2),
548 Version = record.GetString(3) ?? msiPackage.ProductVersion,
549 DisplayName = record.GetString(4) ?? this.Facade.PackageSymbol.DisplayName,
550 - Attributes = record.GetInteger(5),
551 - Imported = true
550 + Attributes = WixDependencyProviderAttributes.ProvidesAttributesImported | (WixDependencyProviderAttributes)record.GetInteger(5),
551 });
552 }
553 }
src/WixToolset.Core.WindowsInstaller/Bind/ProcessDependencyReferencesCommand.cs
+1 -1
@@ -58,7 +58,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
58 var keyRequires = String.Format(@"{0}{1}\{2}\{3}", DependencyRegistryRoot, requiresKey, RegistryDependents, providesKey);
59
60 // Get the component ID from the provider.
61 - var componentId = wixDependencyProviderRow.ComponentRef;
61 + var componentId = wixDependencyProviderRow.ParentRef;
62
63 var id = this.BackendHelper.GenerateIdentifier("reg", providesId, requiresId, "(Default)");
64 this.Section.AddSymbol(new RegistrySymbol(wixDependencyRefRow.SourceLineNumbers, new Identifier(AccessModifier.Section, id))
src/WixToolset.Core/Compiler_Dependency.cs
+2 -2
@@ -53,7 +53,7 @@ namespace WixToolset.Core
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)
55 {
56 - ComponentRef = id.Id,
56 + ParentRef = id.Id,
57 ProviderKey = providerKey,
58 Attributes = WixDependencyProviderAttributes.ProvidesAttributesBundle,
59 });
@@ -187,7 +187,7 @@ namespace WixToolset.Core
187 {
188 var symbol = this.Core.AddSymbol(new WixDependencyProviderSymbol(sourceLineNumbers, id)
189 {
190 - ComponentRef = parentId,
190 + ParentRef = parentId,
191 ProviderKey = key,
192 });
193
src/test/WixToolsetTest.CoreIntegration/DependencyExtensionFixture.cs
+3 -3
@@ -12,7 +12,7 @@ namespace WixToolsetTest.CoreIntegration
12
13 public class DependencyExtensionFixture
14 {
15 - [Fact(Skip = "https://github.com/wixtoolset/issues/issues/6388")]
15 + [Fact]
16 public void CanBuildBundleUsingExePackageWithProvides()
17 {
18 var folder = TestData.Get(@"TestData");
@@ -50,7 +50,7 @@ namespace WixToolsetTest.CoreIntegration
50 .ToArray();
51 WixAssert.CompareLineByLine(new string[]
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);
55 }
56 }
@@ -106,7 +106,7 @@ namespace WixToolsetTest.CoreIntegration
106 .ToArray();
107 WixAssert.CompareLineByLine(new string[]
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' />",
111 }, provides);
112 }