aboutsummaryrefslogtreecommitdiff
path: root/src/ext
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2022-09-09 16:03:29 -0500
committerSean Hall <r.sean.hall@gmail.com>2022-09-09 21:14:27 -0500
commita1307cd4e76a89598c53cb68309358a7012db553 (patch)
treef79cf181b49f0b754afcd4ec25487bf2b284d45e /src/ext
parentf61479585d865372645cb18c982aa708dd975da3 (diff)
downloadwix-a1307cd4e76a89598c53cb68309358a7012db553.tar.gz
wix-a1307cd4e76a89598c53cb68309358a7012db553.tar.bz2
wix-a1307cd4e76a89598c53cb68309358a7012db553.zip
Move `Bundle/@CommandLineVariables` into Bal.wixext.
Implements 6858
Diffstat (limited to 'src/ext')
-rw-r--r--src/ext/Bal/test/WixToolsetTest.Bal/BalExtensionFixture.cs9
-rw-r--r--src/ext/Bal/test/WixToolsetTest.Bal/TestData/Overridable/Bundle.wxs2
-rw-r--r--src/ext/Bal/test/WixToolsetTest.Bal/TestData/Overridable/WrongCaseBundle.wxs3
-rw-r--r--src/ext/Bal/wixext/BalBurnBackendExtension.cs40
-rw-r--r--src/ext/Bal/wixext/BalCompiler.cs36
-rw-r--r--src/ext/Bal/wixext/BalErrors.cs12
-rw-r--r--src/ext/Bal/wixext/Symbols/BalSymbolDefinitions.cs5
-rw-r--r--src/ext/Bal/wixext/Symbols/WixStdbaCommandLineSymbol.cs54
8 files changed, 150 insertions, 11 deletions
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
78 var extractResult = BundleExtractor.ExtractBAContainer(null, bundleFile, baFolderPath, extractFolderPath); 78 var extractResult = BundleExtractor.ExtractBAContainer(null, bundleFile, baFolderPath, extractFolderPath);
79 extractResult.AssertSuccess(); 79 extractResult.AssertSuccess();
80 80
81 var balCommandLines = extractResult.GetBADataTestXmlLines("/ba:BootstrapperApplicationData/ba:WixStdbaCommandLine");
82 WixAssert.CompareLineByLine(new[]
83 {
84 "<WixStdbaCommandLine VariableType='caseInsensitive' />",
85 }, balCommandLines);
86
81 var balOverridableVariables = extractResult.GetBADataTestXmlLines("/ba:BootstrapperApplicationData/ba:WixStdbaOverridableVariable"); 87 var balOverridableVariables = extractResult.GetBADataTestXmlLines("/ba:BootstrapperApplicationData/ba:WixStdbaOverridableVariable");
82 WixAssert.CompareLineByLine(new[] 88 WixAssert.CompareLineByLine(new[]
83 { 89 {
@@ -209,8 +215,9 @@ namespace WixToolsetTest.Bal
209 WixAssert.CompareLineByLine(new[] 215 WixAssert.CompareLineByLine(new[]
210 { 216 {
211 "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.", 217 "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.",
212 "Overridable variable 'Test1' must be 'TEST1' with Bundle/@CommandLineVariables value 'upperCase'.", 218 "Overridable variable 'TEST1' collides with 'Test1' with Bundle/@CommandLineVariables value 'caseInsensitive'.",
213 "The *Package/@bal:DisplayInternalUICondition attribute's value '=' is not a valid bundle condition.", 219 "The *Package/@bal:DisplayInternalUICondition attribute's value '=' is not a valid bundle condition.",
220 "The location of the Variable related to the previous error.",
214 }, messages.ToArray()); 221 }, messages.ToArray());
215 } 222 }
216 } 223 }
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 @@
1<?xml version="1.0" encoding="utf-8"?> 1<?xml version="1.0" encoding="utf-8"?>
2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" 2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"
3 xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal"> 3 xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
4 <Bundle Name="WixStdBa" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="75D5D534-E177-4689-AAE9-CAC1C39002C2"> 4 <Bundle Name="WixStdBa" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="75D5D534-E177-4689-AAE9-CAC1C39002C2" bal:CommandLineVariables="caseInsensitive">
5 <BootstrapperApplication> 5 <BootstrapperApplication>
6 <bal:WixStandardBootstrapperApplication LicenseUrl="http://wixtoolset.org/about/license/" Theme="hyperlinkLicense" /> 6 <bal:WixStandardBootstrapperApplication LicenseUrl="http://wixtoolset.org/about/license/" Theme="hyperlinkLicense" />
7 </BootstrapperApplication> 7 </BootstrapperApplication>
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 @@
1<?xml version="1.0" encoding="utf-8"?> 1<?xml version="1.0" encoding="utf-8"?>
2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" 2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"
3 xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal"> 3 xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
4 <Bundle Name="WixStdBa" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="75D5D534-E177-4689-AAE9-CAC1C39002C2"> 4 <Bundle Name="WixStdBa" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="75D5D534-E177-4689-AAE9-CAC1C39002C2" bal:CommandLineVariables="caseInsensitive">
5 <BootstrapperApplication> 5 <BootstrapperApplication>
6 <bal:WixStandardBootstrapperApplication LicenseUrl="http://wixtoolset.org/about/license/" Theme="hyperlinkLicense" /> 6 <bal:WixStandardBootstrapperApplication LicenseUrl="http://wixtoolset.org/about/license/" Theme="hyperlinkLicense" />
7 </BootstrapperApplication> 7 </BootstrapperApplication>
8 <Variable Name="Test1" bal:Overridable="yes" /> 8 <Variable Name="Test1" bal:Overridable="yes" />
9 <Variable Name="TEST1" bal:Overridable="yes" />
9 <Chain> 10 <Chain>
10 <ExePackage Permanent="yes" DetectCondition="none" SourceFile="runtimes\win-x86\native\wixnative.exe" /> 11 <ExePackage Permanent="yes" DetectCondition="none" SourceFile="runtimes\win-x86\native\wixnative.exe" />
11 <MsiPackage SourceFile="test.msi" bal:DisplayInternalUICondition="!(loc.NonsensePlanCondition)" /> 12 <MsiPackage SourceFile="test.msi" bal:DisplayInternalUICondition="!(loc.NonsensePlanCondition)" />
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
24 BalSymbolDefinitions.WixBalPackageInfo, 24 BalSymbolDefinitions.WixBalPackageInfo,
25 BalSymbolDefinitions.WixDncOptions, 25 BalSymbolDefinitions.WixDncOptions,
26 BalSymbolDefinitions.WixMbaPrereqInformation, 26 BalSymbolDefinitions.WixMbaPrereqInformation,
27 BalSymbolDefinitions.WixStdbaCommandLine,
27 BalSymbolDefinitions.WixStdbaOptions, 28 BalSymbolDefinitions.WixStdbaOptions,
28 BalSymbolDefinitions.WixStdbaOverridableVariable, 29 BalSymbolDefinitions.WixStdbaOverridableVariable,
29 BalSymbolDefinitions.WixMbaPrereqOptions, 30 BalSymbolDefinitions.WixMbaPrereqOptions,
@@ -61,6 +62,30 @@ namespace WixToolset.Bal
61 62
62 return true; 63 return true;
63 } 64 }
65 else if (symbol is WixStdbaCommandLineSymbol stdbaCommandLineSymbol)
66 {
67 var sb = new StringBuilder();
68 using (var writer = XmlWriter.Create(sb))
69 {
70 writer.WriteStartElement(symbol.Definition.Name, BurnConstants.BootstrapperApplicationDataNamespace);
71
72 switch (stdbaCommandLineSymbol.VariableType)
73 {
74 case WixStdbaCommandLineVariableType.CaseInsensitive:
75 writer.WriteAttributeString("VariableType", "caseInsensitive");
76 break;
77 default:
78 writer.WriteAttributeString("VariableType", "caseSensitive");
79 break;
80 }
81
82 writer.WriteEndElement();
83 }
84
85 this.BackendHelper.AddBootstrapperApplicationData(sb.ToString());
86
87 return true;
88 }
64 else 89 else
65 { 90 {
66 return base.TryProcessSymbol(section, symbol); 91 return base.TryProcessSymbol(section, symbol);
@@ -418,19 +443,24 @@ namespace WixToolset.Bal
418 443
419 private void VerifyOverridableVariables(IntermediateSection section) 444 private void VerifyOverridableVariables(IntermediateSection section)
420 { 445 {
421 var bundleSymbol = section.Symbols.OfType<WixBundleSymbol>().Single(); 446 var commandLineSymbol = section.Symbols.OfType<WixStdbaCommandLineSymbol>().SingleOrDefault();
422 if (bundleSymbol.CommandLineVariables != WixBundleCommandLineVariables.UpperCase) 447 if (commandLineSymbol?.VariableType != WixStdbaCommandLineVariableType.CaseInsensitive)
423 { 448 {
424 return; 449 return;
425 } 450 }
426 451
427 var overridableVariableSymbols = section.Symbols.OfType<WixStdbaOverridableVariableSymbol>().ToList(); 452 var overridableVariableSymbols = section.Symbols.OfType<WixStdbaOverridableVariableSymbol>().ToList();
453 var overridableVariables = new Dictionary<string, WixStdbaOverridableVariableSymbol>(StringComparer.InvariantCultureIgnoreCase);
428 foreach (var overridableVariableSymbol in overridableVariableSymbols) 454 foreach (var overridableVariableSymbol in overridableVariableSymbols)
429 { 455 {
430 var upperName = overridableVariableSymbol.Name.ToUpperInvariant(); 456 if (!overridableVariables.TryGetValue(overridableVariableSymbol.Name, out var collisionVariableSymbol))
431 if (upperName != overridableVariableSymbol.Name) 457 {
458 overridableVariables.Add(overridableVariableSymbol.Name, overridableVariableSymbol);
459 }
460 else
432 { 461 {
433 this.Messaging.Write(BalErrors.NonUpperCaseOverridableVariable(overridableVariableSymbol.SourceLineNumbers, overridableVariableSymbol.Name, upperName)); 462 this.Messaging.Write(BalErrors.OverridableVariableCollision(overridableVariableSymbol.SourceLineNumbers, overridableVariableSymbol.Name, collisionVariableSymbol.Name));
463 this.Messaging.Write(BalErrors.OverridableVariableCollision2(collisionVariableSymbol.SourceLineNumbers));
434 } 464 }
435 } 465 }
436 } 466 }
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
119 119
120 switch (parentElement.Name.LocalName) 120 switch (parentElement.Name.LocalName)
121 { 121 {
122 case "Bundle":
123 switch (attribute.Name.LocalName)
124 {
125 case "CommandLineVariables":
126 WixStdbaCommandLineVariableType? variableType = null;
127
128 var commandLineVariablesValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attribute);
129 switch (commandLineVariablesValue)
130 {
131 case "caseInsensitive":
132 variableType = WixStdbaCommandLineVariableType.CaseInsensitive;
133 break;
134 case "caseSensitive":
135 variableType = WixStdbaCommandLineVariableType.CaseSensitive;
136 break;
137 default:
138 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, parentElement.Name.LocalName, attribute.Name.LocalName, commandLineVariablesValue, "caseInsensitive", "caseSensitive"));
139 break;
140 }
141
142 if (variableType.HasValue)
143 {
144 // There can only be one.
145 var id = new Identifier(AccessModifier.Global, "WixStdbaCommandLineVariableType");
146 section.AddSymbol(new WixStdbaCommandLineSymbol(sourceLineNumbers, id)
147 {
148 VariableType = variableType.Value,
149 });
150 }
151
152 break;
153 default:
154 this.ParseHelper.UnexpectedAttribute(parentElement, attribute);
155 break;
156 }
157 break;
122 case "BundlePackage": 158 case "BundlePackage":
123 case "ExePackage": 159 case "ExePackage":
124 case "MsiPackage": 160 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
78 return Message(sourceLineNumbers, Ids.MultiplePrimaryPackageType2, "The location of the package related to the previous error."); 78 return Message(sourceLineNumbers, Ids.MultiplePrimaryPackageType2, "The location of the package related to the previous error.");
79 } 79 }
80 80
81 public static Message NonUpperCaseOverridableVariable(SourceLineNumber sourceLineNumbers, string name, string expectedName) 81 public static Message OverridableVariableCollision(SourceLineNumber sourceLineNumbers, string name, string collisionName)
82 { 82 {
83 return Message(sourceLineNumbers, Ids.NonUpperCaseOverridableVariable, "Overridable variable '{0}' must be '{1}' with Bundle/@CommandLineVariables value 'upperCase'.", name, expectedName); 83 return Message(sourceLineNumbers, Ids.OverridableVariableCollision, "Overridable variable '{0}' collides with '{1}' with Bundle/@CommandLineVariables value 'caseInsensitive'.", name, collisionName);
84 }
85
86 public static Message OverridableVariableCollision2(SourceLineNumber sourceLineNumbers)
87 {
88 return Message(sourceLineNumbers, Ids.OverridableVariableCollision2, "The location of the Variable related to the previous error.");
84 } 89 }
85 90
86 private static Message Message(SourceLineNumber sourceLineNumber, Ids id, string format, params object[] args) 91 private static Message Message(SourceLineNumber sourceLineNumber, Ids id, string format, params object[] args)
@@ -101,7 +106,6 @@ namespace WixToolset.Bal
101 MultipleBAFunctions = 6804, 106 MultipleBAFunctions = 6804,
102 BAFunctionsPayloadRequiredInUXContainer = 6805, 107 BAFunctionsPayloadRequiredInUXContainer = 6805,
103 MissingDNCPrereq = 6806, 108 MissingDNCPrereq = 6806,
104 NonUpperCaseOverridableVariable = 6807,
105 MissingIUIPrimaryPackage = 6808, 109 MissingIUIPrimaryPackage = 6808,
106 MultiplePrimaryPackageType = 6809, 110 MultiplePrimaryPackageType = 6809,
107 MultiplePrimaryPackageType2 = 6810, 111 MultiplePrimaryPackageType2 = 6810,
@@ -110,6 +114,8 @@ namespace WixToolset.Bal
110 IuibaPermanentPrimaryPackageType = 6813, 114 IuibaPermanentPrimaryPackageType = 6813,
111 IuibaNonMsiPrimaryPackage = 6814, 115 IuibaNonMsiPrimaryPackage = 6814,
112 IuibaPrimaryPackageEnableFeatureSelection = 6815, 116 IuibaPrimaryPackageEnableFeatureSelection = 6815,
117 OverridableVariableCollision = 6816,
118 OverridableVariableCollision2 = 6817,
113 } 119 }
114 } 120 }
115} 121}
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
14 WixBalPackageInfo, 14 WixBalPackageInfo,
15 WixDncOptions, 15 WixDncOptions,
16 WixMbaPrereqInformation, 16 WixMbaPrereqInformation,
17 WixStdbaCommandLine,
17 WixStdbaOptions, 18 WixStdbaOptions,
18 WixStdbaOverridableVariable, 19 WixStdbaOverridableVariable,
19 WixMbaPrereqOptions, 20 WixMbaPrereqOptions,
@@ -55,6 +56,9 @@ namespace WixToolset.Bal
55 case BalSymbolDefinitionType.WixMbaPrereqInformation: 56 case BalSymbolDefinitionType.WixMbaPrereqInformation:
56 return BalSymbolDefinitions.WixMbaPrereqInformation; 57 return BalSymbolDefinitions.WixMbaPrereqInformation;
57 58
59 case BalSymbolDefinitionType.WixStdbaCommandLine:
60 return BalSymbolDefinitions.WixStdbaCommandLine;
61
58 case BalSymbolDefinitionType.WixStdbaOptions: 62 case BalSymbolDefinitionType.WixStdbaOptions:
59 return BalSymbolDefinitions.WixStdbaOptions; 63 return BalSymbolDefinitions.WixStdbaOptions;
60 64
@@ -77,6 +81,7 @@ namespace WixToolset.Bal
77 WixBalPackageInfo.AddTag(BurnConstants.BootstrapperApplicationDataSymbolDefinitionTag); 81 WixBalPackageInfo.AddTag(BurnConstants.BootstrapperApplicationDataSymbolDefinitionTag);
78 WixDncOptions.AddTag(BurnConstants.BootstrapperApplicationDataSymbolDefinitionTag); 82 WixDncOptions.AddTag(BurnConstants.BootstrapperApplicationDataSymbolDefinitionTag);
79 WixMbaPrereqInformation.AddTag(BurnConstants.BootstrapperApplicationDataSymbolDefinitionTag); 83 WixMbaPrereqInformation.AddTag(BurnConstants.BootstrapperApplicationDataSymbolDefinitionTag);
84 WixStdbaCommandLine.AddTag(BurnConstants.BootstrapperApplicationDataSymbolDefinitionTag);
80 WixStdbaOptions.AddTag(BurnConstants.BootstrapperApplicationDataSymbolDefinitionTag); 85 WixStdbaOptions.AddTag(BurnConstants.BootstrapperApplicationDataSymbolDefinitionTag);
81 WixStdbaOverridableVariable.AddTag(BurnConstants.BootstrapperApplicationDataSymbolDefinitionTag); 86 WixStdbaOverridableVariable.AddTag(BurnConstants.BootstrapperApplicationDataSymbolDefinitionTag);
82 WixMbaPrereqOptions.AddTag(BurnConstants.BootstrapperApplicationDataSymbolDefinitionTag); 87 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 @@
1// 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.
2
3namespace WixToolset.Bal
4{
5 using WixToolset.Data;
6 using WixToolset.Bal.Symbols;
7
8 public static partial class BalSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition WixStdbaCommandLine = new IntermediateSymbolDefinition(
11 BalSymbolDefinitionType.WixStdbaCommandLine.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(WixStdbaCommandLineSymbolFields.VariableType), IntermediateFieldType.Number),
15 },
16 typeof(WixStdbaCommandLineSymbol));
17 }
18}
19
20namespace WixToolset.Bal.Symbols
21{
22 using System;
23 using WixToolset.Data;
24
25 public enum WixStdbaCommandLineSymbolFields
26 {
27 VariableType,
28 }
29
30 public enum WixStdbaCommandLineVariableType
31 {
32 CaseSensitive,
33 CaseInsensitive,
34 }
35
36 public class WixStdbaCommandLineSymbol : IntermediateSymbol
37 {
38 public WixStdbaCommandLineSymbol() : base(BalSymbolDefinitions.WixStdbaCommandLine, null, null)
39 {
40 }
41
42 public WixStdbaCommandLineSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(BalSymbolDefinitions.WixStdbaCommandLine, sourceLineNumber, id)
43 {
44 }
45
46 public IntermediateField this[WixStdbaCommandLineSymbolFields index] => this.Fields[(int)index];
47
48 public WixStdbaCommandLineVariableType VariableType
49 {
50 get => (WixStdbaCommandLineVariableType)this.Fields[(int)WixStdbaCommandLineSymbolFields.VariableType].AsNumber();
51 set => this.Set((int)WixStdbaCommandLineSymbolFields.VariableType, (int)value);
52 }
53 }
54}