@joebigelow / wix / commits / 6bd9fb04

Fix building `ExePackage/@ExitCode` elements.

Sean Hall committed Aug 25, 2022 at 15:05 UTC 6bd9fb04a9a8c1805a3e909583cca85c54dea7e4
7 files changed +121 -4
src/api/wix/WixToolset.Data/Symbols/WixBundlePackageExitCodeSymbol.cs
+1 -1
@@ -32,7 +32,7 @@ namespace WixToolset.Data.Symbols
32 public enum ExitCodeBehaviorType
33 {
34 NotSet = -1,
35 - Success,
35 + Success = 1,
36 Error,
37 ScheduleReboot,
38 ForceReboot,
src/wix/WixToolset.Core.Burn/Bundles/CreateBurnManifestCommand.cs
+1 -1
@@ -532,7 +532,7 @@ namespace WixToolset.Core.Burn.Bundles
532
533 if (exitCode.Code.HasValue)
534 {
535 - writer.WriteAttributeString("Code", unchecked((uint)exitCode.Code).ToString(CultureInfo.InvariantCulture));
535 + writer.WriteAttributeString("Code", exitCode.Code.Value.ToString(CultureInfo.InvariantCulture));
536 }
537 else
538 {
src/wix/WixToolset.Core/Common.cs
+27
@@ -680,6 +680,33 @@ namespace WixToolset.Core
680 return integer;
681 }
682
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>
711 /// Gets a yes/no value and displays an error for an illegal yes/no value.
712 /// </summary>
src/wix/WixToolset.Core/CompilerCore.cs
+11
@@ -500,6 +500,17 @@ namespace WixToolset.Core
500 return this.parseHelper.GetAttributeIntegerValue(sourceLineNumbers, attribute, minimum, maximum);
501 }
502
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>
515 /// Get a long integral attribute value and displays an error for an illegal long value.
516 /// </summary>
src/wix/WixToolset.Core/Compiler_Bundle.cs
+2 -2
@@ -1609,7 +1609,7 @@ namespace WixToolset.Core
1609 private void ParseExitCodeElement(XElement node, string packageId)
1610 {
1611 var sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node);
1612 - var value = CompilerConstants.IntegerNotSet;
1612 + int? value = null;
1613 var behavior = ExitCodeBehaviorType.NotSet;
1614
1615 foreach (var attrib in node.Attributes())
@@ -1619,7 +1619,7 @@ namespace WixToolset.Core
1619 switch (attrib.Name.LocalName)
1620 {
1621 case "Value":
1622 - value = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, Int32.MinValue + 2, Int32.MaxValue);
1622 + value = this.Core.GetAttributeRawIntegerValue(sourceLineNumbers, attrib);
1623 break;
1624 case "Behavior":
1625 var behaviorString = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
src/wix/test/WixToolsetTest.CoreIntegration/ExePackageFixture.cs
+54
@@ -54,6 +54,60 @@ namespace WixToolsetTest.CoreIntegration
54 }
55 }
56
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]
112 public void WarningWhenInvalidArpEntryVersion()
113 {
src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExePackage/CustomExitCodes.wxs new
+25
@@ -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>