diff options
author | Sean Hall <r.sean.hall@gmail.com> | 2022-08-25 15:05:40 -0500 |
---|---|---|
committer | Sean Hall <r.sean.hall@gmail.com> | 2022-08-26 10:03:37 -0500 |
commit | 6bd9fb04a9a8c1805a3e909583cca85c54dea7e4 (patch) | |
tree | 96c75bb36baecb023634497701ad333b3a3883a4 | |
parent | ef68dbf1523800dbf49fa8d10e220d100442780e (diff) | |
download | wix-6bd9fb04a9a8c1805a3e909583cca85c54dea7e4.tar.gz wix-6bd9fb04a9a8c1805a3e909583cca85c54dea7e4.tar.bz2 wix-6bd9fb04a9a8c1805a3e909583cca85c54dea7e4.zip |
Fix building `ExePackage/@ExitCode` elements.
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> | ||