@joebigelow / wix-1 / commits / 977b748b

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>