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 ++-- 4 files changed, 29 insertions(+), 45 deletions(-) (limited to 'src/WixToolset.Core.Burn') 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), }); } } -- cgit v1.2.3-55-g6feb