Allow payloads to be shared across packages in a Bundle
Fixes wixtoolset/issues#6370
Rob Mensching committed
Mar 23, 2021 at 01:21 UTC
977b748b499e02f7e5226416b1cf5cfcf3842129
8 files changed
+129
-71
src/WixToolset.Core.Burn/Bind/BindBundleCommand.cs
+54
-27
@@ -63,7 +63,7 @@ namespace WixToolset.Core.Burn
63
64
private IEnumerable<IBurnBackendBinderExtension> BackendExtensions { get; }
65
66
- private Intermediate Output { get; }
66
+ private Intermediate Output { get; }
67
68
private string OutputPath { get; }
69
@@ -95,7 +95,7 @@ namespace WixToolset.Core.Burn
95
96
var wixGroupSymbols = this.GetRequiredSymbols<WixGroupSymbol>();
97
98
- // Ensure there is one and only one row in the WixBundle table.
98
+ // Ensure there is one and only one WixBundleSymbol.
99
// The compiler and linker behavior should have colluded to get
100
// this behavior.
101
var bundleSymbol = this.GetSingleSymbol<WixBundleSymbol>();
@@ -104,12 +104,12 @@ namespace WixToolset.Core.Burn
104
105
bundleSymbol.Attributes |= WixBundleAttributes.PerMachine; // default to per-machine but the first-per user package wil flip the bundle per-user.
106
107
- // Ensure there is one and only one row in the WixBootstrapperApplicationDll table.
107
+ // Ensure there is one and only one WixBootstrapperApplicationDllSymbol.
108
// The compiler and linker behavior should have colluded to get
109
// this behavior.
110
var bundleApplicationDllSymbol = this.GetSingleSymbol<WixBootstrapperApplicationDllSymbol>();
111
112
- // Ensure there is one and only one row in the WixChain table.
112
+ // Ensure there is one and only one WixChainSymbol.
113
// The compiler and linker behavior should have colluded to get
114
// this behavior.
115
var chainSymbol = this.GetSingleSymbol<WixChainSymbol>();
@@ -122,10 +122,15 @@ namespace WixToolset.Core.Burn
122
// If there are any fields to resolve later, create the cache to populate during bind.
123
var variableCache = this.DelayedFields.Any() ? new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase) : null;
124
125
- var orderSearchesCommand = new OrderSearchesCommand(this.Messaging, section);
126
- orderSearchesCommand.Execute();
127
- var orderedSearches = orderSearchesCommand.OrderedSearchFacades;
128
- var extensionSearchSymbolsById = orderSearchesCommand.ExtensionSearchSymbolsByExtensionId;
125
+ IEnumerable<ISearchFacade> orderedSearches;
126
+ IDictionary<string, IEnumerable<IntermediateSymbol>> extensionSearchSymbolsById;
127
+ {
128
+ var orderSearchesCommand = new OrderSearchesCommand(this.Messaging, section);
129
+ orderSearchesCommand.Execute();
130
+
131
+ orderedSearches = orderSearchesCommand.OrderedSearchFacades;
132
+ extensionSearchSymbolsById = orderSearchesCommand.ExtensionSearchSymbolsByExtensionId;
133
+ }
134
135
// Extract files that come from binary .wixlibs and WixExtensions (this does not extract files from merge modules).
136
{
@@ -136,8 +141,9 @@ namespace WixToolset.Core.Burn
141
142
// Get the explicit payloads.
143
var payloadSymbols = section.Symbols.OfType<WixBundlePayloadSymbol>().ToDictionary(t => t.Id.Id);
144
+ var packagesPayloads = RecalculatePackagesPayloads(payloadSymbols, wixGroupSymbols);
145
140
- // Update explicitly authored payloads with their parent package and container (as appropriate)
146
+ // Update explicitly authored payloads with their parent container
147
// to make it easier to gather the payloads later.
148
foreach (var groupSymbol in wixGroupSymbols)
149
{
@@ -145,14 +151,10 @@ namespace WixToolset.Core.Burn
151
{
152
var payloadSymbol = payloadSymbols[groupSymbol.ChildId];
153
148
- if (ComplexReferenceParentType.Package == groupSymbol.ParentType)
154
+ if (ComplexReferenceParentType.Container == groupSymbol.ParentType)
155
{
150
- Debug.Assert(String.IsNullOrEmpty(payloadSymbol.PackageRef));
151
- payloadSymbol.PackageRef = groupSymbol.ParentId;
152
- }
153
- else if (ComplexReferenceParentType.Container == groupSymbol.ParentType)
154
- {
155
- Debug.Assert(String.IsNullOrEmpty(payloadSymbol.ContainerRef));
156
+ // TODO: v3 didn't warn if we overwrote the payload's container.
157
+ // Should we warn now?
158
payloadSymbol.ContainerRef = groupSymbol.ParentId;
159
}
160
else if (ComplexReferenceParentType.Layout == groupSymbol.ParentType)
@@ -167,7 +169,7 @@ namespace WixToolset.Core.Burn
169
// Process the explicitly authored payloads.
170
ISet<string> processedPayloads;
171
{
170
- var command = new ProcessPayloadsCommand(this.ServiceProvider, this.BackendHelper, this.PayloadHarvester, payloadSymbols.Values, bundleSymbol.DefaultPackagingType, layoutDirectory);
172
+ var command = new ProcessPayloadsCommand(this.BackendHelper, this.PayloadHarvester, payloadSymbols.Values, bundleSymbol.DefaultPackagingType, layoutDirectory);
173
command.Execute();
174
175
fileTransfers.AddRange(command.FileTransfers);
@@ -204,7 +206,7 @@ namespace WixToolset.Core.Burn
206
207
case WixBundlePackageType.Msi:
208
{
207
- var command = new ProcessMsiPackageCommand(this.ServiceProvider, this.BackendExtensions, section, facade, payloadSymbols);
209
+ var command = new ProcessMsiPackageCommand(this.ServiceProvider, this.BackendExtensions, section, facade, packagesPayloads[facade.PackageId]);
210
command.Execute();
211
212
if (null != variableCache)
@@ -249,12 +251,13 @@ namespace WixToolset.Core.Burn
251
// Reindex the payloads now that all the payloads (minus the manifest payloads that will be created later)
252
// are present.
253
payloadSymbols = section.Symbols.OfType<WixBundlePayloadSymbol>().ToDictionary(t => t.Id.Id);
254
+ packagesPayloads = RecalculatePackagesPayloads(payloadSymbols, wixGroupSymbols);
255
256
// Process the payloads that were added by processing the packages.
257
{
258
var toProcess = payloadSymbols.Values.Where(r => !processedPayloads.Contains(r.Id.Id)).ToList();
259
257
- var command = new ProcessPayloadsCommand(this.ServiceProvider, this.BackendHelper, this.PayloadHarvester, toProcess, bundleSymbol.DefaultPackagingType, layoutDirectory);
260
+ var command = new ProcessPayloadsCommand(this.BackendHelper, this.PayloadHarvester, toProcess, bundleSymbol.DefaultPackagingType, layoutDirectory);
261
command.Execute();
262
263
fileTransfers.AddRange(command.FileTransfers);
@@ -265,15 +268,13 @@ namespace WixToolset.Core.Burn
268
269
// Set the package metadata from the payloads now that we have the complete payload information.
270
{
268
- var payloadsByPackageId = payloadSymbols.Values.ToLookup(p => p.PackageRef);
269
-
271
foreach (var facade in facades.Values)
272
{
273
facade.PackageSymbol.Size = 0;
274
274
- var packagePayloads = payloadsByPackageId[facade.PackageId];
275
+ var packagePayloads = packagesPayloads[facade.PackageId];
276
276
- foreach (var payload in packagePayloads)
277
+ foreach (var payload in packagePayloads.Values)
278
{
279
facade.PackageSymbol.Size += payload.FileSize.Value;
280
}
@@ -415,7 +416,7 @@ namespace WixToolset.Core.Burn
416
// Generate the core-defined BA manifest tables...
417
string baManifestPath;
418
{
418
- var command = new CreateBootstrapperApplicationManifestCommand(section, bundleSymbol, orderedFacades, uxPayloadIndex, payloadSymbols, this.IntermediateFolder, this.InternalBurnBackendHelper);
419
+ var command = new CreateBootstrapperApplicationManifestCommand(section, bundleSymbol, orderedFacades, uxPayloadIndex, packagesPayloads, this.IntermediateFolder, this.InternalBurnBackendHelper);
420
command.Execute();
421
422
var baManifestPayload = command.BootstrapperApplicationManifestPayloadRow;
@@ -462,7 +463,7 @@ namespace WixToolset.Core.Burn
463
{
464
var executableName = Path.GetFileName(this.OutputPath);
465
465
- var command = new CreateBurnManifestCommand(this.Messaging, this.BackendExtensions, executableName, section, bundleSymbol, containers, chainSymbol, orderedFacades, boundaries, uxPayloads, payloadSymbols, orderedSearches, this.IntermediateFolder);
466
+ var command = new CreateBurnManifestCommand(this.Messaging, this.BackendExtensions, executableName, section, bundleSymbol, containers, chainSymbol, orderedFacades, boundaries, uxPayloads, payloadSymbols, packagesPayloads, orderedSearches, this.IntermediateFolder);
467
command.Execute();
468
469
manifestPath = command.OutputPath;
@@ -580,7 +581,7 @@ namespace WixToolset.Core.Burn
581
582
if (0 == symbols.Count)
583
{
583
- throw new WixException(ErrorMessages.MissingBundleInformation(nameof(T)));
584
+ this.Messaging.Write(ErrorMessages.MissingBundleInformation(nameof(T)));
585
}
586
587
return symbols;
@@ -592,10 +593,36 @@ namespace WixToolset.Core.Burn
593
594
if (1 != symbols.Count)
595
{
595
- throw new WixException(ErrorMessages.MissingBundleInformation(nameof(T)));
596
+ this.Messaging.Write(ErrorMessages.MissingBundleInformation(nameof(T)));
597
}
598
599
return symbols[0];
600
}
601
+
602
+ private static Dictionary<string, Dictionary<string, WixBundlePayloadSymbol>> RecalculatePackagesPayloads(Dictionary<string, WixBundlePayloadSymbol> payloadSymbols, IEnumerable<WixGroupSymbol> wixGroupSymbols)
603
+ {
604
+ var packagesPayloads = new Dictionary<string, Dictionary<string, WixBundlePayloadSymbol>>();
605
+
606
+ foreach (var groupSymbol in wixGroupSymbols)
607
+ {
608
+ if (ComplexReferenceChildType.Payload == groupSymbol.ChildType)
609
+ {
610
+ var payloadSymbol = payloadSymbols[groupSymbol.ChildId];
611
+
612
+ if (ComplexReferenceParentType.Package == groupSymbol.ParentType)
613
+ {
614
+ if (!packagesPayloads.TryGetValue(groupSymbol.ParentId, out var packagePayloadsById))
615
+ {
616
+ packagePayloadsById = new Dictionary<string, WixBundlePayloadSymbol>();
617
+ packagesPayloads.Add(groupSymbol.ParentId, packagePayloadsById);
618
+ }
619
+
620
+ packagePayloadsById.Add(payloadSymbol.Id.Id, payloadSymbol);
621
+ }
622
+ }
623
+ }
624
+
625
+ return packagesPayloads;
626
+ }
627
}
628
}
src/WixToolset.Core.Burn/Bundles/CreateBootstrapperApplicationManifestCommand.cs
+31
-23
@@ -15,13 +15,13 @@ namespace WixToolset.Core.Burn.Bundles
15
16
internal class CreateBootstrapperApplicationManifestCommand
17
{
18
- public CreateBootstrapperApplicationManifestCommand(IntermediateSection section, WixBundleSymbol bundleSymbol, IEnumerable<PackageFacade> chainPackages, int lastUXPayloadIndex, Dictionary<string, WixBundlePayloadSymbol> payloadSymbols, string intermediateFolder, IInternalBurnBackendHelper internalBurnBackendHelper)
18
+ public CreateBootstrapperApplicationManifestCommand(IntermediateSection section, WixBundleSymbol bundleSymbol, IEnumerable<PackageFacade> chainPackages, int lastUXPayloadIndex, Dictionary<string, Dictionary<string, WixBundlePayloadSymbol>> packagesPayloads, string intermediateFolder, IInternalBurnBackendHelper internalBurnBackendHelper)
19
{
20
this.Section = section;
21
this.BundleSymbol = bundleSymbol;
22
this.ChainPackages = chainPackages;
23
this.LastUXPayloadIndex = lastUXPayloadIndex;
24
- this.Payloads = payloadSymbols;
24
+ this.PackagesPayloads = packagesPayloads;
25
this.IntermediateFolder = intermediateFolder;
26
this.InternalBurnBackendHelper = internalBurnBackendHelper;
27
}
@@ -36,7 +36,7 @@ namespace WixToolset.Core.Burn.Bundles
36
37
private int LastUXPayloadIndex { get; }
38
39
- private Dictionary<string, WixBundlePayloadSymbol> Payloads { get; }
39
+ private Dictionary<string, Dictionary<string, WixBundlePayloadSymbol>> PackagesPayloads { get; }
40
41
private string IntermediateFolder { get; }
42
@@ -98,7 +98,12 @@ namespace WixToolset.Core.Burn.Bundles
98
{
99
foreach (var package in this.ChainPackages)
100
{
101
- var packagePayload = this.Payloads[package.PackageSymbol.PayloadRef];
101
+ if (!this.PackagesPayloads.TryGetValue(package.PackageId, out var payloads))
102
+ {
103
+ continue;
104
+ }
105
+
106
+ var packagePayload = payloads[package.PackageSymbol.PayloadRef];
107
108
var size = package.PackageSymbol.Size.ToString(CultureInfo.InvariantCulture);
109
@@ -212,33 +217,36 @@ namespace WixToolset.Core.Burn.Bundles
217
private void WritePayloadInfo(XmlTextWriter writer)
218
{
219
// TODO: check v3 - should this be only include package payloads or include all non-UX container payloads?
215
- var payloadSymbols = this.Section.Symbols.OfType<WixBundlePayloadSymbol>()
216
- .Where(p => !String.IsNullOrEmpty(p.PackageRef));
217
-
218
- foreach (var payloadSymbol in payloadSymbols)
220
+ foreach (var kvp in this.PackagesPayloads.OrderBy(kvp => kvp.Key, StringComparer.Ordinal))
221
{
220
- writer.WriteStartElement("WixPayloadProperties");
222
+ var packageId = kvp.Key;
223
+ var payloadsById = kvp.Value;
224
222
- writer.WriteAttributeString("Payload", payloadSymbol.Id.Id);
225
+ foreach (var payloadSymbol in payloadsById.Values.OrderBy(p => p.Id.Id, StringComparer.Ordinal))
226
+ {
227
+ writer.WriteStartElement("WixPayloadProperties");
228
224
- writer.WriteAttributeString("Package", payloadSymbol.PackageRef);
229
+ writer.WriteAttributeString("Package", packageId);
230
226
- if (!String.IsNullOrEmpty(payloadSymbol.ContainerRef))
227
- {
228
- writer.WriteAttributeString("Container", payloadSymbol.ContainerRef);
229
- }
231
+ writer.WriteAttributeString("Payload", payloadSymbol.Id.Id);
232
+
233
+ if (!String.IsNullOrEmpty(payloadSymbol.ContainerRef))
234
+ {
235
+ writer.WriteAttributeString("Container", payloadSymbol.ContainerRef);
236
+ }
237
231
- writer.WriteAttributeString("Name", payloadSymbol.Name);
232
- writer.WriteAttributeString("Size", payloadSymbol.FileSize.Value.ToString(CultureInfo.InvariantCulture));
238
+ writer.WriteAttributeString("Name", payloadSymbol.Name);
239
+ writer.WriteAttributeString("Size", payloadSymbol.FileSize.Value.ToString(CultureInfo.InvariantCulture));
240
234
- if (!String.IsNullOrEmpty(payloadSymbol.DownloadUrl))
235
- {
236
- writer.WriteAttributeString("DownloadUrl", payloadSymbol.DownloadUrl);
237
- }
241
+ if (!String.IsNullOrEmpty(payloadSymbol.DownloadUrl))
242
+ {
243
+ writer.WriteAttributeString("DownloadUrl", payloadSymbol.DownloadUrl);
244
+ }
245
239
- writer.WriteAttributeString("LayoutOnly", payloadSymbol.LayoutOnly ? "yes" : "no");
246
+ writer.WriteAttributeString("LayoutOnly", payloadSymbol.LayoutOnly ? "yes" : "no");
247
241
- writer.WriteEndElement();
248
+ writer.WriteEndElement();
249
+ }
250
}
251
}
252
src/WixToolset.Core.Burn/Bundles/CreateBundleExtensionManifestCommand.cs
+8
@@ -68,6 +68,14 @@ namespace WixToolset.Core.Burn.Bundles
68
{
69
var generatedId = this.InternalBurnBackendHelper.GenerateIdentifier("ux", BurnCommon.BundleExtensionDataFileName);
70
71
+ this.Section.AddSymbol(new WixGroupSymbol(this.BundleSymbol.SourceLineNumbers)
72
+ {
73
+ ParentType = ComplexReferenceParentType.Container,
74
+ ParentId = BurnConstants.BurnUXContainerName,
75
+ ChildType = ComplexReferenceChildType.Payload,
76
+ ChildId = generatedId
77
+ });
78
+
79
var symbol = this.Section.AddSymbol(new WixBundlePayloadSymbol(this.BundleSymbol.SourceLineNumbers, new Identifier(AccessModifier.Section, generatedId))
80
{
81
Name = BurnCommon.BundleExtensionDataFileName,
src/WixToolset.Core.Burn/Bundles/CreateBurnManifestCommand.cs
+6
-4
@@ -18,7 +18,7 @@ namespace WixToolset.Core.Burn.Bundles
18
19
internal class CreateBurnManifestCommand
20
{
21
- public CreateBurnManifestCommand(IMessaging messaging, IEnumerable<IBurnBackendBinderExtension> backendExtensions, string executableName, IntermediateSection section, WixBundleSymbol bundleSymbol, IEnumerable<WixBundleContainerSymbol> containers, WixChainSymbol chainSymbol, IEnumerable<PackageFacade> orderedPackages, IEnumerable<WixBundleRollbackBoundarySymbol> boundaries, IEnumerable<WixBundlePayloadSymbol> uxPayloads, Dictionary<string, WixBundlePayloadSymbol> allPayloadsById, IEnumerable<ISearchFacade> orderedSearches, string intermediateFolder)
21
+ public CreateBurnManifestCommand(IMessaging messaging, IEnumerable<IBurnBackendBinderExtension> backendExtensions, string executableName, IntermediateSection section, WixBundleSymbol bundleSymbol, IEnumerable<WixBundleContainerSymbol> containers, WixChainSymbol chainSymbol, IEnumerable<PackageFacade> orderedPackages, IEnumerable<WixBundleRollbackBoundarySymbol> boundaries, IEnumerable<WixBundlePayloadSymbol> uxPayloads, Dictionary<string, WixBundlePayloadSymbol> allPayloadsById, Dictionary<string, Dictionary<string, WixBundlePayloadSymbol>> packagesPayloads, IEnumerable<ISearchFacade> orderedSearches, string intermediateFolder)
22
{
23
this.Messaging = messaging;
24
this.BackendExtensions = backendExtensions;
@@ -31,6 +31,7 @@ namespace WixToolset.Core.Burn.Bundles
31
this.RollbackBoundaries = boundaries;
32
this.UXContainerPayloads = uxPayloads;
33
this.Payloads = allPayloadsById;
34
+ this.PackagesPayloads = packagesPayloads;
35
this.OrderedSearches = orderedSearches;
36
this.IntermediateFolder = intermediateFolder;
37
}
@@ -57,6 +58,8 @@ namespace WixToolset.Core.Burn.Bundles
58
59
private Dictionary<string, WixBundlePayloadSymbol> Payloads { get; }
60
61
+ private Dictionary<string, Dictionary<string, WixBundlePayloadSymbol>> PackagesPayloads { get; }
62
+
63
private IEnumerable<WixBundleContainerSymbol> Containers { get; }
64
65
private IEnumerable<WixBundlePayloadSymbol> UXContainerPayloads { get; }
@@ -328,7 +331,6 @@ namespace WixToolset.Core.Burn.Bundles
331
var targetCodesByPatch = this.Section.Symbols.OfType<WixBundlePatchTargetCodeSymbol>().ToLookup(r => r.PackageRef);
332
var msiFeaturesByPackage = this.Section.Symbols.OfType<WixBundleMsiFeatureSymbol>().ToLookup(r => r.PackageRef);
333
var msiPropertiesByPackage = this.Section.Symbols.OfType<WixBundleMsiPropertySymbol>().ToLookup(r => r.PackageRef);
331
- var payloadsByPackage = this.Payloads.Values.ToLookup(p => p.PackageRef);
334
var relatedPackagesByPackage = this.Section.Symbols.OfType<WixBundleRelatedPackageSymbol>().ToLookup(r => r.PackageRef);
335
var slipstreamMspsByPackage = this.Section.Symbols.OfType<WixBundleSlipstreamMspSymbol>().ToLookup(r => r.TargetPackageRef);
336
var exitCodesByPackage = this.Section.Symbols.OfType<WixBundlePackageExitCodeSymbol>().ToLookup(r => r.ChainPackageId);
@@ -569,9 +571,9 @@ namespace WixToolset.Core.Burn.Bundles
571
writer.WriteAttributeString("Id", packagePayloadId);
572
writer.WriteEndElement();
573
572
- var packagePayloads = payloadsByPackage[package.PackageId];
574
+ var packagePayloads = this.PackagesPayloads[package.PackageId];
575
574
- foreach (var payload in packagePayloads)
576
+ foreach (var payload in packagePayloads.Values)
577
{
578
if (payload.Id.Id != packagePayloadId)
579
{
src/WixToolset.Core.Burn/Bundles/GetPackageFacadesCommand.cs
+2
-1
@@ -27,6 +27,7 @@ namespace WixToolset.Core.Burn.Bundles
27
28
public void Execute()
29
{
30
+ var wixGroupPackagesGroupedById = this.Section.Symbols.OfType<WixGroupSymbol>().Where(g => g.ParentType == ComplexReferenceParentType.Package).ToLookup(g => g.ParentId);
31
var exePackages = this.Section.Symbols.OfType<WixBundleExePackageSymbol>().ToDictionary(t => t.Id.Id);
32
var msiPackages = this.Section.Symbols.OfType<WixBundleMsiPackageSymbol>().ToDictionary(t => t.Id.Id);
33
var mspPackages = this.Section.Symbols.OfType<WixBundleMspPackageSymbol>().ToDictionary(t => t.Id.Id);
@@ -43,7 +44,7 @@ namespace WixToolset.Core.Burn.Bundles
44
var id = package.Id.Id;
45
46
IntermediateSymbol packagePayload = null;
46
- foreach (var wixGroup in this.Section.Symbols.OfType<WixGroupSymbol>().Where(g => g.ParentType == ComplexReferenceParentType.Package && g.ParentId == id))
47
+ foreach (var wixGroup in wixGroupPackagesGroupedById[id])
48
{
49
if (wixGroup.ChildType == ComplexReferenceChildType.PackagePayload)
50
{
src/WixToolset.Core.Burn/Bundles/ProcessMsiPackageCommand.cs
+22
-10
@@ -23,7 +23,7 @@ namespace WixToolset.Core.Burn.Bundles
23
{
24
private const string PropertySqlFormat = "SELECT `Value` FROM `Property` WHERE `Property` = '{0}'";
25
26
- public ProcessMsiPackageCommand(IServiceProvider serviceProvider, IEnumerable<IBurnBackendBinderExtension> backendExtensions, IntermediateSection section, PackageFacade facade, Dictionary<string, WixBundlePayloadSymbol> payloadSymbols)
26
+ public ProcessMsiPackageCommand(IServiceProvider serviceProvider, IEnumerable<IBurnBackendBinderExtension> backendExtensions, IntermediateSection section, PackageFacade facade, Dictionary<string, WixBundlePayloadSymbol> packagePayloads)
27
{
28
this.Messaging = serviceProvider.GetService<IMessaging>();
29
this.BackendHelper = serviceProvider.GetService<IBackendHelper>();
@@ -31,7 +31,7 @@ namespace WixToolset.Core.Burn.Bundles
31
32
this.BackendExtensions = backendExtensions;
33
34
- this.AuthoredPayloads = payloadSymbols;
34
+ this.PackagePayloads = packagePayloads;
35
this.Section = section;
36
this.Facade = facade;
37
}
@@ -44,7 +44,7 @@ namespace WixToolset.Core.Burn.Bundles
44
45
private IEnumerable<IBurnBackendBinderExtension> BackendExtensions { get; }
46
47
- private Dictionary<string, WixBundlePayloadSymbol> AuthoredPayloads { get; }
47
+ private Dictionary<string, WixBundlePayloadSymbol> PackagePayloads { get; }
48
49
private PackageFacade Facade { get; }
50
@@ -55,7 +55,7 @@ namespace WixToolset.Core.Burn.Bundles
55
/// </summary>
56
public void Execute()
57
{
58
- var packagePayload = this.AuthoredPayloads[this.Facade.PackageSymbol.PayloadRef];
58
+ var packagePayload = this.PackagePayloads[this.Facade.PackageSymbol.PayloadRef];
59
60
var msiPackage = (WixBundleMsiPackageSymbol)this.Facade.SpecificPackageSymbol;
61
@@ -182,9 +182,7 @@ namespace WixToolset.Core.Burn.Bundles
182
183
private ISet<string> GetPayloadTargetNames(string packageId)
184
{
185
- var payloadNames = this.Section.Symbols.OfType<WixBundlePayloadSymbol>()
186
- .Where(p => p.PackageRef == packageId)
187
- .Select(p => p.Name);
185
+ var payloadNames = this.PackagePayloads.Values.Select(p => p.Name);
186
187
return new HashSet<string>(payloadNames, StringComparer.OrdinalIgnoreCase);
188
}
@@ -397,13 +395,20 @@ namespace WixToolset.Core.Burn.Bundles
395
var generatedId = this.BackendHelper.GenerateIdentifier("cab", packagePayload.Id.Id, cabinet);
396
var payloadSourceFile = this.ResolveRelatedFile(packagePayload.SourceFile.Path, packagePayload.UnresolvedSourceFile, cabinet, "Cabinet", this.Facade.PackageSymbol.SourceLineNumbers);
397
398
+ this.Section.AddSymbol(new WixGroupSymbol(this.Facade.PackageSymbol.SourceLineNumbers)
399
+ {
400
+ ParentType = ComplexReferenceParentType.Package,
401
+ ParentId = this.Facade.PackageId,
402
+ ChildType = ComplexReferenceChildType.Payload,
403
+ ChildId = generatedId
404
+ });
405
+
406
this.Section.AddSymbol(new WixBundlePayloadSymbol(this.Facade.PackageSymbol.SourceLineNumbers, new Identifier(AccessModifier.Section, generatedId))
407
{
408
Name = cabinetName,
409
SourceFile = new IntermediateFieldPathValue { Path = payloadSourceFile },
410
Compressed = packagePayload.Compressed,
411
UnresolvedSourceFile = cabinetName,
406
- PackageRef = packagePayload.PackageRef,
412
ContainerRef = packagePayload.ContainerRef,
413
ContentFile = true,
414
Packaging = packagePayload.Packaging,
@@ -466,7 +471,7 @@ namespace WixToolset.Core.Burn.Bundles
471
if (WindowsInstallerConstants.MsidbFileAttributesNoncompressed == (compressionBit & WindowsInstallerConstants.MsidbFileAttributesNoncompressed) ||
472
(!compressed && 0 == (compressionBit & WindowsInstallerConstants.MsidbFileAttributesCompressed)))
473
{
469
- string fileSourcePath = this.PathResolver.GetFileSourcePath(directories, record.GetString(1), record.GetString(3), compressed, longNamesInImage);
474
+ var fileSourcePath = this.PathResolver.GetFileSourcePath(directories, record.GetString(1), record.GetString(3), compressed, longNamesInImage);
475
var name = Path.Combine(Path.GetDirectoryName(packagePayload.Name), fileSourcePath);
476
477
if (!payloadNames.Contains(name))
@@ -474,13 +479,20 @@ namespace WixToolset.Core.Burn.Bundles
479
var generatedId = this.BackendHelper.GenerateIdentifier("f", packagePayload.Id.Id, record.GetString(2));
480
var payloadSourceFile = this.ResolveRelatedFile(packagePayload.SourceFile.Path, packagePayload.UnresolvedSourceFile, fileSourcePath, "File", this.Facade.PackageSymbol.SourceLineNumbers);
481
482
+ this.Section.AddSymbol(new WixGroupSymbol(this.Facade.PackageSymbol.SourceLineNumbers)
483
+ {
484
+ ParentType = ComplexReferenceParentType.Package,
485
+ ParentId = this.Facade.PackageId,
486
+ ChildType = ComplexReferenceChildType.Payload,
487
+ ChildId = generatedId
488
+ });
489
+
490
this.Section.AddSymbol(new WixBundlePayloadSymbol(this.Facade.PackageSymbol.SourceLineNumbers, new Identifier(AccessModifier.Section, generatedId))
491
{
492
Name = name,
493
SourceFile = new IntermediateFieldPathValue { Path = payloadSourceFile },
494
Compressed = packagePayload.Compressed,
495
UnresolvedSourceFile = name,
483
- PackageRef = packagePayload.PackageRef,
496
ContainerRef = packagePayload.ContainerRef,
497
ContentFile = true,
498
Packaging = packagePayload.Packaging,
src/test/WixToolsetTest.CoreIntegration/BundleManifestFixture.cs
+5
-5
@@ -94,7 +94,7 @@ namespace WixToolsetTest.CoreIntegration
94
}
95
}
96
97
- [Fact(Skip = "https://github.com/wixtoolset/issues/issues/6370")]
97
+ [Fact]
98
public void PopulatesBAManifestWithPayloadInformation()
99
{
100
var folder = TestData.Get(@"TestData");
@@ -131,10 +131,10 @@ namespace WixToolsetTest.CoreIntegration
131
{ "WixPayloadProperties", new List<string> { "Size" } },
132
};
133
Assert.Equal(4, payloadElements.Count);
134
- Assert.Equal("<WixPayloadProperties Payload='credwiz.exe' Package='credwiz.exe' Container='WixAttachedContainer' Name='credwiz.exe' Size='*' LayoutOnly='no' />", payloadElements[0].GetTestXml(ignoreAttributesByElementName));
135
- Assert.Equal("<WixPayloadProperties Payload='payue_e5DuhsDGlzJxWYPhqr6S7rkc' Package='credwiz.exe' Container='WixAttachedContainer' Name='SharedPayloadsBetweenPackages.wxs' Size='*' LayoutOnly='no' />", payloadElements[1].GetTestXml(ignoreAttributesByElementName));
136
- Assert.Equal("<WixPayloadProperties Payload='cscript.exe' Package='cscript.exe' Container='WixAttachedContainer' Name='cscript.exe' Size='*' LayoutOnly='no' />", payloadElements[2].GetTestXml(ignoreAttributesByElementName));
137
- Assert.Equal("<WixPayloadProperties Payload='payue_e5DuhsDGlzJxWYPhqr6S7rkc' Package='cscript.exe' Container='WixAttachedContainer' Name='SharedPayloadsBetweenPackages.wxs' Size='*' LayoutOnly='no' />", payloadElements[3].GetTestXml(ignoreAttributesByElementName));
134
+ Assert.Equal("<WixPayloadProperties Package='credwiz.exe' Payload='SourceFilePayload' Container='WixAttachedContainer' Name='SharedPayloadsBetweenPackages.wxs' Size='*' LayoutOnly='no' />", payloadElements[0].GetTestXml(ignoreAttributesByElementName));
135
+ Assert.Equal("<WixPayloadProperties Package='credwiz.exe' Payload='credwiz.exe' Container='WixAttachedContainer' Name='credwiz.exe' Size='*' LayoutOnly='no' />", payloadElements[1].GetTestXml(ignoreAttributesByElementName));
136
+ Assert.Equal("<WixPayloadProperties Package='cscript.exe' Payload='SourceFilePayload' Container='WixAttachedContainer' Name='SharedPayloadsBetweenPackages.wxs' Size='*' LayoutOnly='no' />", payloadElements[2].GetTestXml(ignoreAttributesByElementName));
137
+ Assert.Equal("<WixPayloadProperties Package='cscript.exe' Payload='cscript.exe' Container='WixAttachedContainer' Name='cscript.exe' Size='*' LayoutOnly='no' />", payloadElements[3].GetTestXml(ignoreAttributesByElementName));
138
}
139
}
140
src/test/WixToolsetTest.CoreIntegration/TestData/SharedPayloadsBetweenPackages/SharedPayloadsBetweenPackages.wxs
+1
-1
@@ -12,7 +12,7 @@
12
</Fragment>
13
<Fragment>
14
<PayloadGroup Id="SharedPayloads">
15
- <Payload SourceFile="$(sys.SOURCEFILEPATH)" />
15
+ <Payload Id="SourceFilePayload" SourceFile="$(sys.SOURCEFILEPATH)" />
16
</PayloadGroup>
17
</Fragment>
18
</Wix>