aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2022-08-25 15:05:40 -0500
committerSean Hall <r.sean.hall@gmail.com>2022-08-26 10:03:37 -0500
commit6bd9fb04a9a8c1805a3e909583cca85c54dea7e4 (patch)
tree96c75bb36baecb023634497701ad333b3a3883a4
parentef68dbf1523800dbf49fa8d10e220d100442780e (diff)
downloadwix-6bd9fb04a9a8c1805a3e909583cca85c54dea7e4.tar.gz
wix-6bd9fb04a9a8c1805a3e909583cca85c54dea7e4.tar.bz2
wix-6bd9fb04a9a8c1805a3e909583cca85c54dea7e4.zip
Fix building `ExePackage/@ExitCode` elements.
-rw-r--r--src/api/wix/WixToolset.Data/Symbols/WixBundlePackageExitCodeSymbol.cs2
-rw-r--r--src/wix/WixToolset.Core.Burn/Bundles/CreateBurnManifestCommand.cs2
-rw-r--r--src/wix/WixToolset.Core/Common.cs27
-rw-r--r--src/wix/WixToolset.Core/CompilerCore.cs11
-rw-r--r--src/wix/WixToolset.Core/Compiler_Bundle.cs4
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/ExePackageFixture.cs54
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExePackage/CustomExitCodes.wxs25
7 files changed, 121 insertions, 4 deletions
diff --git a/src/api/wix/WixToolset.Data/Symbols/WixBundlePackageExitCodeSymbol.cs b/src/api/wix/WixToolset.Data/Symbols/WixBundlePackageExitCodeSymbol.cs
index d77d9d58..f025a493 100644
--- a/src/api/wix/WixToolset.Data/Symbols/WixBundlePackageExitCodeSymbol.cs
+++ b/src/api/wix/WixToolset.Data/Symbols/WixBundlePackageExitCodeSymbol.cs
@@ -32,7 +32,7 @@ namespace WixToolset.Data.Symbols
32 public enum ExitCodeBehaviorType 32 public enum ExitCodeBehaviorType
33 { 33 {
34 NotSet = -1, 34 NotSet = -1,
35 Success, 35 Success = 1,
36 Error, 36 Error,
37 ScheduleReboot, 37 ScheduleReboot,
38 ForceReboot, 38 ForceReboot,
diff --git a/src/wix/WixToolset.Core.Burn/Bundles/CreateBurnManifestCommand.cs b/src/wix/WixToolset.Core.Burn/Bundles/CreateBurnManifestCommand.cs
index dda79aa1..7273918b 100644
--- a/src/wix/WixToolset.Core.Burn/Bundles/CreateBurnManifestCommand.cs
+++ b/src/wix/WixToolset.Core.Burn/Bundles/CreateBurnManifestCommand.cs
@@ -532,7 +532,7 @@ namespace WixToolset.Core.Burn.Bundles
532 532
533 if (exitCode.Code.HasValue) 533 if (exitCode.Code.HasValue)
534 { 534 {
535 writer.WriteAttributeString("Code", unchecked((uint)exitCode.Code).ToString(CultureInfo.InvariantCulture)); 535 writer.WriteAttributeString("Code", exitCode.Code.Value.ToString(CultureInfo.InvariantCulture));
536 } 536 }
537 else 537 else
538 { 538 {
diff --git a/src/wix/WixToolset.Core/Common.cs b/src/wix/WixToolset.Core/Common.cs
index 89cfe515..c838463d 100644
--- a/src/wix/WixToolset.Core/Common.cs
+++ b/src/wix/WixToolset.Core/Common.cs
@@ -681,6 +681,33 @@ namespace WixToolset.Core
681 } 681 }
682 682
683 /// <summary> 683 /// <summary>
684 /// Get an integer attribute value and displays an error for an illegal integer value.
685 /// </summary>
686 /// <param name="messaging"></param>
687 /// <param name="sourceLineNumbers">Source line information about the owner element.</param>
688 /// <param name="attribute">The attribute containing the value to get.</param>
689 /// <returns>The attribute's integer value or null if an error occurred during conversion.</returns>
690 public static int? GetAttributeRawIntegerValue(IMessaging messaging, SourceLineNumber sourceLineNumbers, XAttribute attribute)
691 {
692 var value = Common.GetAttributeValue(messaging, sourceLineNumbers, attribute, EmptyRule.MustHaveNonWhitespaceCharacters);
693 int? integer = null;
694
695 if (0 < value.Length)
696 {
697 if (Int32.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture.NumberFormat, out var integerValue))
698 {
699 integer = integerValue;
700 }
701 else
702 {
703 messaging.Write(ErrorMessages.IllegalIntegerValue(sourceLineNumbers, attribute.Parent.Name.LocalName, attribute.Name.LocalName, value));
704 }
705 }
706
707 return integer;
708 }
709
710 /// <summary>
684 /// Gets a yes/no value and displays an error for an illegal yes/no value. 711 /// Gets a yes/no value and displays an error for an illegal yes/no value.
685 /// </summary> 712 /// </summary>
686 /// <param name="messaging"></param> 713 /// <param name="messaging"></param>
diff --git a/src/wix/WixToolset.Core/CompilerCore.cs b/src/wix/WixToolset.Core/CompilerCore.cs
index cbb8f1f0..c03305f0 100644
--- a/src/wix/WixToolset.Core/CompilerCore.cs
+++ b/src/wix/WixToolset.Core/CompilerCore.cs
@@ -501,6 +501,17 @@ namespace WixToolset.Core
501 } 501 }
502 502
503 /// <summary> 503 /// <summary>
504 /// Get an integer attribute value and displays an error for an illegal integer value.
505 /// </summary>
506 /// <param name="sourceLineNumbers">Source line information about the owner element.</param>
507 /// <param name="attribute">The attribute containing the value to get.</param>
508 /// <returns>The attribute's integer value or null if an error occurred during conversion.</returns>
509 public int? GetAttributeRawIntegerValue(SourceLineNumber sourceLineNumbers, XAttribute attribute)
510 {
511 return Common.GetAttributeRawIntegerValue(this.messaging, sourceLineNumbers, attribute);
512 }
513
514 /// <summary>
504 /// Get a long integral attribute value and displays an error for an illegal long value. 515 /// Get a long integral attribute value and displays an error for an illegal long value.
505 /// </summary> 516 /// </summary>
506 /// <param name="sourceLineNumbers">Source line information about the owner element.</param> 517 /// <param name="sourceLineNumbers">Source line information about the owner element.</param>
diff --git a/src/wix/WixToolset.Core/Compiler_Bundle.cs b/src/wix/WixToolset.Core/Compiler_Bundle.cs
index 47eb646b..0a1e416f 100644
--- a/src/wix/WixToolset.Core/Compiler_Bundle.cs
+++ b/src/wix/WixToolset.Core/Compiler_Bundle.cs
@@ -1609,7 +1609,7 @@ namespace WixToolset.Core
1609 private void ParseExitCodeElement(XElement node, string packageId) 1609 private void ParseExitCodeElement(XElement node, string packageId)
1610 { 1610 {
1611 var sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); 1611 var sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node);
1612 var value = CompilerConstants.IntegerNotSet; 1612 int? value = null;
1613 var behavior = ExitCodeBehaviorType.NotSet; 1613 var behavior = ExitCodeBehaviorType.NotSet;
1614 1614
1615 foreach (var attrib in node.Attributes()) 1615 foreach (var attrib in node.Attributes())
@@ -1619,7 +1619,7 @@ namespace WixToolset.Core
1619 switch (attrib.Name.LocalName) 1619 switch (attrib.Name.LocalName)
1620 { 1620 {
1621 case "Value": 1621 case "Value":
1622 value = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, Int32.MinValue + 2, Int32.MaxValue); 1622 value = this.Core.GetAttributeRawIntegerValue(sourceLineNumbers, attrib);
1623 break; 1623 break;
1624 case "Behavior": 1624 case "Behavior":
1625 var behaviorString = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 1625 var behaviorString = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/ExePackageFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/ExePackageFixture.cs
index 882a7861..a3ca2917 100644
--- a/src/wix/test/WixToolsetTest.CoreIntegration/ExePackageFixture.cs
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/ExePackageFixture.cs
@@ -55,6 +55,60 @@ namespace WixToolsetTest.CoreIntegration
55 } 55 }
56 56
57 [Fact] 57 [Fact]
58 public void CanBuildWithCustomExitCodes()
59 {
60 var folder = TestData.Get(@"TestData");
61
62 using (var fs = new DisposableFileSystem())
63 {
64 var baseFolder = fs.GetFolder();
65 var intermediateFolder = Path.Combine(baseFolder, "obj");
66 var binFolder = Path.Combine(baseFolder, "bin");
67 var bundlePath = Path.Combine(binFolder, "test.exe");
68 var baFolderPath = Path.Combine(baseFolder, "ba");
69 var extractFolderPath = Path.Combine(baseFolder, "extract");
70
71 var result = WixRunner.Execute(new[]
72 {
73 "build",
74 Path.Combine(folder, "ExePackage", "CustomExitCodes.wxs"),
75 Path.Combine(folder, "BundleWithPackageGroupRef", "Bundle.wxs"),
76 "-bindpath", Path.Combine(folder, "SimpleBundle", "data"),
77 "-bindpath", Path.Combine(folder, ".Data"),
78 "-intermediateFolder", intermediateFolder,
79 "-o", bundlePath,
80 });
81
82 result.AssertSuccess();
83
84 Assert.True(File.Exists(bundlePath));
85
86 var extractResult = BundleExtractor.ExtractBAContainer(null, bundlePath, baFolderPath, extractFolderPath);
87 extractResult.AssertSuccess();
88
89 var exePackages = extractResult.GetManifestTestXmlLines("/burn:BurnManifest/burn:Chain/burn:ExePackage");
90 WixAssert.CompareLineByLine(new string[]
91 {
92 "<ExePackage Id='burn.exe' Cache='keep' CacheId='F6E722518AC3AB7E31C70099368D5770788C179AA23226110DCF07319B1E1964' InstallSize='463360' Size='463360' PerMachine='yes' Permanent='no' Vital='yes' RollbackBoundaryForward='WixDefaultBoundary' RollbackBoundaryBackward='WixDefaultBoundary' LogPathVariable='WixBundleLog_burn.exe' RollbackLogPathVariable='WixBundleRollbackLog_burn.exe' InstallArguments='-install' RepairArguments='-repair' Repairable='yes' DetectionType='condition' DetectCondition='detect' UninstallArguments='-uninstall' Uninstallable='yes'>" +
93 "<ExitCode Code='0' Type='2' />" +
94 "<ExitCode Code='3' Type='3' />" +
95 "<ExitCode Code='4' Type='4' />" +
96 "<ExitCode Code='3010' Type='2' />" +
97 "<ExitCode Code='-2147021886' Type='2' />" +
98 "<ExitCode Code='3011' Type='2' />" +
99 "<ExitCode Code='-2147021885' Type='2' />" +
100 "<ExitCode Code='1641' Type='2' />" +
101 "<ExitCode Code='-2147023255' Type='2' />" +
102 "<ExitCode Code='-2147483647' Type='2' />" +
103 "<ExitCode Code='-2147483648' Type='2' />" +
104 "<ExitCode Code='*' Type='1' />" +
105 "<PayloadRef Id='burn.exe' />" +
106 "</ExePackage>",
107 }, exePackages);
108 }
109 }
110
111 [Fact]
58 public void WarningWhenInvalidArpEntryVersion() 112 public void WarningWhenInvalidArpEntryVersion()
59 { 113 {
60 var folder = TestData.Get(@"TestData"); 114 var folder = TestData.Get(@"TestData");
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExePackage/CustomExitCodes.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExePackage/CustomExitCodes.wxs
new file mode 100644
index 00000000..9cbc9919
--- /dev/null
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExePackage/CustomExitCodes.wxs
@@ -0,0 +1,25 @@
1<?xml version="1.0" encoding="utf-8"?>
2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 <Fragment>
4 <PackageGroup Id="BundlePackages">
5 <ExePackage InstallArguments="-install"
6 RepairArguments="-repair"
7 UninstallArguments="-uninstall"
8 DetectCondition="detect"
9 SourceFile="burn.exe">
10 <ExitCode Value="0" Behavior="error" />
11 <ExitCode Value="3" Behavior="scheduleReboot" />
12 <ExitCode Value="4" Behavior="forceReboot" />
13 <ExitCode Value="3010" Behavior="error" />
14 <ExitCode Value="-2147021886" Behavior="error" />
15 <ExitCode Value="3011" Behavior="error" />
16 <ExitCode Value="-2147021885" Behavior="error" />
17 <ExitCode Value="1641" Behavior="error" />
18 <ExitCode Value="-2147023255" Behavior="error" />
19 <ExitCode Value="-2147483647" Behavior="error" />
20 <ExitCode Value="-2147483648" Behavior="error" />
21 <ExitCode Behavior="success" />
22 </ExePackage>
23 </PackageGroup>
24 </Fragment>
25</Wix>