From b500f7ae7113039c878555ec622d551854f891e2 Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Thu, 9 Feb 2023 21:59:19 -0800 Subject: Fix ParsePossibleKeyPathExtensionElement extension point to support more than registry Fixes 7208 --- src/wix/WixToolset.Core/Compiler.cs | 33 +++++++--- .../Example.Extension/ExampleCompilerExtension.cs | 72 ++++++++++++++++++++++ .../ExtensionFixture.cs | 60 ++++++++++++++++++ .../PackageWithFile.wxs | 27 ++++++++ .../PackageWithRegistry.wxs | 25 ++++++++ .../data/example.txt | 1 + 6 files changed, 211 insertions(+), 7 deletions(-) create mode 100644 src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtensionUsingPossibleKeyPath/PackageWithFile.wxs create mode 100644 src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtensionUsingPossibleKeyPath/PackageWithRegistry.wxs create mode 100644 src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtensionUsingPossibleKeyPath/data/example.txt diff --git a/src/wix/WixToolset.Core/Compiler.cs b/src/wix/WixToolset.Core/Compiler.cs index 4a501bc4..babde97d 100644 --- a/src/wix/WixToolset.Core/Compiler.cs +++ b/src/wix/WixToolset.Core/Compiler.cs @@ -2422,14 +2422,33 @@ namespace WixToolset.Core { keyPathSet = possibleKeyPath.Explicit ? YesNoType.Yes : YesNoType.NotSet; - if (!String.IsNullOrEmpty(possibleKeyPath.Id)) + switch (possibleKeyPath.Type) { - keyPossible = possibleKeyPath.Id; - } - - if (PossibleKeyPathType.Registry == possibleKeyPath.Type || PossibleKeyPathType.RegistryFormatted == possibleKeyPath.Type) - { - keyBit = ComponentKeyPathType.Registry; //MsiInterop.MsidbComponentAttributesRegistryKeyPath; + case PossibleKeyPathType.File: + keyBit = ComponentKeyPathType.File; + keyPossible = possibleKeyPath.Id; + break; + case PossibleKeyPathType.Directory: + keyBit = ComponentKeyPathType.Directory; + keyPossible = String.Empty; + break; + + case PossibleKeyPathType.OdbcDataSource: + keyBit = ComponentKeyPathType.OdbcDataSource; + keyPossible = possibleKeyPath.Id; + break; + + case PossibleKeyPathType.Registry: + case PossibleKeyPathType.RegistryFormatted: + keyBit = ComponentKeyPathType.Registry; + keyPossible = possibleKeyPath.Id; + break; + + case PossibleKeyPathType.None: + default: + keyBit = null; + keyPossible = null; + break; } } } diff --git a/src/wix/test/Example.Extension/ExampleCompilerExtension.cs b/src/wix/test/Example.Extension/ExampleCompilerExtension.cs index b68a87f1..bf6deb6e 100644 --- a/src/wix/test/Example.Extension/ExampleCompilerExtension.cs +++ b/src/wix/test/Example.Extension/ExampleCompilerExtension.cs @@ -7,6 +7,7 @@ namespace Example.Extension using System.Xml.Linq; using WixToolset.Data; using WixToolset.Extensibility; + using WixToolset.Extensibility.Data; internal class ExampleCompilerExtension : BaseCompilerExtension { @@ -57,6 +58,24 @@ namespace Example.Extension } } + public override IComponentKeyPath ParsePossibleKeyPathElement(Intermediate intermediate, IntermediateSection section, XElement parentElement, XElement element, IDictionary context) + { + switch (parentElement.Name.LocalName) + { + case "Component": + var componentId = context["ComponentId"]; + + switch (element.Name.LocalName) + { + case "ExampleSetKeyPath": + return this.ParseExampleSetKeyPathElement(intermediate, section, element, componentId); + } + break; + } + + return base.ParsePossibleKeyPathElement(intermediate, section, parentElement, element, context); + } + private void ParseExampleElement(Intermediate intermediate, IntermediateSection section, XElement element, string componentId) { var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element); @@ -101,6 +120,59 @@ namespace Example.Extension } } + private IComponentKeyPath ParseExampleSetKeyPathElement(Intermediate intermediate, IntermediateSection section, XElement element, string componentId) + { + var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element); + string file = null; + string reg = null; + var explicitly = false; + + foreach (var attrib in element.Attributes()) + { + if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) + { + switch (attrib.Name.LocalName) + { + case "File": + file = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); + break; + + case "Registry": + reg = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); + break; + + case "Explicitly": + explicitly = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) == YesNoType.Yes; + break; + + default: + this.ParseHelper.UnexpectedAttribute(element, attrib); + break; + } + } + else + { + this.ParseAttribute(intermediate, section, element, attrib, null); + } + } + + if (file == null && reg == null) + { + this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "File", "Registry", true)); + } + + if (!this.Messaging.EncounteredError) + { + var componentKeyPath = this.CreateComponentKeyPath(); + componentKeyPath.Id = file ?? reg; + componentKeyPath.Explicit = explicitly; + componentKeyPath.Type = String.IsNullOrEmpty(file) ? PossibleKeyPathType.Registry : PossibleKeyPathType.File; + return componentKeyPath; + } + + return null; + } + private void ParseExampleEnsureTableElement(Intermediate intermediate, IntermediateSection section, XElement element) { var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element); diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/ExtensionFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/ExtensionFixture.cs index 7cfd4999..710f3b8d 100644 --- a/src/wix/test/WixToolsetTest.CoreIntegration/ExtensionFixture.cs +++ b/src/wix/test/WixToolsetTest.CoreIntegration/ExtensionFixture.cs @@ -96,6 +96,66 @@ namespace WixToolsetTest.CoreIntegration } } + [Fact] + public void CanBuildWithExampleExtensionWithFilePossibleKeyPath() + { + var folder = TestData.Get("TestData", "ExampleExtensionUsingPossibleKeyPath"); + + using (var fs = new DisposableFileSystem()) + { + var intermediateFolder = fs.GetFolder(); + + var result = WixRunner.Execute(new[] + { + "build", + Path.Combine(folder, "PackageWithFile.wxs"), + "-ext", ExtensionPaths.ExampleExtensionPath, + "-bindpath", Path.Combine(folder, "data"), + "-intermediateFolder", intermediateFolder, + "-o", Path.Combine(intermediateFolder, "bin", "extest.msi") + }); + + result.AssertSuccess(); + + var intermediate = Intermediate.Load(Path.Combine(intermediateFolder, "bin", "extest.wixpdb")); + var section = intermediate.Sections.Single(); + + var componentSymbol = section.Symbols.OfType().Single(); + Assert.Equal("ExampleFile", componentSymbol.KeyPath); + Assert.Equal(ComponentKeyPathType.File, componentSymbol.KeyPathType); + } + } + + [Fact] + public void CanBuildWithExampleExtensionWithRegistryPossibleKeyPath() + { + var folder = TestData.Get("TestData", "ExampleExtensionUsingPossibleKeyPath"); + + using (var fs = new DisposableFileSystem()) + { + var intermediateFolder = fs.GetFolder(); + + var result = WixRunner.Execute(new[] + { + "build", + Path.Combine(folder, "PackageWithRegistry.wxs"), + "-ext", ExtensionPaths.ExampleExtensionPath, + "-bindpath", Path.Combine(folder, "data"), + "-intermediateFolder", intermediateFolder, + "-o", Path.Combine(intermediateFolder, "bin", "extest.msi") + }); + + result.AssertSuccess(); + + var intermediate = Intermediate.Load(Path.Combine(intermediateFolder, "bin", "extest.wixpdb")); + var section = intermediate.Sections.Single(); + + var componentSymbol = section.Symbols.OfType().Single(); + Assert.Equal("RegMadeKeyPath", componentSymbol.KeyPath); + Assert.Equal(ComponentKeyPathType.Registry, componentSymbol.KeyPathType); + } + } + [Fact] public void CanParseCommandLineWithExtension() { diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtensionUsingPossibleKeyPath/PackageWithFile.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtensionUsingPossibleKeyPath/PackageWithFile.wxs new file mode 100644 index 00000000..ef5d466d --- /dev/null +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtensionUsingPossibleKeyPath/PackageWithFile.wxs @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtensionUsingPossibleKeyPath/PackageWithRegistry.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtensionUsingPossibleKeyPath/PackageWithRegistry.wxs new file mode 100644 index 00000000..fa8c337d --- /dev/null +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtensionUsingPossibleKeyPath/PackageWithRegistry.wxs @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtensionUsingPossibleKeyPath/data/example.txt b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtensionUsingPossibleKeyPath/data/example.txt new file mode 100644 index 00000000..1c2bc9dc --- /dev/null +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtensionUsingPossibleKeyPath/data/example.txt @@ -0,0 +1 @@ +This is example.txt. -- cgit v1.2.3-55-g6feb