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>