From fb0a8b74b598331dcf037d97a3adf89f5fe5ba92 Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Tue, 6 Dec 2022 15:55:18 -0800 Subject: Correctly harvest registry files with multisz Fixes 7044 --- src/tools/heat/RegFileHarvester.cs | 2 +- src/tools/heat/RegistryHarvester.cs | 4 +- src/tools/heat/Serialize/wix.cs | 24 ++--- src/tools/heat/UtilFinalizeHarvesterMutator.cs | 4 +- src/tools/heat/UtilMutator.cs | 2 +- src/tools/test/WixToolsetTest.Heat/HeatFixture.cs | 111 ++++++++++++++++++--- .../TestData/RegFile/Expected.wxs | 51 ++++++++++ .../RegFile/ExpectedWithComponentGroup.wxs | 54 ++++++++++ .../WixToolsetTest.Heat/TestData/RegFile/input.reg | 41 ++++++++ .../TestData/RegFile/input.xslt | 23 +++++ 10 files changed, 286 insertions(+), 30 deletions(-) create mode 100644 src/tools/test/WixToolsetTest.Heat/TestData/RegFile/Expected.wxs create mode 100644 src/tools/test/WixToolsetTest.Heat/TestData/RegFile/ExpectedWithComponentGroup.wxs create mode 100644 src/tools/test/WixToolsetTest.Heat/TestData/RegFile/input.reg create mode 100644 src/tools/test/WixToolsetTest.Heat/TestData/RegFile/input.xslt diff --git a/src/tools/heat/RegFileHarvester.cs b/src/tools/heat/RegFileHarvester.cs index fcb4a9c2..49cf4c01 100644 --- a/src/tools/heat/RegFileHarvester.cs +++ b/src/tools/heat/RegFileHarvester.cs @@ -200,7 +200,7 @@ namespace WixToolset.Harvesters foreach (string part in parts) { Wix.MultiStringValue multiStringValue = new Wix.MultiStringValue(); - multiStringValue.Content = part; + multiStringValue.Value = part; registryValue.AddChild(multiStringValue); } diff --git a/src/tools/heat/RegistryHarvester.cs b/src/tools/heat/RegistryHarvester.cs index 0dfd3a29..71dd3962 100644 --- a/src/tools/heat/RegistryHarvester.cs +++ b/src/tools/heat/RegistryHarvester.cs @@ -295,7 +295,7 @@ namespace WixToolset.Harvesters { Wix.MultiStringValue multiStringValue = new Wix.MultiStringValue(); - multiStringValue.Content = String.Empty; + multiStringValue.Value = String.Empty; registryValue.AddChild(multiStringValue); } @@ -305,7 +305,7 @@ namespace WixToolset.Harvesters { Wix.MultiStringValue multiStringValue = new Wix.MultiStringValue(); - multiStringValue.Content = multiStringValueContent; + multiStringValue.Value = multiStringValueContent; registryValue.AddChild(multiStringValue); } diff --git a/src/tools/heat/Serialize/wix.cs b/src/tools/heat/Serialize/wix.cs index a3d9b33b..cb62079d 100644 --- a/src/tools/heat/Serialize/wix.cs +++ b/src/tools/heat/Serialize/wix.cs @@ -27422,9 +27422,9 @@ namespace WixToolset.Harvesters.Serialize private ISchemaElement parentElement; - private string contentField; + private string valueField; - private bool contentFieldSet; + private bool valueFieldSet; public virtual ISchemaElement ParentElement { @@ -27441,18 +27441,18 @@ namespace WixToolset.Harvesters.Serialize /// /// Use several of these elements to specify each registry value in a multiString registry value. This element /// cannot be used if the Value attribute is specified unless the Type attribute is set to 'multiString'. The - /// values should go in the text area of the MultiStringValue element. + /// values should go in the Value attribute of the MultiStringValue element. /// - public string Content + public string Value { get { - return this.contentField; + return this.valueField; } set { - this.contentFieldSet = true; - this.contentField = value; + this.valueFieldSet = true; + this.valueField = value; } } @@ -27463,10 +27463,10 @@ namespace WixToolset.Harvesters.Serialize { throw new ArgumentNullException("name"); } - if (("Content" == name)) + if (("Value" == name)) { - this.contentField = value; - this.contentFieldSet = true; + this.valueField = value; + this.valueFieldSet = true; } } @@ -27480,9 +27480,9 @@ namespace WixToolset.Harvesters.Serialize throw new ArgumentNullException("writer"); } writer.WriteStartElement("MultiStringValue", "http://wixtoolset.org/schemas/v4/wxs"); - if (this.contentFieldSet) + if (this.valueFieldSet) { - writer.WriteString(this.contentField); + writer.WriteAttributeString("Value", this.valueField); } writer.WriteEndElement(); } diff --git a/src/tools/heat/UtilFinalizeHarvesterMutator.cs b/src/tools/heat/UtilFinalizeHarvesterMutator.cs index 5af56e89..61bb8731 100644 --- a/src/tools/heat/UtilFinalizeHarvesterMutator.cs +++ b/src/tools/heat/UtilFinalizeHarvesterMutator.cs @@ -1076,9 +1076,9 @@ namespace WixToolset.Harvesters foreach (Wix.MultiStringValue multiStringValue in registryValue.Children) { // first replace file paths with their MSI tokens - multiStringValue.Content = this.MutateRegistryString(multiStringValue.Content, (ICollection)this.filePaths); + multiStringValue.Value = this.MutateRegistryString(multiStringValue.Value, (ICollection)this.filePaths); // next replace directory paths with their MSI tokens - multiStringValue.Content = this.MutateRegistryString(multiStringValue.Content, (ICollection)reversedDirectoryPaths); + multiStringValue.Value = this.MutateRegistryString(multiStringValue.Value, (ICollection)reversedDirectoryPaths); } } else diff --git a/src/tools/heat/UtilMutator.cs b/src/tools/heat/UtilMutator.cs index 287f5f5e..80fd470c 100644 --- a/src/tools/heat/UtilMutator.cs +++ b/src/tools/heat/UtilMutator.cs @@ -246,7 +246,7 @@ namespace WixToolset.Harvesters c.Directory = parentDirectory.Id; parentDirectory.RemoveChild(c); } - else if (c.ParentElement is Wix.DirectoryRef) + else if (c.ParentElement is Wix.DirectoryRef || c.ParentElement is Wix.StandardDirectory) { var parentDirectory = c.ParentElement as Wix.DirectoryBase; diff --git a/src/tools/test/WixToolsetTest.Heat/HeatFixture.cs b/src/tools/test/WixToolsetTest.Heat/HeatFixture.cs index 388d4dc0..d517e209 100644 --- a/src/tools/test/WixToolsetTest.Heat/HeatFixture.cs +++ b/src/tools/test/WixToolsetTest.Heat/HeatFixture.cs @@ -30,7 +30,6 @@ namespace WixToolsetTest.Heat var wxs = File.ReadAllLines(outputPath).Select(s => s.Replace("\"", "'")).ToArray(); WixAssert.CompareLineByLine(new[] { - "", "", " ", " ", @@ -50,7 +49,7 @@ namespace WixToolsetTest.Heat } [Fact] - public void CanHarvestSimpleDirectoryToInstallFolder() + public void CanHarvestSimpleDirectoryToComponentGroup() { var folder = TestData.Get("TestData", "SingleFile"); @@ -61,7 +60,7 @@ namespace WixToolsetTest.Heat var args = new[] { "dir", folder, - "-dr", "INSTALLFOLDER", + "-cg", "CG1", "-o", outputPath }; @@ -71,25 +70,65 @@ namespace WixToolsetTest.Heat var wxs = File.ReadAllLines(outputPath).Select(s => s.Replace("\"", "'")).ToArray(); WixAssert.CompareLineByLine(new[] { - "", "", " ", - " ", - " ", - " ", + " ", + " ", + " ", " ", " ", - " ", - " ", - " ", + " ", + " ", + " ", " ", - " ", + " ", " ", "", }, wxs); } } + [Fact] + public void CanHarvestSimpleDirectoryToInstallFolder() + { + var folder = TestData.Get("TestData", "SingleFile"); + + using (var fs = new DisposableFileSystem()) + { + var outputPath = Path.Combine(fs.GetFolder(), "out.wxs"); + + var args = new[] + { + "dir", folder, + "-dr", "INSTALLFOLDER", + "-indent", "2", + "-o", outputPath + }; + + var result = HeatRunner.Execute(args); + result.AssertSuccess(); + + var wxs = File.ReadAllLines(outputPath).Select(s => s.Replace("\"", "'")).ToArray(); + WixAssert.CompareLineByLine(new[] + { + "", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "", + }, wxs); + } + } + [Fact] public void CanHarvestFile() { @@ -114,7 +153,6 @@ namespace WixToolsetTest.Heat var wxs = File.ReadAllLines(outputPath).Select(s => s.Replace("\"", "'")).ToArray(); WixAssert.CompareLineByLine(new[] { - "", "", " ", " ", @@ -132,5 +170,54 @@ namespace WixToolsetTest.Heat }, wxs); } } + + [Fact] + public void CanHarvestRegistry() + { + var folder = TestData.Get("TestData", "RegFile"); + + using (var fs = new DisposableFileSystem()) + { + var outputPath = Path.Combine(fs.GetFolder(), "out.wxs"); + + var args = new[] + { + "reg", Path.Combine(folder, "input.reg"), + "-o", outputPath + }; + + var result = HeatRunner.Execute(args); + result.AssertSuccess(); + + var actual = File.ReadAllLines(outputPath).Select(s => s.Replace("\"", "'")).ToArray(); + var expected = File.ReadAllLines(Path.Combine(folder, "Expected.wxs")).Select(s => s.Replace("\"", "'")).ToArray(); + WixAssert.CompareLineByLine(expected, actual); + } + } + + [Fact] + public void CanHarvestRegistryIntoComponentGroup() + { + var folder = TestData.Get("TestData", "RegFile"); + + using (var fs = new DisposableFileSystem()) + { + var outputPath = Path.Combine(fs.GetFolder(), "out.wxs"); + + var args = new[] + { + "reg", Path.Combine(folder, "input.reg"), + "-cg", "CG1", + "-o", outputPath + }; + + var result = HeatRunner.Execute(args); + result.AssertSuccess(); + + var actual = File.ReadAllLines(outputPath).Select(s => s.Replace("\"", "'")).ToArray(); + var expected = File.ReadAllLines(Path.Combine(folder, "ExpectedWithComponentGroup.wxs")).Select(s => s.Replace("\"", "'")).ToArray(); + WixAssert.CompareLineByLine(expected, actual); + } + } } } diff --git a/src/tools/test/WixToolsetTest.Heat/TestData/RegFile/Expected.wxs b/src/tools/test/WixToolsetTest.Heat/TestData/RegFile/Expected.wxs new file mode 100644 index 00000000..2bc48bca --- /dev/null +++ b/src/tools/test/WixToolsetTest.Heat/TestData/RegFile/Expected.wxs @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/tools/test/WixToolsetTest.Heat/TestData/RegFile/ExpectedWithComponentGroup.wxs b/src/tools/test/WixToolsetTest.Heat/TestData/RegFile/ExpectedWithComponentGroup.wxs new file mode 100644 index 00000000..bb94a265 --- /dev/null +++ b/src/tools/test/WixToolsetTest.Heat/TestData/RegFile/ExpectedWithComponentGroup.wxs @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/tools/test/WixToolsetTest.Heat/TestData/RegFile/input.reg b/src/tools/test/WixToolsetTest.Heat/TestData/RegFile/input.reg new file mode 100644 index 00000000..85ebe01e --- /dev/null +++ b/src/tools/test/WixToolsetTest.Heat/TestData/RegFile/input.reg @@ -0,0 +1,41 @@ +Windows Registry Editor Version 5.00 + +[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Apache Software Foundation\Procrun 2.0\service.jvm.web] + +[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Apache Software Foundation\Procrun 2.0\service.jvm.web\Parameters] + +[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Apache Software Foundation\Procrun 2.0\service.jvm.web\Parameters\Java] +"Options"=hex(7):2d,00,44,00,64,00,61,00,65,00,6d,00,6f,00,6e,00,2e,00,63,00,\ + 6c,00,6f,00,6a,00,75,00,72,00,65,00,2e,00,6e,00,73,00,3d,00,70,00,61,00,6e,\ + 00,74,00,68,00,65,00,72,00,2e,00,77,00,61,00,73,00,2e,00,77,00,65,00,62,00,\ + 2e,00,64,00,61,00,65,00,6d,00,6f,00,6e,00,00,00,00,00 +"Options9"=hex(7):2d,00,2d,00,61,00,64,00,64,00,2d,00,6d,00,6f,00,64,00,75,00,\ + 6c,00,65,00,73,00,3d,00,6a,00,61,00,76,00,61,00,2e,00,63,00,6f,00,72,00,62,\ + 00,61,00,00,00,00,00 +"Classpath"="%WAS_DEPS_CLASSPATH%\*;%ServiceBasePath%\Sensors\service.jvm.web-standalone.jar" +"JvmMx"=dword:00001000 + +[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Apache Software Foundation\Procrun 2.0\service.jvm.web\Parameters\Log] +"Prefix"="service.jvm.web" + +[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Apache Software Foundation\Procrun 2.0\service.jvm.web\Parameters\Start] +"Class"="service.was.webDaemon" +"Params"=hex(7):2d,00,2d,00,73,00,74,00,6f,00,72,00,65,00,2d,00,70,00,61,00,74,\ + 00,68,00,00,00,22,00,25,00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,44,00,\ + 61,00,74,00,61,00,25,00,5c,00,73,00,6f,00,66,00,74,00,65,00,6b,00,5c,00,70,\ + 00,61,00,6e,00,74,00,68,00,65,00,72,00,5c,00,70,00,61,00,6e,00,74,00,68,00,\ + 65,00,72,00,2e,00,77,00,61,00,73,00,2e,00,77,00,65,00,62,00,5c,00,73,00,74,\ + 00,6f,00,72,00,65,00,2e,00,6a,00,6b,00,73,00,22,00,00,00,00,00 +"Method"="startWindows" +"Mode"="jvm" + +[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Apache Software Foundation\Procrun 2.0\service.jvm.web\Parameters\Stop] +"Class"="service.was.webDaemon" +"Method"="stopWindows" +"Mode"="jvm" +"Timeout"=dword:000009c4 + + + +[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\service.jvm.web\Parameters] + diff --git a/src/tools/test/WixToolsetTest.Heat/TestData/RegFile/input.xslt b/src/tools/test/WixToolsetTest.Heat/TestData/RegFile/input.xslt new file mode 100644 index 00000000..7a46243a --- /dev/null +++ b/src/tools/test/WixToolsetTest.Heat/TestData/RegFile/input.xslt @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + %WAS_DEPS_CLASSPATH%\*;[DIR_JVM]service.jvm.web-standalone.jar + + + + -- cgit v1.2.3-55-g6feb