From 2a702f736a907febdd03b493437f0bad3f6732af Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Mon, 14 Mar 2022 10:27:18 -0700 Subject: Display warning when extracting bundle from Package Cache The Package Cache contains stripped bundles which would fail extraction with an exception. Display a warning instead. Plus do a touch of code clean up. Fixes 6315 --- src/wix/WixToolset.Core.Burn/Bundles/BurnReader.cs | 55 ++++++++++------------ .../WixToolset.Core.Burn/BurnBackendWarnings.cs | 6 +++ .../CommandLine/ExtractSubcommand.cs | 10 +++- 3 files changed, 40 insertions(+), 31 deletions(-) diff --git a/src/wix/WixToolset.Core.Burn/Bundles/BurnReader.cs b/src/wix/WixToolset.Core.Burn/Bundles/BurnReader.cs index 933afc77..b30ac48a 100644 --- a/src/wix/WixToolset.Core.Burn/Bundles/BurnReader.cs +++ b/src/wix/WixToolset.Core.Burn/Bundles/BurnReader.cs @@ -84,9 +84,9 @@ namespace WixToolset.Core.Burn.Bundles } Directory.CreateDirectory(outputDirectory); - string tempCabPath = Path.Combine(tempDirectory, "ux.cab"); - string manifestOriginalPath = Path.Combine(outputDirectory, "0"); - string manifestPath = Path.Combine(outputDirectory, "manifest.xml"); + var tempCabPath = Path.Combine(tempDirectory, "ux.cab"); + var manifestOriginalPath = Path.Combine(outputDirectory, "0"); + var manifestPath = Path.Combine(outputDirectory, "manifest.xml"); var uxContainerSlot = this.AttachedContainers[0]; this.binaryReader.BaseStream.Seek(this.UXAddress, SeekOrigin.Begin); @@ -101,20 +101,20 @@ namespace WixToolset.Core.Burn.Bundles Directory.CreateDirectory(Path.GetDirectoryName(manifestPath)); FileSystem.MoveFile(manifestOriginalPath, manifestPath); - XmlDocument document = new XmlDocument(); + var document = new XmlDocument(); document.Load(manifestPath); - XmlNamespaceManager namespaceManager = new XmlNamespaceManager(document.NameTable); + var namespaceManager = new XmlNamespaceManager(document.NameTable); namespaceManager.AddNamespace("burn", BurnCommon.BurnNamespace); - XmlNodeList uxPayloads = document.SelectNodes("/burn:BurnManifest/burn:UX/burn:Payload", namespaceManager); - XmlNodeList payloads = document.SelectNodes("/burn:BurnManifest/burn:Payload", namespaceManager); + var uxPayloads = document.SelectNodes("/burn:BurnManifest/burn:UX/burn:Payload", namespaceManager); + var payloads = document.SelectNodes("/burn:BurnManifest/burn:Payload", namespaceManager); foreach (XmlNode uxPayload in uxPayloads) { - XmlNode sourcePathNode = uxPayload.Attributes.GetNamedItem("SourcePath"); - XmlNode filePathNode = uxPayload.Attributes.GetNamedItem("FilePath"); + var sourcePathNode = uxPayload.Attributes.GetNamedItem("SourcePath"); + var filePathNode = uxPayload.Attributes.GetNamedItem("FilePath"); - string sourcePath = Path.Combine(outputDirectory, sourcePathNode.Value); - string destinationPath = Path.Combine(outputDirectory, filePathNode.Value); + var sourcePath = Path.Combine(outputDirectory, sourcePathNode.Value); + var destinationPath = Path.Combine(outputDirectory, filePathNode.Value); Directory.CreateDirectory(Path.GetDirectoryName(destinationPath)); FileSystem.MoveFile(sourcePath, destinationPath); @@ -122,18 +122,18 @@ namespace WixToolset.Core.Burn.Bundles foreach (XmlNode payload in payloads) { - XmlNode packagingNode = payload.Attributes.GetNamedItem("Packaging"); + var packagingNode = payload.Attributes.GetNamedItem("Packaging"); - string packaging = packagingNode.Value; + var packaging = packagingNode.Value; if (packaging.Equals("embedded", StringComparison.OrdinalIgnoreCase)) { - XmlNode sourcePathNode = payload.Attributes.GetNamedItem("SourcePath"); - XmlNode filePathNode = payload.Attributes.GetNamedItem("FilePath"); - XmlNode containerNode = payload.Attributes.GetNamedItem("Container"); + var sourcePathNode = payload.Attributes.GetNamedItem("SourcePath"); + var filePathNode = payload.Attributes.GetNamedItem("FilePath"); + var containerNode = payload.Attributes.GetNamedItem("Container"); - string sourcePath = sourcePathNode.Value; - string destinationPath = Path.Combine(containerNode.Value, filePathNode.Value); + var sourcePath = sourcePathNode.Value; + var destinationPath = Path.Combine(containerNode.Value, filePathNode.Value); this.attachedContainerPayloadNames.Add(new DictionaryEntry(sourcePath, destinationPath)); } @@ -142,11 +142,6 @@ namespace WixToolset.Core.Burn.Bundles return true; } - internal void ExtractUXContainer(string uxExtractPath, object intermediateFolder) - { - throw new NotImplementedException(); - } - /// /// Gets each non-UX attached container from the exe and extracts its contents to the output directory. /// @@ -167,11 +162,11 @@ namespace WixToolset.Core.Burn.Bundles } Directory.CreateDirectory(outputDirectory); - uint nextAddress = this.EngineSize; - for (int i = 1; i < this.AttachedContainers.Count; i++) + var nextAddress = this.EngineSize; + for (var i = 1; i < this.AttachedContainers.Count; i++) { - ContainerSlot cntnr = this.AttachedContainers[i]; - string tempCabPath = Path.Combine(tempDirectory, $"a{i}.cab"); + var cntnr = this.AttachedContainers[i]; + var tempCabPath = Path.Combine(tempDirectory, $"a{i}.cab"); this.binaryReader.BaseStream.Seek(nextAddress, SeekOrigin.Begin); using (Stream tempCab = File.Open(tempCabPath, FileMode.Create, FileAccess.Write)) @@ -185,10 +180,10 @@ namespace WixToolset.Core.Burn.Bundles nextAddress += cntnr.Size; } - foreach (DictionaryEntry entry in this.attachedContainerPayloadNames) + foreach (var entry in this.attachedContainerPayloadNames) { - string sourcePath = Path.Combine(outputDirectory, (string)entry.Key); - string destinationPath = Path.Combine(outputDirectory, (string)entry.Value); + var sourcePath = Path.Combine(outputDirectory, (string)entry.Key); + var destinationPath = Path.Combine(outputDirectory, (string)entry.Value); Directory.CreateDirectory(Path.GetDirectoryName(destinationPath)); FileSystem.MoveFile(sourcePath, destinationPath); diff --git a/src/wix/WixToolset.Core.Burn/BurnBackendWarnings.cs b/src/wix/WixToolset.Core.Burn/BurnBackendWarnings.cs index a0ffa1dc..033b755a 100644 --- a/src/wix/WixToolset.Core.Burn/BurnBackendWarnings.cs +++ b/src/wix/WixToolset.Core.Burn/BurnBackendWarnings.cs @@ -21,6 +21,11 @@ namespace WixToolset.Core.Burn return Message(sourceLineNumbers, Ids.EmptyContainer, "The Container '{0}' is being ignored because it doesn't have any payloads.", containerId); } + public static Message FailedToExtractAttachedContainers(SourceLineNumber sourceLineNumbers) + { + return Message(sourceLineNumbers, Ids.FailedToExtractAttachedContainers, "Failed to extract attached container. This most often happens when extracting a stripped bundle from the package cache, which is not supported."); + } + private static Message Message(SourceLineNumber sourceLineNumber, Ids id, string format, params object[] args) { return new Message(sourceLineNumber, MessageLevel.Warning, (int)id, format, args); @@ -31,6 +36,7 @@ namespace WixToolset.Core.Burn AttachedContainerPayloadCollision = 8500, AttachedContainerPayloadCollision2 = 8501, EmptyContainer = 8502, + FailedToExtractAttachedContainers = 8503, } // last available is 8999. 9000 is VerboseMessages. } } diff --git a/src/wix/WixToolset.Core.Burn/CommandLine/ExtractSubcommand.cs b/src/wix/WixToolset.Core.Burn/CommandLine/ExtractSubcommand.cs index 859f5e34..605ee045 100644 --- a/src/wix/WixToolset.Core.Burn/CommandLine/ExtractSubcommand.cs +++ b/src/wix/WixToolset.Core.Burn/CommandLine/ExtractSubcommand.cs @@ -52,7 +52,15 @@ namespace WixToolset.Core.Burn.CommandLine using (var reader = BurnReader.Open(this.Messaging, this.InputPath)) { reader.ExtractUXContainer(uxExtractPath, this.IntermediateFolder); - reader.ExtractAttachedContainers(this.ExtractPath, this.IntermediateFolder); + + try + { + reader.ExtractAttachedContainers(this.ExtractPath, this.IntermediateFolder); + } + catch + { + this.Messaging.Write(BurnBackendWarnings.FailedToExtractAttachedContainers(new Data.SourceLineNumber(this.ExtractPath))); + } } return Task.FromResult(this.Messaging.LastErrorNumber); -- cgit v1.2.3-55-g6feb