From 26442d4177bd6e108f2cf4cc2fb2599e624ff6c4 Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Tue, 23 Mar 2021 14:00:43 -0700 Subject: Fix dependency providers in a Bundle chain Fixes wixtoolset/issues#6388 --- src/WixToolset.Core.Burn/Bind/BindBundleCommand.cs | 4 +- .../Bind/ProcessDependencyProvidersCommand.cs | 57 ++++++++-------------- .../Bundles/CreateBurnManifestCommand.cs | 4 +- .../Bundles/ProcessMsiPackageCommand.cs | 9 ++-- .../Bind/ProcessDependencyReferencesCommand.cs | 2 +- src/WixToolset.Core/Compiler_Dependency.cs | 4 +- .../DependencyExtensionFixture.cs | 6 +-- 7 files changed, 35 insertions(+), 51 deletions(-) (limited to 'src') 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 this.BackendHelper.ResolveDelayedFields(this.DelayedFields, variableCache); } - Dictionary dependencySymbolsByKey; + Dictionary dependencySymbolsByKey; { var command = new ProcessDependencyProvidersCommand(this.Messaging, section, facades); command.Execute(); @@ -542,7 +542,7 @@ namespace WixToolset.Core.Burn private void ResolveBundleInstallScope(IntermediateSection section, WixBundleSymbol bundleSymbol, IEnumerable facades) { - var dependencySymbolsById = section.Symbols.OfType().ToDictionary(t => t.Id.Id); + var dependencySymbolsById = section.Symbols.OfType().ToDictionary(t => t.Id.Id); foreach (var facade in facades) { 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 public string BundleProviderKey { get; private set; } - public Dictionary DependencySymbolsByKey { get; private set; } + public Dictionary DependencySymbolsByKey { get; private set; } private IMessaging Messaging { get; } @@ -38,43 +38,34 @@ namespace WixToolset.Core.Burn.Bind /// public void Execute() { - var wixDependencyProviderSymbols = this.Section.Symbols.OfType(); + var dependencySymbols = this.Section.Symbols.OfType(); - foreach (var wixDependencyProviderSymbol in wixDependencyProviderSymbols) + foreach (var dependency in dependencySymbols) { // Sets the provider key for the bundle, if it is not set already. if (String.IsNullOrEmpty(this.BundleProviderKey)) { - if (wixDependencyProviderSymbol.Bundle) + if (dependency.Bundle) { - this.BundleProviderKey = wixDependencyProviderSymbol.ProviderKey; + this.BundleProviderKey = dependency.ProviderKey; } } // Import any authored dependencies. These may merge with imported provides from MSI packages. - var packageId = wixDependencyProviderSymbol.Id.Id; + var packageId = dependency.ParentRef; if (this.Facades.TryGetValue(packageId, out var facade)) { - var dependency = this.Section.AddSymbol(new ProvidesDependencySymbol(wixDependencyProviderSymbol.SourceLineNumbers, wixDependencyProviderSymbol.Id) - { - PackageRef = packageId, - Key = wixDependencyProviderSymbol.ProviderKey, - Version = wixDependencyProviderSymbol.Version, - DisplayName = wixDependencyProviderSymbol.DisplayName, - Attributes = (int)wixDependencyProviderSymbol.Attributes - }); - - if (String.IsNullOrEmpty(dependency.Key)) + if (String.IsNullOrEmpty(dependency.ProviderKey)) { switch (facade.SpecificPackageSymbol) { // The WixDependencyExtension allows an empty Key for MSIs and MSPs. case WixBundleMsiPackageSymbol msiPackage: - dependency.Key = msiPackage.ProductCode; + dependency.ProviderKey = msiPackage.ProductCode; break; case WixBundleMspPackageSymbol mspPackage: - dependency.Key = mspPackage.PatchCode; + dependency.ProviderKey = mspPackage.PatchCode; break; } } @@ -84,7 +75,7 @@ namespace WixToolset.Core.Burn.Bind dependency.Version = facade.PackageSymbol.Version; } - // If the version is still missing, a version could not be harvested from the package and was not authored. + // If the version is still missing, a version could not be gathered from the package and was not authored. if (String.IsNullOrEmpty(dependency.Version)) { this.Messaging.Write(ErrorMessages.MissingDependencyVersion(facade.PackageId)); @@ -97,62 +88,56 @@ namespace WixToolset.Core.Burn.Bind } } - this.DependencySymbolsByKey = this.GetDependencySymbolsByKey(); + this.DependencySymbolsByKey = this.GetDependencySymbolsByKey(dependencySymbols); // Generate providers for MSI and MSP packages that still do not have providers. foreach (var facade in this.Facades.Values) { string key = null; - //if (WixBundlePackageType.Msi == facade.PackageSymbol.Type) if (facade.SpecificPackageSymbol is WixBundleMsiPackageSymbol msiPackage) { - //var msiPackage = (WixBundleMsiPackageSymbol)facade.SpecificPackageSymbol; key = msiPackage.ProductCode; } - //else if (WixBundlePackageType.Msp == facade.PackageSymbol.Type) else if (facade.SpecificPackageSymbol is WixBundleMspPackageSymbol mspPackage) { - //var mspPackage = (WixBundleMspPackageSymbol)facade.SpecificPackageSymbol; key = mspPackage.PatchCode; } if (!String.IsNullOrEmpty(key) && !this.DependencySymbolsByKey.ContainsKey(key)) { - var dependency = this.Section.AddSymbol(new ProvidesDependencySymbol(facade.PackageSymbol.SourceLineNumbers, facade.PackageSymbol.Id) + var dependency = this.Section.AddSymbol(new WixDependencyProviderSymbol(facade.PackageSymbol.SourceLineNumbers, facade.PackageSymbol.Id) { - PackageRef = facade.PackageId, - Key = key, + ParentRef = facade.PackageId, + ProviderKey = key, Version = facade.PackageSymbol.Version, DisplayName = facade.PackageSymbol.DisplayName }); - this.DependencySymbolsByKey.Add(dependency.Key, dependency); + this.DependencySymbolsByKey.Add(dependency.ProviderKey, dependency); } } } - private Dictionary GetDependencySymbolsByKey() + private Dictionary GetDependencySymbolsByKey(IEnumerable dependencySymbols) { - var dependencySymbolsByKey = new Dictionary(); - - var dependencySymbols = this.Section.Symbols.OfType(); + var dependencySymbolsByKey = new Dictionary(); foreach (var dependency in dependencySymbols) { - if (dependencySymbolsByKey.TryGetValue(dependency.Key, out var collision)) + if (dependencySymbolsByKey.TryGetValue(dependency.ProviderKey, out var collision)) { // If not a perfect dependency collision, display an error. - if (dependency.Key != collision.Key || + if (dependency.ProviderKey != collision.ProviderKey || dependency.Version != collision.Version || dependency.DisplayName != collision.DisplayName) { - this.Messaging.Write(ErrorMessages.DuplicateProviderDependencyKey(dependency.Key, dependency.PackageRef)); + this.Messaging.Write(ErrorMessages.DuplicateProviderDependencyKey(dependency.ProviderKey, dependency.ParentRef)); } } else { - dependencySymbolsByKey.Add(dependency.Key, dependency); + dependencySymbolsByKey.Add(dependency.ProviderKey, dependency); } } 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 var exitCodesByPackage = this.Section.Symbols.OfType().ToLookup(r => r.ChainPackageId); var commandLinesByPackage = this.Section.Symbols.OfType().ToLookup(r => r.WixBundlePackageRef); - var dependenciesByPackage = this.Section.Symbols.OfType().ToLookup(p => p.PackageRef); + var dependenciesByPackage = this.Section.Symbols.OfType().ToLookup(p => p.ParentRef); // Build up the list of target codes from all the MSPs in the chain. @@ -511,7 +511,7 @@ namespace WixToolset.Core.Burn.Bundles foreach (var dependency in dependencies) { writer.WriteStartElement("Provides"); - writer.WriteAttributeString("Key", dependency.Key); + writer.WriteAttributeString("Key", dependency.ProviderKey); if (!String.IsNullOrEmpty(dependency.Version)) { 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 var id = new Identifier(AccessModifier.Section, this.BackendHelper.GenerateIdentifier("dep", msiPackage.Id.Id, record.GetString(1))); // Import the provider key and attributes. - this.Section.AddSymbol(new ProvidesDependencySymbol(msiPackage.SourceLineNumbers, id) + this.Section.AddSymbol(new WixDependencyProviderSymbol(msiPackage.SourceLineNumbers, id) { - PackageRef = msiPackage.Id.Id, - Key = record.GetString(2), + ParentRef = msiPackage.Id.Id, + ProviderKey = record.GetString(2), Version = record.GetString(3) ?? msiPackage.ProductVersion, DisplayName = record.GetString(4) ?? this.Facade.PackageSymbol.DisplayName, - Attributes = record.GetInteger(5), - Imported = true + Attributes = WixDependencyProviderAttributes.ProvidesAttributesImported | (WixDependencyProviderAttributes)record.GetInteger(5), }); } } 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 var keyRequires = String.Format(@"{0}{1}\{2}\{3}", DependencyRegistryRoot, requiresKey, RegistryDependents, providesKey); // Get the component ID from the provider. - var componentId = wixDependencyProviderRow.ComponentRef; + var componentId = wixDependencyProviderRow.ParentRef; var id = this.BackendHelper.GenerateIdentifier("reg", providesId, requiresId, "(Default)"); 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 // in the table definition but unused for bundles, so just set it to the valid ID. this.Core.AddSymbol(new WixDependencyProviderSymbol(sourceLineNumbers, id) { - ComponentRef = id.Id, + ParentRef = id.Id, ProviderKey = providerKey, Attributes = WixDependencyProviderAttributes.ProvidesAttributesBundle, }); @@ -187,7 +187,7 @@ namespace WixToolset.Core { var symbol = this.Core.AddSymbol(new WixDependencyProviderSymbol(sourceLineNumbers, id) { - ComponentRef = parentId, + ParentRef = parentId, ProviderKey = key, }); 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 public class DependencyExtensionFixture { - [Fact(Skip = "https://github.com/wixtoolset/issues/issues/6388")] + [Fact] public void CanBuildBundleUsingExePackageWithProvides() { var folder = TestData.Get(@"TestData"); @@ -50,7 +50,7 @@ namespace WixToolsetTest.CoreIntegration .ToArray(); WixAssert.CompareLineByLine(new string[] { - "", + "", }, provides); } } @@ -106,7 +106,7 @@ namespace WixToolsetTest.CoreIntegration .ToArray(); WixAssert.CompareLineByLine(new string[] { - "", + "", "", }, provides); } -- cgit v1.2.3-55-g6feb