@joebigelow / wix / commits / 89c47639

Improve error reporting wrt ExePackage and MsuPackage attributes

For example, DetectCondition is required when RepairArguments or UninstallArguments present and always recommended. Also, non-permanent ExePackages need UninstallArguments. The code was refactored to make it easier to reason over the different requirements for different package types.

Rob Mensching committed Mar 1, 2022 at 20:10 UTC 89c476396d7ad6ab7c596300ec082dd9c38b9121
22 files changed +112 -54
src/ext/Bal/test/examples/EarliestCoreBundleFDD/FrameworkDependentBundle.wxs
+1 -1
@@ -9,7 +9,7 @@
9 <bal:WixDotNetCoreBootstrapperApplicationHost />
10 </BootstrapperApplication>
11 <Chain>
12 - <ExePackage DetectCondition="none" SourceFile="..\.data\notanexe.exe" bal:PrereqPackage="yes" />
12 + <ExePackage DetectCondition="none" UninstallArguments="-foo" SourceFile="..\.data\notanexe.exe" bal:PrereqPackage="yes" />
13 </Chain>
14 </Bundle>
15 </Wix>
src/ext/Bal/test/examples/EarliestCoreBundleSCD/SelfContainedBundle.wxs
+1 -1
@@ -5,7 +5,7 @@
5 <PayloadGroupRef Id="publish.Example.EarliestCoreMBA.scd" />
6 </BootstrapperApplication>
7 <Chain>
8 - <ExePackage DetectCondition="none" SourceFile="..\.data\notanexe.exe" PerMachine="yes" />
8 + <ExePackage DetectCondition="none" UninstallArguments="-foo" SourceFile="..\.data\notanexe.exe" PerMachine="yes" />
9 </Chain>
10 </Bundle>
11 </Wix>
src/ext/Bal/test/examples/EarliestCoreBundleTrimmedSCD/TrimmedSelfContainedBundle.wxs
+1 -1
@@ -5,7 +5,7 @@
5 <PayloadGroupRef Id="publish.Example.EarliestCoreMBA.trimmedscd" />
6 </BootstrapperApplication>
7 <Chain>
8 - <ExePackage DetectCondition="none" SourceFile="..\.data\notanexe.exe" PerMachine="yes" />
8 + <ExePackage DetectCondition="none" UninstallArguments="-foo" SourceFile="..\.data\notanexe.exe" PerMachine="yes" />
9 </Chain>
10 </Bundle>
11 </Wix>
src/ext/Bal/test/examples/FullFramework2Bundle/Bundle.wxs
+1 -1
@@ -8,7 +8,7 @@
8 <bal:WixManagedBootstrapperApplicationHost />
9 </BootstrapperApplication>
10 <Chain>
11 - <ExePackage DetectCondition="none" SourceFile="..\.data\notanexe.exe" bal:PrereqPackage="yes" />
11 + <ExePackage DetectCondition="none" UninstallArguments="-foo" SourceFile="..\.data\notanexe.exe" bal:PrereqPackage="yes" />
12 </Chain>
13 </Bundle>
14 </Wix>
src/ext/Bal/test/examples/FullFramework4Bundle/Bundle.wxs
+1 -1
@@ -8,7 +8,7 @@
8 <bal:WixManagedBootstrapperApplicationHost />
9 </BootstrapperApplication>
10 <Chain>
11 - <ExePackage DetectCondition="none" SourceFile="..\.data\notanexe.exe" bal:PrereqPackage="yes" />
11 + <ExePackage DetectCondition="none" UninstallArguments="-foo" SourceFile="..\.data\notanexe.exe" bal:PrereqPackage="yes" />
12 </Chain>
13 </Bundle>
14 </Wix>
src/ext/Bal/test/examples/LatestCoreBundleFDD/FrameworkDependentBundle.wxs
+1 -1
@@ -9,7 +9,7 @@
9 <bal:WixDotNetCoreBootstrapperApplicationHost />
10 </BootstrapperApplication>
11 <Chain>
12 - <ExePackage DetectCondition="none" SourceFile="..\.data\notanexe.exe" bal:PrereqPackage="yes" />
12 + <ExePackage DetectCondition="none" UninstallArguments="-foo" SourceFile="..\.data\notanexe.exe" bal:PrereqPackage="yes" />
13 </Chain>
14 </Bundle>
15 </Wix>
src/ext/Bal/test/examples/LatestCoreBundleSCD/SelfContainedBundle.wxs
+1 -1
@@ -5,7 +5,7 @@
5 <PayloadGroupRef Id="publish.Example.LatestCoreMBA.scd" />
6 </BootstrapperApplication>
7 <Chain>
8 - <ExePackage DetectCondition="none" SourceFile="..\.data\notanexe.exe" PerMachine="yes" />
8 + <ExePackage DetectCondition="none" UninstallArguments="-foo" SourceFile="..\.data\notanexe.exe" PerMachine="yes" />
9 </Chain>
10 </Bundle>
11 </Wix>
src/ext/Bal/test/examples/LatestCoreBundleTrimmedSCD/TrimmedSelfContainedBundle.wxs
+1 -1
@@ -5,7 +5,7 @@
5 <PayloadGroupRef Id="publish.Example.LatestCoreMBA.trimmedscd" />
6 </BootstrapperApplication>
7 <Chain>
8 - <ExePackage DetectCondition="none" SourceFile="..\.data\notanexe.exe" PerMachine="yes" />
8 + <ExePackage DetectCondition="none" UninstallArguments="-foo" SourceFile="..\.data\notanexe.exe" PerMachine="yes" />
9 </Chain>
10 </Bundle>
11 </Wix>
src/ext/Bal/test/examples/WPFCoreBundleFDD/FrameworkDependentBundle.wxs
+1 -1
@@ -9,7 +9,7 @@
9 <bal:WixDotNetCoreBootstrapperApplicationHost />
10 </BootstrapperApplication>
11 <Chain>
12 - <ExePackage DetectCondition="none" SourceFile="..\.data\notanexe.exe" bal:PrereqPackage="yes" />
12 + <ExePackage DetectCondition="none" UninstallArguments="-foo" SourceFile="..\.data\notanexe.exe" bal:PrereqPackage="yes" />
13 </Chain>
14 </Bundle>
15 </Wix>
src/test/burn/TestData/DependencyTests/BundleE/BundleE.wxs
+1 -1
@@ -9,7 +9,7 @@
9 <PackageGroup Id="BundlePackages">
10 <MsiPackage Id="PackageA" SourceFile="$(var.PackageAv1.TargetPath)" />
11 <MsiPackage Id="PackageC" SourceFile="$(var.PackageC.TargetPath)" Vital="no" />
12 - <ExePackage Id="ExeA" Cache="remove" Vital="no" PerMachine="yes" InstallArguments="/ec 1603"
12 + <ExePackage Id="ExeA" Cache="remove" Vital="no" PerMachine="yes" InstallArguments="/ec 1603" UninstallArguments=""
13 DetectCondition="ExeA_Version AND ExeA_Version &gt;= v$(var.Version)">
14 <Provides Key="$(var.TestGroupName)_ExeA,v1.0" Version="$(var.Version)" />
15 <PayloadGroupRef Id="TestExePayloads" />
src/wix/WixToolset.Core/Compiler_Bundle.cs
+80 -26
@@ -6,7 +6,6 @@ namespace WixToolset.Core
6 using System.Collections.Generic;
7 using System.Diagnostics;
8 using System.Globalization;
9 - using System.IO;
9 using System.Linq;
10 using System.Xml.Linq;
11 using WixToolset.Data;
@@ -2099,7 +2098,7 @@ namespace WixToolset.Core
2098 allowed = (packageType == WixBundlePackageType.Exe);
2099 break;
2100 case "UninstallArguments":
2102 - uninstallArguments = this.Core.GetAttributeValue(sourceLineNumbers, attrib);
2101 + uninstallArguments = this.Core.GetAttributeValue(sourceLineNumbers, attrib, EmptyRule.CanBeEmpty);
2102 allowed = (packageType == WixBundlePackageType.Exe);
2103 break;
2104 case "PerMachine":
@@ -2187,49 +2186,104 @@ namespace WixToolset.Core
2186 rollbackPathVariable = String.Concat("WixBundleRollbackLog_", id.Id);
2187 }
2188
2190 - if (!String.IsNullOrEmpty(protocol) && !protocol.Equals("burn", StringComparison.Ordinal) && !protocol.Equals("netfx4", StringComparison.Ordinal) && !protocol.Equals("none", StringComparison.Ordinal))
2189 + if (packageType == WixBundlePackageType.Exe)
2190 {
2192 - this.Core.Write(ErrorMessages.IllegalAttributeValueWithLegalList(sourceLineNumbers, node.Name.LocalName, "Protocol", protocol, "none, burn, netfx4"));
2193 - }
2191 + // Set default scope for EXEs and MSPs if not already set.
2192 + if (perMachine == YesNoDefaultType.NotSet)
2193 + {
2194 + perMachine = YesNoDefaultType.Default;
2195 + }
2196
2195 - if (!String.IsNullOrEmpty(protocol) && protocol.Equals("netfx4", StringComparison.Ordinal))
2196 - {
2197 - foreach (var expectedArgument in expectedNetFx4Args)
2197 + if (permanent == YesNoType.No)
2198 {
2199 - if (null == installArguments || -1 == installArguments.IndexOf(expectedArgument, StringComparison.OrdinalIgnoreCase))
2199 + if (uninstallArguments == null)
2200 {
2201 - this.Core.Write(WarningMessages.AttributeShouldContain(sourceLineNumbers, node.Name.LocalName, "InstallArguments", installArguments, expectedArgument, "Protocol", "netfx4"));
2201 + this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "UninstallArguments", "Permanent", "no"));
2202 }
2203 + }
2204 + else if (permanent == YesNoType.NotSet)
2205 + {
2206 + if (uninstallArguments == null)
2207 + {
2208 + this.Core.Write(ErrorMessages.ExpectedAttributeWithoutOtherAttribute(sourceLineNumbers, node.Name.LocalName, "UninstallArguments", "Permanent"));
2209 + }
2210 + }
2211
2204 - if (!String.IsNullOrEmpty(repairArguments) && -1 == repairArguments.IndexOf(expectedArgument, StringComparison.OrdinalIgnoreCase))
2212 + // Detect condition is recommended or required for Exe packages (depending on whether repair or uninstall arguments were provided).
2213 + if (String.IsNullOrEmpty(detectCondition))
2214 + {
2215 + if (repairArguments != null)
2216 {
2206 - this.Core.Write(WarningMessages.AttributeShouldContain(sourceLineNumbers, node.Name.LocalName, "RepairArguments", repairArguments, expectedArgument, "Protocol", "netfx4"));
2217 + this.Core.Write(ErrorMessages.ExpectedAttributeWithValueWithOtherAttribute(sourceLineNumbers, node.Name.LocalName, "DetectCondition", "RepairArguments"));
2218 }
2219 + else if (uninstallArguments != null)
2220 + {
2221 + this.Core.Write(ErrorMessages.ExpectedAttributeWithValueWithOtherAttribute(sourceLineNumbers, node.Name.LocalName, "DetectCondition", "UninstallArguments"));
2222 + }
2223 + else
2224 + {
2225 + this.Core.Write(WarningMessages.DetectConditionRecommended(sourceLineNumbers, node.Name.LocalName));
2226 + }
2227 + }
2228 +
2229 + // Validate the protocol if provided.
2230 + if (!String.IsNullOrEmpty(protocol))
2231 + {
2232 + if (protocol.Equals("netfx4", StringComparison.Ordinal))
2233 + {
2234 + foreach (var expectedArgument in expectedNetFx4Args)
2235 + {
2236 + if (null == installArguments || -1 == installArguments.IndexOf(expectedArgument, StringComparison.OrdinalIgnoreCase))
2237 + {
2238 + this.Core.Write(WarningMessages.AttributeShouldContain(sourceLineNumbers, node.Name.LocalName, "InstallArguments", installArguments, expectedArgument, "Protocol", "netfx4"));
2239 + }
2240
2209 - if (!String.IsNullOrEmpty(uninstallArguments) && -1 == uninstallArguments.IndexOf(expectedArgument, StringComparison.OrdinalIgnoreCase))
2241 + if (!String.IsNullOrEmpty(repairArguments) && -1 == repairArguments.IndexOf(expectedArgument, StringComparison.OrdinalIgnoreCase))
2242 + {
2243 + this.Core.Write(WarningMessages.AttributeShouldContain(sourceLineNumbers, node.Name.LocalName, "RepairArguments", repairArguments, expectedArgument, "Protocol", "netfx4"));
2244 + }
2245 +
2246 + if (!String.IsNullOrEmpty(uninstallArguments) && -1 == uninstallArguments.IndexOf(expectedArgument, StringComparison.OrdinalIgnoreCase))
2247 + {
2248 + this.Core.Write(WarningMessages.AttributeShouldContain(sourceLineNumbers, node.Name.LocalName, "UninstallArguments", uninstallArguments, expectedArgument, "Protocol", "netfx4"));
2249 + }
2250 + }
2251 + }
2252 + else if (!protocol.Equals("burn", StringComparison.Ordinal) && !protocol.Equals("none", StringComparison.Ordinal))
2253 {
2211 - this.Core.Write(WarningMessages.AttributeShouldContain(sourceLineNumbers, node.Name.LocalName, "UninstallArguments", uninstallArguments, expectedArgument, "Protocol", "netfx4"));
2254 + this.Core.Write(ErrorMessages.IllegalAttributeValueWithLegalList(sourceLineNumbers, node.Name.LocalName, "Protocol", protocol, "none, burn, netfx4"));
2255 }
2256 }
2257 }
2215 -
2216 - // Only set default scope for EXEs and MSPs if not already set.
2217 - if ((WixBundlePackageType.Exe == packageType || WixBundlePackageType.Msp == packageType) && YesNoDefaultType.NotSet == perMachine)
2258 + else if (packageType == WixBundlePackageType.Msp)
2259 {
2219 - perMachine = YesNoDefaultType.Default;
2260 + // Set default scope for EXEs and MSPs if not already set.
2261 + if (perMachine == YesNoDefaultType.NotSet)
2262 + {
2263 + perMachine = YesNoDefaultType.Default;
2264 + }
2265 }
2221 -
2222 - // Detect condition is recommended or required for Exe and Msu packages
2223 - // (depending on whether uninstall arguments were provided).
2224 - if ((packageType == WixBundlePackageType.Exe || packageType == WixBundlePackageType.Msu) && String.IsNullOrEmpty(detectCondition))
2266 + else if (packageType == WixBundlePackageType.Msu)
2267 {
2226 - if (String.IsNullOrEmpty(uninstallArguments))
2268 + if (permanent == YesNoType.No)
2269 {
2228 - this.Core.Write(WarningMessages.DetectConditionRecommended(sourceLineNumbers, node.Name.LocalName));
2270 + if (String.IsNullOrEmpty(msuKB))
2271 + {
2272 + this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "KB", "Permanent", "no"));
2273 + }
2274 }
2230 - else
2275 + else if (permanent == YesNoType.NotSet)
2276 + {
2277 + if (String.IsNullOrEmpty(msuKB))
2278 + {
2279 + this.Core.Write(ErrorMessages.ExpectedAttributeWithoutOtherAttribute(sourceLineNumbers, node.Name.LocalName, "KB", "Permanent"));
2280 + }
2281 + }
2282 +
2283 + // Detect condition is recommended for Msu packages.
2284 + if (String.IsNullOrEmpty(detectCondition))
2285 {
2232 - this.Core.Write(ErrorMessages.ExpectedAttributeWithValueWithOtherAttribute(sourceLineNumbers, node.Name.LocalName, "DetectCondition", "UninstallArguments"));
2286 + this.Core.Write(WarningMessages.DetectConditionRecommended(sourceLineNumbers, node.Name.LocalName));
2287 }
2288 }
2289
src/wix/test/WixToolsetTest.CoreIntegration/ExePackageFixture.cs
+6
@@ -3,6 +3,7 @@
3 namespace WixToolsetTest.CoreIntegration
4 {
5 using System.IO;
6 + using System.Linq;
7 using WixBuildTools.TestSupport;
8 using WixToolset.Core.TestPackage;
9 using Xunit;
@@ -25,6 +26,11 @@ namespace WixToolsetTest.CoreIntegration
26 "-o", Path.Combine(baseFolder, "test.wixlib")
27 });
28
29 + WixAssert.CompareLineByLine(new[]
30 + {
31 + "The ExePackage element's UninstallArguments attribute was not found; it is required without attribute Permanent present.",
32 + "The ExePackage/@DetectCondition attribute is recommended so the package is only installed when absent."
33 + }, result.Messages.Select(m => m.ToString()).ToArray());
34 Assert.Equal(1153, result.ExitCode);
35 }
36 }
src/wix/test/WixToolsetTest.CoreIntegration/PayloadFixture.cs
-2
@@ -2,13 +2,11 @@
2
3 namespace WixToolsetTest.CoreIntegration
4 {
5 - using System;
5 using System.Collections.Generic;
6 using System.IO;
7 using System.Linq;
8 using System.Xml;
9 using WixBuildTools.TestSupport;
11 - using WixToolset.Core;
10 using WixToolset.Core.TestPackage;
11 using WixToolset.Data;
12 using WixToolset.Data.Symbols;
src/wix/test/WixToolsetTest.CoreIntegration/TestData/BadInput/DuplicateCacheIds.wxs
+2 -2
@@ -2,8 +2,8 @@
2 <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 <Fragment>
4 <PackageGroup Id="BundlePackages">
5 - <ExePackage Id="Manual1" SourceFile="burn.exe" Name="manual1\burn.exe" DetectCondition="test" CacheId="!(wix.WixVariable1)" />
6 - <ExePackage Id="Manual2" SourceFile="burn.exe" Name="manual2\burn.exe" DetectCondition="test" CacheId="!(wix.WixVariable2)" />
5 + <ExePackage Id="Manual1" SourceFile="burn.exe" Name="manual1\burn.exe" DetectCondition="test" UninstallArguments="-u" CacheId="!(wix.WixVariable1)" />
6 + <ExePackage Id="Manual2" SourceFile="burn.exe" Name="manual2\burn.exe" DetectCondition="test" UninstallArguments="-u" CacheId="!(wix.WixVariable2)" />
7 </PackageGroup>
8
9 <WixVariable Id="WixVariable1" Value="CollidingCacheId" />
src/wix/test/WixToolsetTest.CoreIntegration/TestData/BadInput/DuplicatePayloadNames.wxs
+4 -4
@@ -2,12 +2,12 @@
2 <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 <Fragment>
4 <PackageGroup Id="BundlePackages">
5 - <ExePackage Id="Auto1" SourceFile="burn.exe" CacheId="Auto1" DetectCondition="none" />
6 - <ExePackage Id="Auto2" SourceFile="burn.exe" CacheId="Auto2" DetectCondition="none" />
7 - <ExePackage Id="DuplicateCacheIds.wxs" SourceFile="$(sys.SOURCEFILEDIR)DuplicateCacheIds.wxs" Compressed="no" DetectCondition="none" Name="PayloadCollision">
5 + <ExePackage Id="Auto1" SourceFile="burn.exe" CacheId="Auto1" DetectCondition="none" UninstallArguments="-u" />
6 + <ExePackage Id="Auto2" SourceFile="burn.exe" CacheId="Auto2" DetectCondition="none" UninstallArguments="-u" />
7 + <ExePackage Id="DuplicateCacheIds.wxs" SourceFile="$(sys.SOURCEFILEDIR)DuplicateCacheIds.wxs" Compressed="no" DetectCondition="none" UninstallArguments="-u" Name="PayloadCollision">
8 <Payload SourceFile="$(sys.SOURCEFILEDIR)BundleVariable.wxs" Compressed="no" Name="ContainerCollision" />
9 </ExePackage>
10 - <ExePackage Id="HiddenPersistedBundleVariable.wxs" SourceFile="$(sys.SOURCEFILEDIR)HiddenPersistedBundleVariable.wxs" Compressed="no" DetectCondition="none" Name="PayloadCollision" />
10 + <ExePackage Id="HiddenPersistedBundleVariable.wxs" SourceFile="$(sys.SOURCEFILEDIR)HiddenPersistedBundleVariable.wxs" Compressed="no" DetectCondition="none" UninstallArguments="-u" Name="PayloadCollision" />
11 <PackageGroupRef Id="MsiPackages" />
12 </PackageGroup>
13
src/wix/test/WixToolsetTest.CoreIntegration/TestData/BadInput/UnscheduledPackage.wxs
+3 -3
@@ -2,15 +2,15 @@
2 <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 <Fragment>
4 <PackageGroup Id="BundlePackages">
5 - <ExePackage Id="Auto1" SourceFile="burn.exe" CacheId="Auto1" DetectCondition="none" />
6 - <ExePackage Id="Auto2" SourceFile="burn.exe" CacheId="Auto2" DetectCondition="none" />
5 + <ExePackage Id="Auto1" SourceFile="burn.exe" CacheId="Auto1" DetectCondition="none" UninstallArguments="-u" />
6 + <ExePackage Id="Auto2" SourceFile="burn.exe" CacheId="Auto2" DetectCondition="none" UninstallArguments="-u" />
7 </PackageGroup>
8 <SetVariableRef Id="Dummy" />
9 </Fragment>
10 <Fragment>
11 <SetVariable Id="Dummy" Variable="Dummy" />
12 <PackageGroup Id="Unscheduled">
13 - <ExePackage Id="Unscheduled1" SourceFile="burn.exe" CacheId="Unscheduled1" DetectCondition="none" />
13 + <ExePackage Id="Unscheduled1" SourceFile="burn.exe" CacheId="Unscheduled1" DetectCondition="none" UninstallArguments="-u" />
14 </PackageGroup>
15 </Fragment>
16 </Wix>
src/wix/test/WixToolsetTest.CoreIntegration/TestData/BadInput/UnscheduledRollbackBoundary.wxs
+2 -2
@@ -2,8 +2,8 @@
2 <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 <Fragment>
4 <PackageGroup Id="BundlePackages">
5 - <ExePackage Id="Auto1" SourceFile="burn.exe" CacheId="Auto1" DetectCondition="none" />
6 - <ExePackage Id="Auto2" SourceFile="burn.exe" CacheId="Auto2" DetectCondition="none" />
5 + <ExePackage Id="Auto1" SourceFile="burn.exe" CacheId="Auto1" DetectCondition="none" UninstallArguments="-u" />
6 + <ExePackage Id="Auto2" SourceFile="burn.exe" CacheId="Auto2" DetectCondition="none" UninstallArguments="-u" />
7 </PackageGroup>
8 <SetVariableRef Id="Dummy" />
9 </Fragment>
src/wix/test/WixToolsetTest.CoreIntegration/TestData/Dependency/ExePackageProvidesBundle.wxs
+1 -1
@@ -2,7 +2,7 @@
2 <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 <Fragment>
4 <PackageGroup Id="BundlePackages">
5 - <ExePackage DetectCondition="DetectedSomething" SourceFile="burn.exe">
5 + <ExePackage DetectCondition="DetectedSomething" UninstallArguments="-u" SourceFile="burn.exe">
6 <Provides Key="DependencyTests_ExeA,v1.0" Version="1.0.0.0" />
7 </ExePackage>
8 </PackageGroup>
src/wix/test/WixToolsetTest.CoreIntegration/TestData/MsuPackage/Bundle.wxs
+1 -1
@@ -5,7 +5,7 @@
5 </BootstrapperApplication>
6
7 <Chain>
8 - <MsuPackage DetectCondition="DetectedTheMsu" SourceFile="test.msu" />
8 + <MsuPackage DetectCondition="DetectedTheMsu" KB="xyz" SourceFile="test.msu" />
9 </Chain>
10 </Bundle>
11 </Wix>
src/wix/test/WixToolsetTest.CoreIntegration/TestData/Payload/DownloadUrlPlaceholdersBundle.wxs
+1 -1
@@ -14,7 +14,7 @@
14 </Bundle>
15 <Fragment>
16 <PackageGroup Id="ContainerPackages">
17 - <ExePackage SourceFile="burn.exe" DetectCondition="none" Compressed="no" />
17 + <ExePackage SourceFile="burn.exe" DetectCondition="none" UninstallArguments="-u" Compressed="no" />
18 </PackageGroup>
19 </Fragment>
20 <Fragment>
src/wix/test/WixToolsetTest.CoreIntegration/TestData/Payload/SharedBAAndPackagePayloadBundle.wxs
+1 -1
@@ -2,7 +2,7 @@
2 <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 <Fragment>
4 <PackageGroup Id="BundlePackages">
5 - <ExePackage SourceFile="burn.exe" DetectCondition="none">
5 + <ExePackage SourceFile="burn.exe" DetectCondition="none" UninstallArguments="-u">
6 <PayloadGroupRef Id="Shared" />
7 </ExePackage>
8 </PackageGroup>
src/wix/test/WixToolsetTest.CoreIntegration/TestData/SingleExeBundle/SingleExePackageGroup.wxs
+1 -1
@@ -2,7 +2,7 @@
2 <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 <Fragment>
4 <PackageGroup Id="BundlePackages">
5 - <ExePackage DetectCondition="DetectedSomething" SourceFile="burn.exe" />
5 + <ExePackage DetectCondition="DetectedSomething" UninstallArguments="-uninstall" SourceFile="burn.exe" />
6 </PackageGroup>
7 </Fragment>
8 </Wix>