From 9bdf3730cd43e1af8a4ea9be6cf2fba77fcff2d2 Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Thu, 1 Jul 2021 09:30:10 -0500 Subject: Add bundle option for command line variables to always be uppercase. Fixes #3777 --- .../WixToolset.Mba.Core/IOverridableVariables.cs | 20 +++++++++++++++ src/api/burn/WixToolset.Mba.Core/MbaCommand.cs | 6 +++-- .../WixToolset.Mba.Core/OverridableVariables.cs | 30 ++++++++++++++++++++++ 3 files changed, 54 insertions(+), 2 deletions(-) (limited to 'src/api/burn/WixToolset.Mba.Core') diff --git a/src/api/burn/WixToolset.Mba.Core/IOverridableVariables.cs b/src/api/burn/WixToolset.Mba.Core/IOverridableVariables.cs index 3944913b..1ffe50e4 100644 --- a/src/api/burn/WixToolset.Mba.Core/IOverridableVariables.cs +++ b/src/api/burn/WixToolset.Mba.Core/IOverridableVariables.cs @@ -4,11 +4,31 @@ namespace WixToolset.Mba.Core { using System.Collections.Generic; + /// + /// The case sensitivity of variables from the command line. + /// + public enum VariableCommandLineType + { + /// + /// Similar to Windows Installer, all variable names specified on the command line are automatically converted to upper case. + /// + UpperCase, + /// + /// All variable names specified on the command line must match the case specified when building the bundle. + /// + CaseSensitive, + } + /// /// Overridable variable information from the BA manifest. /// public interface IOverridableVariables { + /// + /// The of the bundle. + /// + VariableCommandLineType CommandLineType { get; } + /// /// Variable Dictionary of variable name to . /// diff --git a/src/api/burn/WixToolset.Mba.Core/MbaCommand.cs b/src/api/burn/WixToolset.Mba.Core/MbaCommand.cs index e7e49607..424cde63 100644 --- a/src/api/burn/WixToolset.Mba.Core/MbaCommand.cs +++ b/src/api/burn/WixToolset.Mba.Core/MbaCommand.cs @@ -19,9 +19,11 @@ namespace WixToolset.Mba.Core { foreach (var kvp in this.Variables) { - if (!overridableVariables.Variables.TryGetValue(kvp.Key, out var overridableVariable)) + var key = overridableVariables.CommandLineType == VariableCommandLineType.UpperCase ? kvp.Key.ToUpperInvariant() : kvp.Key; + + if (!overridableVariables.Variables.TryGetValue(key, out var overridableVariable)) { - engine.Log(LogLevel.Error, string.Format("Ignoring attempt to set non-overridable variable: '{0}'.", kvp.Key)); + engine.Log(LogLevel.Error, string.Format("Ignoring attempt to set non-overridable variable: '{0}'.", key)); } else { diff --git a/src/api/burn/WixToolset.Mba.Core/OverridableVariables.cs b/src/api/burn/WixToolset.Mba.Core/OverridableVariables.cs index 855ce9a9..148acb34 100644 --- a/src/api/burn/WixToolset.Mba.Core/OverridableVariables.cs +++ b/src/api/burn/WixToolset.Mba.Core/OverridableVariables.cs @@ -12,6 +12,9 @@ namespace WixToolset.Mba.Core /// public class OverridableVariablesInfo : IOverridableVariables { + /// + public VariableCommandLineType CommandLineType { get; internal set; } + /// public IDictionary Variables { get; internal set; } @@ -26,9 +29,36 @@ namespace WixToolset.Mba.Core { XmlNamespaceManager namespaceManager = new XmlNamespaceManager(root.NameTable); namespaceManager.AddNamespace("p", BootstrapperApplicationData.XMLNamespace); + XPathNavigator commandLineNode = root.SelectSingleNode("/p:BootstrapperApplicationData/p:CommandLine", namespaceManager); XPathNodeIterator nodes = root.Select("/p:BootstrapperApplicationData/p:WixStdbaOverridableVariable", namespaceManager); var overridableVariables = new OverridableVariablesInfo(); + + if (commandLineNode == null) + { + throw new Exception("Failed to select command line information."); + } + + string variablesValue = BootstrapperApplicationData.GetAttribute(commandLineNode, "Variables"); + + if (variablesValue == null) + { + throw new Exception("Failed to get command line variable type."); + } + + if (variablesValue.Equals("upperCase", StringComparison.InvariantCulture)) + { + overridableVariables.CommandLineType = VariableCommandLineType.UpperCase; + } + else if (variablesValue.Equals("caseSensitive", StringComparison.InvariantCulture)) + { + overridableVariables.CommandLineType = VariableCommandLineType.CaseSensitive; + } + else + { + throw new Exception(string.Format("Unknown command line variable type: '{0}'", variablesValue)); + } + overridableVariables.Variables = new Dictionary(); foreach (XPathNavigator node in nodes) -- cgit v1.2.3-55-g6feb