@joebigelow / wix-1 / commits / 04b84e3b

Normalize related bundle ids

Fixes 6008

Rob Mensching committed Mar 15, 2022 at 15:04 UTC 04b84e3b55402707497dab249a300f9cf1d216c7
6 files changed +103 -36
src/wix/WixToolset.Core.Burn/Bind/BindBundleCommand.cs
+53 -32
@@ -102,10 +102,10 @@ namespace WixToolset.Core.Burn
102
103 bundleSymbol.ProviderKey = bundleSymbol.BundleId = Guid.NewGuid().ToString("B").ToUpperInvariant();
104
105 - bundleSymbol.UpgradeCode = this.NormalizeBundleUpgradeCode(bundleSymbol.SourceLineNumbers, bundleSymbol.UpgradeCode);
106 -
105 bundleSymbol.Attributes |= WixBundleAttributes.PerMachine; // default to per-machine but the first-per user package wil flip the bundle per-user.
106
107 + this.NormalizeRelatedBundles(bundleSymbol, section);
108 +
109 // Ensure there is one and only one WixBootstrapperApplicationDllSymbol.
110 // The compiler and linker behavior should have colluded to get
111 // this behavior.
@@ -178,33 +178,33 @@ namespace WixToolset.Core.Burn
178 {
179 switch (facade.PackageSymbol.Type)
180 {
181 - case WixBundlePackageType.Exe:
182 - {
183 - var command = new ProcessExePackageCommand(facade, payloadSymbols);
184 - command.Execute();
185 - }
186 - break;
181 + case WixBundlePackageType.Exe:
182 + {
183 + var command = new ProcessExePackageCommand(facade, payloadSymbols);
184 + command.Execute();
185 + }
186 + break;
187
188 - case WixBundlePackageType.Msi:
189 - {
190 - var command = new ProcessMsiPackageCommand(this.ServiceProvider, this.BackendExtensions, section, facade, packagesPayloads[facade.PackageId]);
191 - command.Execute();
192 - }
193 - break;
188 + case WixBundlePackageType.Msi:
189 + {
190 + var command = new ProcessMsiPackageCommand(this.ServiceProvider, this.BackendExtensions, section, facade, packagesPayloads[facade.PackageId]);
191 + command.Execute();
192 + }
193 + break;
194
195 - case WixBundlePackageType.Msp:
196 - {
197 - var command = new ProcessMspPackageCommand(this.Messaging, section, facade, payloadSymbols);
198 - command.Execute();
199 - }
200 - break;
195 + case WixBundlePackageType.Msp:
196 + {
197 + var command = new ProcessMspPackageCommand(this.Messaging, section, facade, payloadSymbols);
198 + command.Execute();
199 + }
200 + break;
201
202 - case WixBundlePackageType.Msu:
203 - {
204 - var command = new ProcessMsuPackageCommand(facade, payloadSymbols);
205 - command.Execute();
206 - }
207 - break;
202 + case WixBundlePackageType.Msu:
203 + {
204 + var command = new ProcessMsuPackageCommand(facade, payloadSymbols);
205 + command.Execute();
206 + }
207 + break;
208 }
209
210 if (null != variableCache)
@@ -496,18 +496,39 @@ namespace WixToolset.Core.Burn
496 this.Wixout = this.CreateWixout(trackedFiles, this.Output, manifestPath, baManifestPath, bextManifestPath);
497 }
498
499 - private string NormalizeBundleUpgradeCode(SourceLineNumber sourceLineNumber, string upgradeCode)
499 + private void NormalizeRelatedBundles(WixBundleSymbol bundleSymbol, IntermediateSection section)
500 {
501 - if (Guid.TryParse(upgradeCode, out var guid))
501 + var upgradeCode = bundleSymbol.UpgradeCode;
502 +
503 + foreach (var relatedBundleSymbol in section.Symbols.OfType<WixRelatedBundleSymbol>())
504 + {
505 + var elementName = "RelatedBundle";
506 + var attributeName = "Id";
507 +
508 + if (upgradeCode == relatedBundleSymbol.BundleId)
509 + {
510 + elementName = "Bundle";
511 + attributeName = "UpgradeCode";
512 + }
513 +
514 + relatedBundleSymbol.BundleId = this.NormalizeBundleRelatedBundleId(relatedBundleSymbol.SourceLineNumbers, relatedBundleSymbol.BundleId, elementName, attributeName);
515 + }
516 +
517 + bundleSymbol.UpgradeCode = this.NormalizeBundleRelatedBundleId(bundleSymbol.SourceLineNumbers, bundleSymbol.UpgradeCode, null, null);
518 + }
519 +
520 + private string NormalizeBundleRelatedBundleId(SourceLineNumber sourceLineNumber, string relatedBundleId, string elementName, string attributeName)
521 + {
522 + if (Guid.TryParse(relatedBundleId, out var guid))
523 {
524 return guid.ToString("B").ToUpperInvariant();
525 }
505 - else
526 + else if (!String.IsNullOrEmpty(elementName))
527 {
507 - this.Messaging.Write(ErrorMessages.IllegalGuidValue(sourceLineNumber, "Bundle", "UpgradeCode", upgradeCode));
528 + this.Messaging.Write(ErrorMessages.IllegalGuidValue(sourceLineNumber, elementName, attributeName, relatedBundleId));
529 }
530
510 - return upgradeCode;
531 + return relatedBundleId;
532 }
533
534 private WixOutput CreateWixout(List<ITrackedFile> trackedFiles, Intermediate intermediate, string manifestPath, string baDataPath, string bextDataPath)
@@ -552,7 +573,7 @@ namespace WixToolset.Core.Burn
573 variableCache.Add(String.Concat("packageVersion.", id), package.Version);
574
575 if (facade.SpecificPackageSymbol is WixBundleMsiPackageSymbol msiPackage)
555 - {
576 + {
577 variableCache.Add(String.Concat("packageLanguage.", id), msiPackage.ProductLanguage.ToString());
578 variableCache.Add(String.Concat("packageManufacturer.", id), msiPackage.Manufacturer ?? String.Empty);
579 }
src/wix/test/WixToolsetTest.CoreIntegration/BundleFixture.cs
+2 -2
@@ -332,8 +332,8 @@ namespace WixToolsetTest.CoreIntegration
332 var result = WixRunner.Execute(new[]
333 {
334 "build",
335 - Path.Combine(folder, "BundleWithInvalid", "BundleWithInvalidUpgradeCode.wxs"),
336 - "-loc", Path.Combine(folder, "BundleWithInvalid", "BundleWithInvalidUpgradeCode.wxl"),
335 + Path.Combine(folder, "BundleLocalized", "BundleWithLocalizedUpgradeCode.wxs"),
336 + "-loc", Path.Combine(folder, "BundleLocalized", "BundleWithInvalidUpgradeCode.wxl"),
337 "-bindpath", Path.Combine(folder, ".Data"),
338 "-bindpath", Path.Combine(folder, "SimpleBundle", "data"),
339 "-intermediateFolder", intermediateFolder,
src/wix/test/WixToolsetTest.CoreIntegration/BundleManifestFixture.cs
+43
@@ -138,6 +138,49 @@ namespace WixToolsetTest.CoreIntegration
138 }
139 }
140
141 + [Fact]
142 + public void CanBuildBundleManifestWithNormalizedRelatedBundles()
143 + {
144 + var folder = TestData.Get(@"TestData");
145 +
146 + using (var fs = new DisposableFileSystem())
147 + {
148 + var baseFolder = fs.GetFolder();
149 + var intermediateFolder = Path.Combine(baseFolder, "obj");
150 + var bundlePath = Path.Combine(baseFolder, @"bin\test.exe");
151 + var baFolderPath = Path.Combine(baseFolder, "ba");
152 + var extractFolderPath = Path.Combine(baseFolder, "extract");
153 +
154 + var result = WixRunner.Execute(new[]
155 +{
156 + "build",
157 + Path.Combine(folder, "BundleLocalized", "BundleWithLocalizedUpgradeCode.wxs"),
158 + "-loc", Path.Combine(folder, "BundleLocalized", "BundleWithValidUpgradeCode.wxl"),
159 + "-bindpath", Path.Combine(folder, ".Data"),
160 + "-bindpath", Path.Combine(folder, "SimpleBundle", "data"),
161 + "-intermediateFolder", intermediateFolder,
162 + "-o", Path.Combine(baseFolder, @"bin\test.exe")
163 + });
164 +
165 + result.AssertSuccess();
166 +
167 + var extractResult = BundleExtractor.ExtractBAContainer(null, bundlePath, baFolderPath, extractFolderPath);
168 + extractResult.AssertSuccess();
169 +
170 + var manifestRelatedBundlesElements = extractResult.SelectManifestNodes("/burn:BurnManifest/burn:RelatedBundle");
171 + Assert.Equal("<RelatedBundle Id='{6D4CE32B-FB91-45DA-A9B5-7E0D9929A3C3}' Action='Upgrade' />", manifestRelatedBundlesElements[0].GetTestXml());
172 + Assert.Equal(1, manifestRelatedBundlesElements.Count);
173 +
174 + var dataRelatedBundlesElements = extractResult.SelectBADataNodes("/ba:BootstrapperApplicationData/ba:WixBundleProperties");
175 + var ignoreAttributesByElementName = new Dictionary<string, List<string>>
176 + {
177 + { "WixBundleProperties", new List<string> { "DisplayName", "Id" } },
178 + };
179 + Assert.Equal("<WixBundleProperties DisplayName='*' LogPathVariable='WixBundleLog' Compressed='no' Id='*' UpgradeCode='{6D4CE32B-FB91-45DA-A9B5-7E0D9929A3C3}' PerMachine='yes' />", dataRelatedBundlesElements[0].GetTestXml(ignoreAttributesByElementName));
180 + Assert.Equal(1, dataRelatedBundlesElements.Count);
181 + }
182 + }
183 +
184 [Fact]
185 public void PopulatesBEManifestWithBundleExtensionBundleCustomData()
186 {
src/wix/test/WixToolsetTest.CoreIntegration/TestData/BundleLocalized/BundleWithInvalidUpgradeCode.wxl renamed
+1 -1
@@ -1,3 +1,3 @@
1 <WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Culture="en-US">
2 - <String Id="InvalidUpgradeCode">NOT-A-GUID</String>
2 + <String Id="UpgradeCode">NOT-A-GUID</String>
3 </WixLocalization>
src/wix/test/WixToolsetTest.CoreIntegration/TestData/BundleLocalized/BundleWithLocalizedUpgradeCode.wxs renamed
+1 -1
@@ -1,6 +1,6 @@
1 <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 <Bundle Name="BundleWithInvalidUpgradeCode"
3 - Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="!(loc.InvalidUpgradeCode)">
3 + Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="!(loc.UpgradeCode)">
4 <BootstrapperApplication>
5 <BootstrapperApplicationDll SourceFile="fakeba.dll" />
6 </BootstrapperApplication>
src/wix/test/WixToolsetTest.CoreIntegration/TestData/BundleLocalized/BundleWithValidUpgradeCode.wxl new
+3
@@ -0,0 +1,3 @@
1 +<WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Culture="en-US">
2 + <String Id="UpgradeCode">6d4ce32b-fb91-45da-a9b5-7e0d9929a3c3</String>
3 +</WixLocalization>