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
}