@joebigelow / wix-1 / commits / ddae99c2

Handle MergeModule.CABinet for extraction.

Fixes https://github.com/wixtoolset/issues/issues/7568,

Bob Arnson committed Jun 20, 2023 at 20:09 UTC ddae99c27fcec6c90696f6df66608aae155d6a93
3 files changed +36 -16
src/wix/WixToolset.Core.WindowsInstaller/Unbind/ExtractCabinetsCommand.cs
+13 -3
@@ -29,7 +29,7 @@ namespace WixToolset.Core.WindowsInstaller.Unbind
29
30 public Dictionary<string, MediaRow> ExtractedFileIdsWithMediaRow { get; private set; }
31
32 - private IFileSystem FileSystem { get; }
32 + private IFileSystem FileSystem { get; }
33
34 private WindowsInstallerData Output { get; }
35
@@ -55,13 +55,23 @@ namespace WixToolset.Core.WindowsInstaller.Unbind
55 // index all of the cabinet files
56 if (OutputType.Module == this.Output.Type || this.TreatOutputAsModule)
57 {
58 - embeddedCabinetNamesByDiskId.Add(0, "MergeModule.CABinet");
58 + var mediaRow = new MediaRow(null, WindowsInstallerTableDefinitions.Media)
59 + {
60 + DiskId = 1,
61 + LastSequence = 1,
62 + Cabinet = "MergeModule.CABinet",
63 + };
64 +
65 + embeddedCabinetRowsByDiskId.Add(1, mediaRow);
66 + embeddedCabinetNamesByDiskId.Add(1, "MergeModule.CABinet");
67 }
60 - else if (this.Output.Tables.TryGetTable("Media", out var mediaTable))
68 +
69 + if (this.Output.Tables.TryGetTable("Media", out var mediaTable))
70 {
71 foreach (var mediaRow in mediaTable.Rows.Cast<MediaRow>().Where(r => !String.IsNullOrEmpty(r.Cabinet)))
72 {
73 if (OutputType.Package == this.Output.Type ||
74 + OutputType.Module == this.Output.Type ||
75 (OutputType.Transform == this.Output.Type && RowOperation.Add == mediaRow.Operation))
76 {
77 if (mediaRow.Cabinet.StartsWith("#", StringComparison.Ordinal))
src/wix/test/WixToolsetTest.CoreIntegration/DecompileFixture.cs
+22 -12
@@ -2,20 +2,22 @@
2
3 namespace WixToolsetTest.CoreIntegration
4 {
5 + using System;
6 using System.IO;
6 - using WixInternal.TestSupport;
7 using WixInternal.Core.TestPackage;
8 + using WixInternal.TestSupport;
9 using Xunit;
10
11 public class DecompileFixture
12 {
12 - private static void DecompileAndCompare(string msiName, string expectedWxsName, params string[] sourceFolder)
13 + private static void DecompileAndCompare(string msiName, bool extract, string expectedWxsName, params string[] sourceFolder)
14 {
15 var folder = TestData.Get(sourceFolder);
16
17 using (var fs = new DisposableFileSystem())
18 {
19 var intermediateFolder = fs.GetFolder();
20 + var extractPath = Path.Combine(intermediateFolder, "$extracted");
21 var outputPath = Path.Combine(intermediateFolder, @"Actual.wxs");
22
23 var result = WixRunner.Execute(new[]
@@ -23,10 +25,18 @@ namespace WixToolsetTest.CoreIntegration
25 "msi", "decompile",
26 Path.Combine(folder, msiName),
27 "-intermediateFolder", intermediateFolder,
26 - "-o", outputPath
28 + "-o", outputPath,
29 + extract ? "-x" : String.Empty,
30 + extract ? extractPath : String.Empty,
31 }, out var messages);
32
33 Assert.Equal(0, result);
34 + Assert.Empty(messages);
35 +
36 + if (extract)
37 + {
38 + Assert.NotEmpty(Directory.EnumerateFiles(extractPath, "*", SearchOption.AllDirectories));
39 + }
40
41 WixAssert.CompareXml(Path.Combine(folder, expectedWxsName), outputPath);
42 }
@@ -35,19 +45,19 @@ namespace WixToolsetTest.CoreIntegration
45 [Fact]
46 public void CanDecompileSingleFileCompressed()
47 {
38 - DecompileAndCompare("example.msi", "Expected.wxs", "TestData", "DecompileSingleFileCompressed");
48 + DecompileAndCompare("example.msi", extract: true, "Expected.wxs", "TestData", "DecompileSingleFileCompressed");
49 }
50
51 [Fact]
52 public void CanDecompile64BitSingleFileCompressed()
53 {
44 - DecompileAndCompare("example.msi", "Expected.wxs", "TestData", "DecompileSingleFileCompressed64");
54 + DecompileAndCompare("example.msi", extract: true, "Expected.wxs", "TestData", "DecompileSingleFileCompressed64");
55 }
56
57 [Fact]
58 public void CanDecompileNestedDirSearchUnderRegSearch()
59 {
50 - DecompileAndCompare("NestedDirSearchUnderRegSearch.msi", "DecompiledNestedDirSearchUnderRegSearch.wxs", "TestData", "AppSearch");
60 + DecompileAndCompare("NestedDirSearchUnderRegSearch.msi", extract: false, "DecompiledNestedDirSearchUnderRegSearch.wxs", "TestData", "AppSearch");
61 }
62
63 [Fact]
@@ -56,37 +66,37 @@ namespace WixToolsetTest.CoreIntegration
66 // The input MSI was not created using standard methods, it is an example of a real world database that needs to be decompiled.
67 // The Class/@Feature_ column has length of 32, the File/@Attributes has length of 2,
68 // and numerous foreign key relationships are missing.
59 - DecompileAndCompare("OldClassTableDef.msi", "DecompiledOldClassTableDef.wxs", "TestData", "Class");
69 + DecompileAndCompare("OldClassTableDef.msi", extract: false, "DecompiledOldClassTableDef.wxs", "TestData", "Class");
70 }
71
72 [Fact]
73 public void CanDecompileSequenceTables()
74 {
65 - DecompileAndCompare("SequenceTables.msi", "DecompiledSequenceTables.wxs", "TestData", "SequenceTables");
75 + DecompileAndCompare("SequenceTables.msi", extract: false, "DecompiledSequenceTables.wxs", "TestData", "SequenceTables");
76 }
77
78 [Fact]
79 public void CanDecompileShortcuts()
80 {
71 - DecompileAndCompare("shortcuts.msi", "DecompiledShortcuts.wxs", "TestData", "Shortcut");
81 + DecompileAndCompare("shortcuts.msi", extract: false, "DecompiledShortcuts.wxs", "TestData", "Shortcut");
82 }
83
84 [Fact]
85 public void CanDecompileNullComponent()
86 {
77 - DecompileAndCompare("example.msi", "Expected.wxs", "TestData", "DecompileNullComponent");
87 + DecompileAndCompare("example.msi", extract: true, "Expected.wxs", "TestData", "DecompileNullComponent");
88 }
89
90 [Fact]
91 public void CanDecompileMergeModuleWithTargetDirComponent()
92 {
83 - DecompileAndCompare("MergeModule1.msm", "Expected.wxs", "TestData", "DecompileTargetDirMergeModule");
93 + DecompileAndCompare("MergeModule1.msm", extract: true, "Expected.wxs", "TestData", "DecompileTargetDirMergeModule");
94 }
95
96 [Fact]
97 public void CanDecompileUI()
98 {
89 - DecompileAndCompare("ui.msi", "ExpectedUI.wxs", "TestData", "Decompile");
99 + DecompileAndCompare("ui.msi", extract: false, "ExpectedUI.wxs", "TestData", "Decompile");
100 }
101 }
102 }
src/wix/test/WixToolsetTest.CoreIntegration/PatchFixture.cs
+1 -1
@@ -575,7 +575,7 @@ namespace WixToolsetTest.CoreIntegration
575 var args = $"/a \"{Path.ChangeExtension(msiPath, "msi")}\" TARGETDIR=\"{targetDir}\" /qn";
576
577 var proc = Process.Start("msiexec.exe", args);
578 - proc.WaitForExit(5000);
578 + proc.WaitForExit(10000);
579
580 Assert.Equal(0, proc.ExitCode);
581 }