From a1307cd4e76a89598c53cb68309358a7012db553 Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Fri, 9 Sep 2022 16:03:29 -0500 Subject: Move `Bundle/@CommandLineVariables` into Bal.wixext. Implements 6858 --- .../test/WixToolsetTest.Bal/BalExtensionFixture.cs | 9 +++- .../TestData/Overridable/Bundle.wxs | 2 +- .../TestData/Overridable/WrongCaseBundle.wxs | 3 +- src/ext/Bal/wixext/BalBurnBackendExtension.cs | 40 ++++++++++++++-- src/ext/Bal/wixext/BalCompiler.cs | 36 +++++++++++++++ src/ext/Bal/wixext/BalErrors.cs | 12 +++-- src/ext/Bal/wixext/Symbols/BalSymbolDefinitions.cs | 5 ++ .../wixext/Symbols/WixStdbaCommandLineSymbol.cs | 54 ++++++++++++++++++++++ 8 files changed, 150 insertions(+), 11 deletions(-) create mode 100644 src/ext/Bal/wixext/Symbols/WixStdbaCommandLineSymbol.cs (limited to 'src/ext') diff --git a/src/ext/Bal/test/WixToolsetTest.Bal/BalExtensionFixture.cs b/src/ext/Bal/test/WixToolsetTest.Bal/BalExtensionFixture.cs index 79e96316..63b9b4a8 100644 --- a/src/ext/Bal/test/WixToolsetTest.Bal/BalExtensionFixture.cs +++ b/src/ext/Bal/test/WixToolsetTest.Bal/BalExtensionFixture.cs @@ -78,6 +78,12 @@ namespace WixToolsetTest.Bal var extractResult = BundleExtractor.ExtractBAContainer(null, bundleFile, baFolderPath, extractFolderPath); extractResult.AssertSuccess(); + var balCommandLines = extractResult.GetBADataTestXmlLines("/ba:BootstrapperApplicationData/ba:WixStdbaCommandLine"); + WixAssert.CompareLineByLine(new[] + { + "", + }, balCommandLines); + var balOverridableVariables = extractResult.GetBADataTestXmlLines("/ba:BootstrapperApplicationData/ba:WixStdbaOverridableVariable"); WixAssert.CompareLineByLine(new[] { @@ -209,8 +215,9 @@ namespace WixToolsetTest.Bal WixAssert.CompareLineByLine(new[] { "bal:Condition/@Condition contains the built-in Variable 'WixBundleAction', which is not available when it is evaluated. (Unavailable Variables are: 'WixBundleAction'.). Rewrite the condition to avoid Variables that are never valid during its evaluation.", - "Overridable variable 'Test1' must be 'TEST1' with Bundle/@CommandLineVariables value 'upperCase'.", + "Overridable variable 'TEST1' collides with 'Test1' with Bundle/@CommandLineVariables value 'caseInsensitive'.", "The *Package/@bal:DisplayInternalUICondition attribute's value '=' is not a valid bundle condition.", + "The location of the Variable related to the previous error.", }, messages.ToArray()); } } diff --git a/src/ext/Bal/test/WixToolsetTest.Bal/TestData/Overridable/Bundle.wxs b/src/ext/Bal/test/WixToolsetTest.Bal/TestData/Overridable/Bundle.wxs index 83e0d5b0..1274826f 100644 --- a/src/ext/Bal/test/WixToolsetTest.Bal/TestData/Overridable/Bundle.wxs +++ b/src/ext/Bal/test/WixToolsetTest.Bal/TestData/Overridable/Bundle.wxs @@ -1,7 +1,7 @@ - + diff --git a/src/ext/Bal/test/WixToolsetTest.Bal/TestData/Overridable/WrongCaseBundle.wxs b/src/ext/Bal/test/WixToolsetTest.Bal/TestData/Overridable/WrongCaseBundle.wxs index 547af644..67dfc589 100644 --- a/src/ext/Bal/test/WixToolsetTest.Bal/TestData/Overridable/WrongCaseBundle.wxs +++ b/src/ext/Bal/test/WixToolsetTest.Bal/TestData/Overridable/WrongCaseBundle.wxs @@ -1,11 +1,12 @@ - + + diff --git a/src/ext/Bal/wixext/BalBurnBackendExtension.cs b/src/ext/Bal/wixext/BalBurnBackendExtension.cs index 6f615796..a27ff739 100644 --- a/src/ext/Bal/wixext/BalBurnBackendExtension.cs +++ b/src/ext/Bal/wixext/BalBurnBackendExtension.cs @@ -24,6 +24,7 @@ namespace WixToolset.Bal BalSymbolDefinitions.WixBalPackageInfo, BalSymbolDefinitions.WixDncOptions, BalSymbolDefinitions.WixMbaPrereqInformation, + BalSymbolDefinitions.WixStdbaCommandLine, BalSymbolDefinitions.WixStdbaOptions, BalSymbolDefinitions.WixStdbaOverridableVariable, BalSymbolDefinitions.WixMbaPrereqOptions, @@ -61,6 +62,30 @@ namespace WixToolset.Bal return true; } + else if (symbol is WixStdbaCommandLineSymbol stdbaCommandLineSymbol) + { + var sb = new StringBuilder(); + using (var writer = XmlWriter.Create(sb)) + { + writer.WriteStartElement(symbol.Definition.Name, BurnConstants.BootstrapperApplicationDataNamespace); + + switch (stdbaCommandLineSymbol.VariableType) + { + case WixStdbaCommandLineVariableType.CaseInsensitive: + writer.WriteAttributeString("VariableType", "caseInsensitive"); + break; + default: + writer.WriteAttributeString("VariableType", "caseSensitive"); + break; + } + + writer.WriteEndElement(); + } + + this.BackendHelper.AddBootstrapperApplicationData(sb.ToString()); + + return true; + } else { return base.TryProcessSymbol(section, symbol); @@ -418,19 +443,24 @@ namespace WixToolset.Bal private void VerifyOverridableVariables(IntermediateSection section) { - var bundleSymbol = section.Symbols.OfType().Single(); - if (bundleSymbol.CommandLineVariables != WixBundleCommandLineVariables.UpperCase) + var commandLineSymbol = section.Symbols.OfType().SingleOrDefault(); + if (commandLineSymbol?.VariableType != WixStdbaCommandLineVariableType.CaseInsensitive) { return; } var overridableVariableSymbols = section.Symbols.OfType().ToList(); + var overridableVariables = new Dictionary(StringComparer.InvariantCultureIgnoreCase); foreach (var overridableVariableSymbol in overridableVariableSymbols) { - var upperName = overridableVariableSymbol.Name.ToUpperInvariant(); - if (upperName != overridableVariableSymbol.Name) + if (!overridableVariables.TryGetValue(overridableVariableSymbol.Name, out var collisionVariableSymbol)) + { + overridableVariables.Add(overridableVariableSymbol.Name, overridableVariableSymbol); + } + else { - this.Messaging.Write(BalErrors.NonUpperCaseOverridableVariable(overridableVariableSymbol.SourceLineNumbers, overridableVariableSymbol.Name, upperName)); + this.Messaging.Write(BalErrors.OverridableVariableCollision(overridableVariableSymbol.SourceLineNumbers, overridableVariableSymbol.Name, collisionVariableSymbol.Name)); + this.Messaging.Write(BalErrors.OverridableVariableCollision2(collisionVariableSymbol.SourceLineNumbers)); } } } diff --git a/src/ext/Bal/wixext/BalCompiler.cs b/src/ext/Bal/wixext/BalCompiler.cs index bc2ba861..bd2fb4a2 100644 --- a/src/ext/Bal/wixext/BalCompiler.cs +++ b/src/ext/Bal/wixext/BalCompiler.cs @@ -119,6 +119,42 @@ namespace WixToolset.Bal switch (parentElement.Name.LocalName) { + case "Bundle": + switch (attribute.Name.LocalName) + { + case "CommandLineVariables": + WixStdbaCommandLineVariableType? variableType = null; + + var commandLineVariablesValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attribute); + switch (commandLineVariablesValue) + { + case "caseInsensitive": + variableType = WixStdbaCommandLineVariableType.CaseInsensitive; + break; + case "caseSensitive": + variableType = WixStdbaCommandLineVariableType.CaseSensitive; + break; + default: + this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, parentElement.Name.LocalName, attribute.Name.LocalName, commandLineVariablesValue, "caseInsensitive", "caseSensitive")); + break; + } + + if (variableType.HasValue) + { + // There can only be one. + var id = new Identifier(AccessModifier.Global, "WixStdbaCommandLineVariableType"); + section.AddSymbol(new WixStdbaCommandLineSymbol(sourceLineNumbers, id) + { + VariableType = variableType.Value, + }); + } + + break; + default: + this.ParseHelper.UnexpectedAttribute(parentElement, attribute); + break; + } + break; case "BundlePackage": case "ExePackage": case "MsiPackage": diff --git a/src/ext/Bal/wixext/BalErrors.cs b/src/ext/Bal/wixext/BalErrors.cs index a7a00a4b..cc4c6d41 100644 --- a/src/ext/Bal/wixext/BalErrors.cs +++ b/src/ext/Bal/wixext/BalErrors.cs @@ -78,9 +78,14 @@ namespace WixToolset.Bal return Message(sourceLineNumbers, Ids.MultiplePrimaryPackageType2, "The location of the package related to the previous error."); } - public static Message NonUpperCaseOverridableVariable(SourceLineNumber sourceLineNumbers, string name, string expectedName) + public static Message OverridableVariableCollision(SourceLineNumber sourceLineNumbers, string name, string collisionName) { - return Message(sourceLineNumbers, Ids.NonUpperCaseOverridableVariable, "Overridable variable '{0}' must be '{1}' with Bundle/@CommandLineVariables value 'upperCase'.", name, expectedName); + return Message(sourceLineNumbers, Ids.OverridableVariableCollision, "Overridable variable '{0}' collides with '{1}' with Bundle/@CommandLineVariables value 'caseInsensitive'.", name, collisionName); + } + + public static Message OverridableVariableCollision2(SourceLineNumber sourceLineNumbers) + { + return Message(sourceLineNumbers, Ids.OverridableVariableCollision2, "The location of the Variable related to the previous error."); } private static Message Message(SourceLineNumber sourceLineNumber, Ids id, string format, params object[] args) @@ -101,7 +106,6 @@ namespace WixToolset.Bal MultipleBAFunctions = 6804, BAFunctionsPayloadRequiredInUXContainer = 6805, MissingDNCPrereq = 6806, - NonUpperCaseOverridableVariable = 6807, MissingIUIPrimaryPackage = 6808, MultiplePrimaryPackageType = 6809, MultiplePrimaryPackageType2 = 6810, @@ -110,6 +114,8 @@ namespace WixToolset.Bal IuibaPermanentPrimaryPackageType = 6813, IuibaNonMsiPrimaryPackage = 6814, IuibaPrimaryPackageEnableFeatureSelection = 6815, + OverridableVariableCollision = 6816, + OverridableVariableCollision2 = 6817, } } } diff --git a/src/ext/Bal/wixext/Symbols/BalSymbolDefinitions.cs b/src/ext/Bal/wixext/Symbols/BalSymbolDefinitions.cs index 9010ce2d..22375508 100644 --- a/src/ext/Bal/wixext/Symbols/BalSymbolDefinitions.cs +++ b/src/ext/Bal/wixext/Symbols/BalSymbolDefinitions.cs @@ -14,6 +14,7 @@ namespace WixToolset.Bal WixBalPackageInfo, WixDncOptions, WixMbaPrereqInformation, + WixStdbaCommandLine, WixStdbaOptions, WixStdbaOverridableVariable, WixMbaPrereqOptions, @@ -55,6 +56,9 @@ namespace WixToolset.Bal case BalSymbolDefinitionType.WixMbaPrereqInformation: return BalSymbolDefinitions.WixMbaPrereqInformation; + case BalSymbolDefinitionType.WixStdbaCommandLine: + return BalSymbolDefinitions.WixStdbaCommandLine; + case BalSymbolDefinitionType.WixStdbaOptions: return BalSymbolDefinitions.WixStdbaOptions; @@ -77,6 +81,7 @@ namespace WixToolset.Bal WixBalPackageInfo.AddTag(BurnConstants.BootstrapperApplicationDataSymbolDefinitionTag); WixDncOptions.AddTag(BurnConstants.BootstrapperApplicationDataSymbolDefinitionTag); WixMbaPrereqInformation.AddTag(BurnConstants.BootstrapperApplicationDataSymbolDefinitionTag); + WixStdbaCommandLine.AddTag(BurnConstants.BootstrapperApplicationDataSymbolDefinitionTag); WixStdbaOptions.AddTag(BurnConstants.BootstrapperApplicationDataSymbolDefinitionTag); WixStdbaOverridableVariable.AddTag(BurnConstants.BootstrapperApplicationDataSymbolDefinitionTag); WixMbaPrereqOptions.AddTag(BurnConstants.BootstrapperApplicationDataSymbolDefinitionTag); diff --git a/src/ext/Bal/wixext/Symbols/WixStdbaCommandLineSymbol.cs b/src/ext/Bal/wixext/Symbols/WixStdbaCommandLineSymbol.cs new file mode 100644 index 00000000..3b3823f3 --- /dev/null +++ b/src/ext/Bal/wixext/Symbols/WixStdbaCommandLineSymbol.cs @@ -0,0 +1,54 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. + +namespace WixToolset.Bal +{ + using WixToolset.Data; + using WixToolset.Bal.Symbols; + + public static partial class BalSymbolDefinitions + { + public static readonly IntermediateSymbolDefinition WixStdbaCommandLine = new IntermediateSymbolDefinition( + BalSymbolDefinitionType.WixStdbaCommandLine.ToString(), + new[] + { + new IntermediateFieldDefinition(nameof(WixStdbaCommandLineSymbolFields.VariableType), IntermediateFieldType.Number), + }, + typeof(WixStdbaCommandLineSymbol)); + } +} + +namespace WixToolset.Bal.Symbols +{ + using System; + using WixToolset.Data; + + public enum WixStdbaCommandLineSymbolFields + { + VariableType, + } + + public enum WixStdbaCommandLineVariableType + { + CaseSensitive, + CaseInsensitive, + } + + public class WixStdbaCommandLineSymbol : IntermediateSymbol + { + public WixStdbaCommandLineSymbol() : base(BalSymbolDefinitions.WixStdbaCommandLine, null, null) + { + } + + public WixStdbaCommandLineSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(BalSymbolDefinitions.WixStdbaCommandLine, sourceLineNumber, id) + { + } + + public IntermediateField this[WixStdbaCommandLineSymbolFields index] => this.Fields[(int)index]; + + public WixStdbaCommandLineVariableType VariableType + { + get => (WixStdbaCommandLineVariableType)this.Fields[(int)WixStdbaCommandLineSymbolFields.VariableType].AsNumber(); + set => this.Set((int)WixStdbaCommandLineSymbolFields.VariableType, (int)value); + } + } +} -- cgit v1.2.3-55-g6feb