Fix decompilation of directories as children TARGETDIR.
Bob Arnson committed
Apr 12, 2021 at 15:13 UTC
3f4bd928ab4c048792bf4c5c10004a1f22e8aa19
6 files changed
+61
-20
src/WixToolset.Core.WindowsInstaller/Decompile/Decompiler.cs
+13
-3
@@ -4352,7 +4352,7 @@ namespace WixToolset.Core.WindowsInstaller.Decompile
4352
4353
if (id == "TARGETDIR")
4354
{
4355
- // Skip TARGETDIR.
4355
+ // Skip TARGETDIR (but see below!).
4356
}
4357
else if (row.IsColumnNull(1) || WindowsInstallerStandard.IsStandardDirectory(id))
4358
{
@@ -4360,7 +4360,9 @@ namespace WixToolset.Core.WindowsInstaller.Decompile
4360
}
4361
else
4362
{
4363
- if (!this.TryGetIndexedElement("Directory", out var xParentDirectory, row.FieldAsString(1)))
4363
+ var parentDirectoryId = row.FieldAsString(1);
4364
+
4365
+ if (!this.TryGetIndexedElement("Directory", out var xParentDirectory, parentDirectoryId))
4366
{
4367
this.Messaging.Write(WarningMessages.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Directory_Parent", row.FieldAsString(1), "Directory"));
4368
}
@@ -4370,7 +4372,15 @@ namespace WixToolset.Core.WindowsInstaller.Decompile
4372
}
4373
else
4374
{
4373
- xParentDirectory.Add(xDirectory);
4375
+ // TARGETDIR is omitted but if this directory is a first-generation descendant, add it as a root.
4376
+ if (parentDirectoryId == "TARGETDIR")
4377
+ {
4378
+ this.RootElement.Add(xDirectory);
4379
+ }
4380
+ else
4381
+ {
4382
+ xParentDirectory.Add(xDirectory);
4383
+ }
4384
}
4385
}
4386
}
src/test/WixToolsetTest.CoreIntegration/DecompileFixture.cs
+6
-2
@@ -3,10 +3,8 @@
3
namespace WixToolsetTest.CoreIntegration
4
{
5
using System.IO;
6
- using System.Xml.Linq;
6
using WixBuildTools.TestSupport;
7
using WixToolset.Core.TestPackage;
9
- using WixToolset.Extensibility.Services;
8
using Xunit;
9
10
public class DecompileFixture
@@ -78,5 +76,11 @@ namespace WixToolsetTest.CoreIntegration
76
{
77
DecompileAndCompare(@"TestData\DecompileNullComponent", "example.msi", "Expected.wxs");
78
}
79
+
80
+ [Fact]
81
+ public void CanDecompileMergeModuleWithTargetDirComponent()
82
+ {
83
+ DecompileAndCompare(@"TestData\DecompileTargetDirMergeModule", "MergeModule1.msm", "Expected.wxs");
84
+ }
85
}
86
}
src/test/WixToolsetTest.CoreIntegration/ModuleFixture.cs
+11
-6
@@ -46,19 +46,23 @@ namespace WixToolsetTest.CoreIntegration
46
WixAssert.CompareLineByLine(new[]
47
{
48
"MergeRedirectFolder\tTARGETDIR\t.",
49
+ "NotTheMergeRedirectFolder\tTARGETDIR\t.",
50
"TARGETDIR\t\tSourceDir"
51
}, dirSymbols.Select(d => String.Join("\t", d.Id.Id, d.ParentDirectoryRef, d.Name)).ToArray());
52
52
- var fileSymbol = section.Symbols.OfType<FileSymbol>().Single();
53
- Assert.Equal("filyIq8rqcxxf903Hsn5K9L0SWV73g", fileSymbol.Id.Id);
54
- Assert.Equal(Path.Combine(folder, @"data\test.txt"), fileSymbol[FileSymbolFields.Source].AsPath().Path);
55
- Assert.Equal(@"test.txt", fileSymbol[FileSymbolFields.Source].PreviousValue.AsPath().Path);
53
+ var fileSymbols = section.Symbols.OfType<FileSymbol>().OrderBy(d => d.Id.Id).ToList();
54
+ WixAssert.CompareLineByLine(new[]
55
+ {
56
+ $"File1\t{Path.Combine(folder, @"data\test.txt")}\ttest.txt",
57
+ $"File2\t{Path.Combine(folder, @"data\test.txt")}\ttest.txt",
58
+ }, fileSymbols.Select(fileSymbol => String.Join("\t", fileSymbol.Id.Id, fileSymbol[FileSymbolFields.Source].AsPath().Path, fileSymbol[FileSymbolFields.Source].PreviousValue.AsPath().Path)).ToArray());
59
60
var data = WindowsInstallerData.Load(Path.Combine(intermediateFolder, @"bin\test.wixpdb"));
61
var fileRows = data.Tables["File"].Rows;
62
Assert.Equal(new[]
63
{
61
- "filyIq8rqcxxf903Hsn5K9L0SWV73g.243FB739_4D05_472F_9CFB_EF6B1017B6DE"
64
+ "File1.243FB739_4D05_472F_9CFB_EF6B1017B6DE",
65
+ "File2.243FB739_4D05_472F_9CFB_EF6B1017B6DE",
66
}, fileRows.Select(r => r.FieldAsString(0)).ToArray());
67
68
var cabPath = Path.Combine(intermediateFolder, "msm-test.cab");
@@ -66,7 +70,8 @@ namespace WixToolsetTest.CoreIntegration
70
var files = Query.GetCabinetFiles(cabPath);
71
Assert.Equal(new[]
72
{
69
- "filyIq8rqcxxf903Hsn5K9L0SWV73g.243FB739_4D05_472F_9CFB_EF6B1017B6DE"
73
+ "File1.243FB739_4D05_472F_9CFB_EF6B1017B6DE",
74
+ "File2.243FB739_4D05_472F_9CFB_EF6B1017B6DE",
75
}, files.Select(f => Path.Combine(f.Path, f.Name)).ToArray());
76
}
77
}
src/test/WixToolsetTest.CoreIntegration/TestData/DecompileTargetDirMergeModule/Expected.wxs
new
+18
@@ -0,0 +1,18 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3
+ <Module Id="MergeModule1" Language="1033" Version="1.0.0.0" InstallerVersion="200">
4
+ <Directory Id="MergeRedirectFolder">
5
+ <Component Id="ModuleComponent2" Guid="{BB222EE8-229B-4051-9443-49E348F0CC77}" Bitness="always32">
6
+ <File Id="File2" ShortName="sfmxqeab.wxs" Name="MergeModule.wxs" KeyPath="yes" Source="SourceDir\File\File2.F844F0E3_8CB4_4A0F_973E_31C4F9338382" />
7
+ </Component>
8
+ </Directory>
9
+ <StandardDirectory Id="ProgramFilesFolder">
10
+ <Directory Id="WixTestDir" ShortName="7bhhvaai" Name="WiX Toolset Test Directory">
11
+ <Component Id="ModuleComponent1" Guid="{D86EC5A2-9576-4699-BDC3-00586FF72CBE}" Bitness="always32">
12
+ <File Id="File1" ShortName="gahushls.wxs" Name="MergeModule.wxs" KeyPath="yes" Source="SourceDir\File\File1.F844F0E3_8CB4_4A0F_973E_31C4F9338382" />
13
+ </Component>
14
+ </Directory>
15
+ </StandardDirectory>
16
+ <SummaryInformation Description="MergeModule1" Manufacturer="WiX Toolset contributors" />
17
+ </Module>
18
+</Wix>
\ No newline at end of file
src/test/WixToolsetTest.CoreIntegration/TestData/DecompileTargetDirMergeModule/MergeModule1.msm
Binary files /dev/null and b/src/test/WixToolsetTest.CoreIntegration/TestData/DecompileTargetDirMergeModule/MergeModule1.msm differ
src/test/WixToolsetTest.CoreIntegration/TestData/SimpleModule/Module.wxs
+13
-9
@@ -1,13 +1,17 @@
1
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2
- <Module Id="MergeModule1" Language="1033" Version="1.0.0.0" Guid="243FB739-4D05-472F-9CFB-EF6B1017B6DE" InstallerVersion="200">
3
- <SummaryInformation Manufacturer="!(loc.Manufacturer)" />
2
+ <Module Id="MergeModule1" Language="1033" Version="1.0.0.0" Guid="243FB739-4D05-472F-9CFB-EF6B1017B6DE" InstallerVersion="200">
3
+ <SummaryInformation Manufacturer="!(loc.Manufacturer)" />
4
5
- <Directory Id="MergeRedirectFolder">
5
+ <Directory Id="MergeRedirectFolder">
6
+ <Component Id="ModuleComponent1" Guid="A04E61B2-3ED4-4803-B2EB-4B773576FA45">
7
+ <File Id="File1" Source="test.txt" />
8
+ </Component>
9
+ </Directory>
10
7
- <Component Id="ModuleComponent" Guid="A04E61B2-3ED4-4803-B2EB-4B773576FA45">
8
- <File Source="test.txt" />
9
- </Component>
10
-
11
- </Directory>
12
- </Module>
11
+ <Directory Id="NotTheMergeRedirectFolder">
12
+ <Component Id="ModuleComponent2" Guid="EADB3047-BD32-417B-AABF-B8D9CCDC22DA">
13
+ <File Id="File2" Source="test.txt" />
14
+ </Component>
15
+ </Directory>
16
+ </Module>
17
</Wix>