@joebigelow / wix-1 / commits / 3f4bd928

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>