From 04b84e3b55402707497dab249a300f9cf1d216c7 Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Tue, 15 Mar 2022 15:04:51 -0700 Subject: Normalize related bundle ids Fixes 6008 --- .../WixToolset.Core.Burn/Bind/BindBundleCommand.cs | 85 ++++++++++++++-------- .../BundleFixture.cs | 4 +- .../BundleManifestFixture.cs | 43 +++++++++++ .../BundleWithInvalidUpgradeCode.wxl | 3 + .../BundleWithLocalizedUpgradeCode.wxs | 11 +++ .../BundleLocalized/BundleWithValidUpgradeCode.wxl | 3 + .../BundleWithInvalidUpgradeCode.wxl | 3 - .../BundleWithInvalidUpgradeCode.wxs | 11 --- 8 files changed, 115 insertions(+), 48 deletions(-) create mode 100644 src/wix/test/WixToolsetTest.CoreIntegration/TestData/BundleLocalized/BundleWithInvalidUpgradeCode.wxl create mode 100644 src/wix/test/WixToolsetTest.CoreIntegration/TestData/BundleLocalized/BundleWithLocalizedUpgradeCode.wxs create mode 100644 src/wix/test/WixToolsetTest.CoreIntegration/TestData/BundleLocalized/BundleWithValidUpgradeCode.wxl delete mode 100644 src/wix/test/WixToolsetTest.CoreIntegration/TestData/BundleWithInvalid/BundleWithInvalidUpgradeCode.wxl delete mode 100644 src/wix/test/WixToolsetTest.CoreIntegration/TestData/BundleWithInvalid/BundleWithInvalidUpgradeCode.wxs (limited to 'src') diff --git a/src/wix/WixToolset.Core.Burn/Bind/BindBundleCommand.cs b/src/wix/WixToolset.Core.Burn/Bind/BindBundleCommand.cs index eb822fba..16e63492 100644 --- a/src/wix/WixToolset.Core.Burn/Bind/BindBundleCommand.cs +++ b/src/wix/WixToolset.Core.Burn/Bind/BindBundleCommand.cs @@ -102,10 +102,10 @@ namespace WixToolset.Core.Burn bundleSymbol.ProviderKey = bundleSymbol.BundleId = Guid.NewGuid().ToString("B").ToUpperInvariant(); - bundleSymbol.UpgradeCode = this.NormalizeBundleUpgradeCode(bundleSymbol.SourceLineNumbers, bundleSymbol.UpgradeCode); - bundleSymbol.Attributes |= WixBundleAttributes.PerMachine; // default to per-machine but the first-per user package wil flip the bundle per-user. + this.NormalizeRelatedBundles(bundleSymbol, section); + // Ensure there is one and only one WixBootstrapperApplicationDllSymbol. // The compiler and linker behavior should have colluded to get // this behavior. @@ -178,33 +178,33 @@ namespace WixToolset.Core.Burn { switch (facade.PackageSymbol.Type) { - case WixBundlePackageType.Exe: - { - var command = new ProcessExePackageCommand(facade, payloadSymbols); - command.Execute(); - } - break; + case WixBundlePackageType.Exe: + { + var command = new ProcessExePackageCommand(facade, payloadSymbols); + command.Execute(); + } + break; - case WixBundlePackageType.Msi: - { - var command = new ProcessMsiPackageCommand(this.ServiceProvider, this.BackendExtensions, section, facade, packagesPayloads[facade.PackageId]); - command.Execute(); - } - break; + case WixBundlePackageType.Msi: + { + var command = new ProcessMsiPackageCommand(this.ServiceProvider, this.BackendExtensions, section, facade, packagesPayloads[facade.PackageId]); + command.Execute(); + } + break; - case WixBundlePackageType.Msp: - { - var command = new ProcessMspPackageCommand(this.Messaging, section, facade, payloadSymbols); - command.Execute(); - } - break; + case WixBundlePackageType.Msp: + { + var command = new ProcessMspPackageCommand(this.Messaging, section, facade, payloadSymbols); + command.Execute(); + } + break; - case WixBundlePackageType.Msu: - { - var command = new ProcessMsuPackageCommand(facade, payloadSymbols); - command.Execute(); - } - break; + case WixBundlePackageType.Msu: + { + var command = new ProcessMsuPackageCommand(facade, payloadSymbols); + command.Execute(); + } + break; } if (null != variableCache) @@ -496,18 +496,39 @@ namespace WixToolset.Core.Burn this.Wixout = this.CreateWixout(trackedFiles, this.Output, manifestPath, baManifestPath, bextManifestPath); } - private string NormalizeBundleUpgradeCode(SourceLineNumber sourceLineNumber, string upgradeCode) + private void NormalizeRelatedBundles(WixBundleSymbol bundleSymbol, IntermediateSection section) { - if (Guid.TryParse(upgradeCode, out var guid)) + var upgradeCode = bundleSymbol.UpgradeCode; + + foreach (var relatedBundleSymbol in section.Symbols.OfType()) + { + var elementName = "RelatedBundle"; + var attributeName = "Id"; + + if (upgradeCode == relatedBundleSymbol.BundleId) + { + elementName = "Bundle"; + attributeName = "UpgradeCode"; + } + + relatedBundleSymbol.BundleId = this.NormalizeBundleRelatedBundleId(relatedBundleSymbol.SourceLineNumbers, relatedBundleSymbol.BundleId, elementName, attributeName); + } + + bundleSymbol.UpgradeCode = this.NormalizeBundleRelatedBundleId(bundleSymbol.SourceLineNumbers, bundleSymbol.UpgradeCode, null, null); + } + + private string NormalizeBundleRelatedBundleId(SourceLineNumber sourceLineNumber, string relatedBundleId, string elementName, string attributeName) + { + if (Guid.TryParse(relatedBundleId, out var guid)) { return guid.ToString("B").ToUpperInvariant(); } - else + else if (!String.IsNullOrEmpty(elementName)) { - this.Messaging.Write(ErrorMessages.IllegalGuidValue(sourceLineNumber, "Bundle", "UpgradeCode", upgradeCode)); + this.Messaging.Write(ErrorMessages.IllegalGuidValue(sourceLineNumber, elementName, attributeName, relatedBundleId)); } - return upgradeCode; + return relatedBundleId; } private WixOutput CreateWixout(List trackedFiles, Intermediate intermediate, string manifestPath, string baDataPath, string bextDataPath) @@ -552,7 +573,7 @@ namespace WixToolset.Core.Burn variableCache.Add(String.Concat("packageVersion.", id), package.Version); if (facade.SpecificPackageSymbol is WixBundleMsiPackageSymbol msiPackage) - { + { variableCache.Add(String.Concat("packageLanguage.", id), msiPackage.ProductLanguage.ToString()); variableCache.Add(String.Concat("packageManufacturer.", id), msiPackage.Manufacturer ?? String.Empty); } diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/BundleFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/BundleFixture.cs index 4ac9c3a4..e4a57d4d 100644 --- a/src/wix/test/WixToolsetTest.CoreIntegration/BundleFixture.cs +++ b/src/wix/test/WixToolsetTest.CoreIntegration/BundleFixture.cs @@ -332,8 +332,8 @@ namespace WixToolsetTest.CoreIntegration var result = WixRunner.Execute(new[] { "build", - Path.Combine(folder, "BundleWithInvalid", "BundleWithInvalidUpgradeCode.wxs"), - "-loc", Path.Combine(folder, "BundleWithInvalid", "BundleWithInvalidUpgradeCode.wxl"), + Path.Combine(folder, "BundleLocalized", "BundleWithLocalizedUpgradeCode.wxs"), + "-loc", Path.Combine(folder, "BundleLocalized", "BundleWithInvalidUpgradeCode.wxl"), "-bindpath", Path.Combine(folder, ".Data"), "-bindpath", Path.Combine(folder, "SimpleBundle", "data"), "-intermediateFolder", intermediateFolder, diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/BundleManifestFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/BundleManifestFixture.cs index 29c9dd95..7f92f90b 100644 --- a/src/wix/test/WixToolsetTest.CoreIntegration/BundleManifestFixture.cs +++ b/src/wix/test/WixToolsetTest.CoreIntegration/BundleManifestFixture.cs @@ -138,6 +138,49 @@ namespace WixToolsetTest.CoreIntegration } } + [Fact] + public void CanBuildBundleManifestWithNormalizedRelatedBundles() + { + var folder = TestData.Get(@"TestData"); + + using (var fs = new DisposableFileSystem()) + { + var baseFolder = fs.GetFolder(); + var intermediateFolder = Path.Combine(baseFolder, "obj"); + var bundlePath = Path.Combine(baseFolder, @"bin\test.exe"); + var baFolderPath = Path.Combine(baseFolder, "ba"); + var extractFolderPath = Path.Combine(baseFolder, "extract"); + + var result = WixRunner.Execute(new[] +{ + "build", + Path.Combine(folder, "BundleLocalized", "BundleWithLocalizedUpgradeCode.wxs"), + "-loc", Path.Combine(folder, "BundleLocalized", "BundleWithValidUpgradeCode.wxl"), + "-bindpath", Path.Combine(folder, ".Data"), + "-bindpath", Path.Combine(folder, "SimpleBundle", "data"), + "-intermediateFolder", intermediateFolder, + "-o", Path.Combine(baseFolder, @"bin\test.exe") + }); + + result.AssertSuccess(); + + var extractResult = BundleExtractor.ExtractBAContainer(null, bundlePath, baFolderPath, extractFolderPath); + extractResult.AssertSuccess(); + + var manifestRelatedBundlesElements = extractResult.SelectManifestNodes("/burn:BurnManifest/burn:RelatedBundle"); + Assert.Equal("", manifestRelatedBundlesElements[0].GetTestXml()); + Assert.Equal(1, manifestRelatedBundlesElements.Count); + + var dataRelatedBundlesElements = extractResult.SelectBADataNodes("/ba:BootstrapperApplicationData/ba:WixBundleProperties"); + var ignoreAttributesByElementName = new Dictionary> + { + { "WixBundleProperties", new List { "DisplayName", "Id" } }, + }; + Assert.Equal("", dataRelatedBundlesElements[0].GetTestXml(ignoreAttributesByElementName)); + Assert.Equal(1, dataRelatedBundlesElements.Count); + } + } + [Fact] public void PopulatesBEManifestWithBundleExtensionBundleCustomData() { diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/BundleLocalized/BundleWithInvalidUpgradeCode.wxl b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/BundleLocalized/BundleWithInvalidUpgradeCode.wxl new file mode 100644 index 00000000..92e1b746 --- /dev/null +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/BundleLocalized/BundleWithInvalidUpgradeCode.wxl @@ -0,0 +1,3 @@ + + NOT-A-GUID + diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/BundleLocalized/BundleWithLocalizedUpgradeCode.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/BundleLocalized/BundleWithLocalizedUpgradeCode.wxs new file mode 100644 index 00000000..d9d7f33a --- /dev/null +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/BundleLocalized/BundleWithLocalizedUpgradeCode.wxs @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/BundleLocalized/BundleWithValidUpgradeCode.wxl b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/BundleLocalized/BundleWithValidUpgradeCode.wxl new file mode 100644 index 00000000..c5731331 --- /dev/null +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/BundleLocalized/BundleWithValidUpgradeCode.wxl @@ -0,0 +1,3 @@ + + 6d4ce32b-fb91-45da-a9b5-7e0d9929a3c3 + diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/BundleWithInvalid/BundleWithInvalidUpgradeCode.wxl b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/BundleWithInvalid/BundleWithInvalidUpgradeCode.wxl deleted file mode 100644 index 40688f36..00000000 --- a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/BundleWithInvalid/BundleWithInvalidUpgradeCode.wxl +++ /dev/null @@ -1,3 +0,0 @@ - - NOT-A-GUID - diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/BundleWithInvalid/BundleWithInvalidUpgradeCode.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/BundleWithInvalid/BundleWithInvalidUpgradeCode.wxs deleted file mode 100644 index dce57226..00000000 --- a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/BundleWithInvalid/BundleWithInvalidUpgradeCode.wxs +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - -- cgit v1.2.3-55-g6feb