@joebigelow / wix / commits / 008a6fd5

Handle the rename of WixCA and QtExec* binary, custom action, and property ids.

Fixed wixtoolset/issues#5887.

Bob Arnson committed Oct 8, 2018 at 20:16 UTC 008a6fd58bfb40ed58a184aff40c3f01bb26391b
7 files changed +418 -2
src/test/WixToolsetTest.WixCop/TestData/QtExec.bad/v3.wxs new
+65
@@ -0,0 +1,65 @@
1 +<?xml version="1.0" encoding="UTF-8"?>
2 +<!-- 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. -->
3 +
4 +
5 +
6 +<?include WixVer.wxi ?>
7 +
8 +<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:swid="http://schemas.microsoft.com/wix/TagExtension" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
9 + <Product Id="*" Name="!(loc.ShortProduct) v$(var.WixMajorMinor) Core" Language="1033" Manufacturer="!(loc.Company)"
10 + Version="$(var.WixMsiProductVersion)" UpgradeCode="3618724B-2523-44F9-A908-866AA619504D">
11 + <Package Compressed="yes" InstallerVersion="200" SummaryCodepage="1252" InstallScope="perMachine" />
12 + <swid:Tag Regid="!(loc.Regid)" InstallDirectory="INSTALLFOLDER" />
13 +
14 + <MajorUpgrade DowngradeErrorMessage="A later version of [ProductName] is already installed." />
15 +
16 + <MediaTemplate CabinetTemplate="core{0}.cab" />
17 +
18 + <Property Id="QtExecCmdTimeout" Value="600000" />
19 + <CustomAction Id="InstallVSTemplateCommand" Property="QtExecCmdLine" Value="&quot;[VSENVPRODUCT80]\devenv.exe&quot; /setup" />
20 + <CustomAction Id="InstallVSTemplate" BinaryKey="WixCA" DllEntry="CAQuietExec" Return="asyncWait" />
21 +
22 + <Feature Id="Feature_WiX" Title="WiX Toolset" Level="1">
23 + <Component Id="Licensing" Directory="INSTALLFOLDER">
24 + <File Source="LICENSE.TXT" />
25 + </Component>
26 +
27 + <Component Id="ProductRegistration" Directory="INSTALLFOLDER">
28 + <RegistryKey Root="HKLM" Key="SOFTWARE\Microsoft\Windows Installer XML\$(var.WixMajorMinor)">
29 + <RegistryValue Name="InstallFolder" Value="[INSTALLFOLDER]" Type="string" />
30 + </RegistryKey>
31 + </Component>
32 +
33 + <Component Id="ProductFamilyRegistration" Directory="INSTALLFOLDER">
34 + <RegistryKey Root="HKLM" Key="SOFTWARE\Microsoft\Windows Installer XML\$(var.WixMajor).x">
35 + <RegistryValue Name="v$(var.WixMajorMinor)" Value="[INSTALLFOLDER]" Type="string" />
36 + </RegistryKey>
37 + </Component>
38 +
39 + <Component Id="ProductInformation" Directory="BinFolder">
40 + <RegistryKey Root="HKLM" Key="SOFTWARE\Microsoft\Windows Installer XML\$(var.WixMajorMinor)">
41 + <RegistryValue Name="InstallRoot" Value="[BinFolder]" Type="string"/>
42 + <RegistryValue Name="ProductVersion" Value="[ProductVersion]" Type="string" />
43 + </RegistryKey>
44 +
45 + <RemoveFolder Id="CleanupShortcutFolder" Directory="ShortcutFolder" On="uninstall" />
46 + </Component>
47 +
48 + <Component Directory="BinFolder">
49 + <File Source="common\wixtoolset.org.ico" />
50 + <util:InternetShortcut Id="wixtoolset.org" Directory="ShortcutFolder" Name="WiX Home Page" Target="http://wixtoolset.org/" IconFile="file://[#wixtoolset.org.ico]" />
51 + </Component>
52 +
53 + <ComponentGroupRef Id="ToolsetComponents" />
54 + <ComponentGroupRef Id="ExtensionComponents" />
55 + <ComponentGroupRef Id="LuxComponents" />
56 + <ComponentGroupRef Id="DocComponents" />
57 + </Feature>
58 +
59 + <FeatureRef Id="Feature_MSBuild" />
60 + <FeatureRef Id="Feature_Intellisense2010" />
61 + <FeatureRef Id="Feature_Intellisense2012" />
62 + <FeatureRef Id="Feature_Intellisense2013" />
63 + <FeatureRef Id="Feature_Intellisense2015" />
64 + </Product>
65 +</Wix>
src/test/WixToolsetTest.WixCop/TestData/QtExec.bad/v4_expected.wxs new
+64
@@ -0,0 +1,64 @@
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<!-- 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. -->
3 +
4 +
5 +
6 +<?include WixVer.wxi ?>
7 +
8 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:swid="http://wixtoolset.org/schemas/v4/wxs/tag" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
9 + <Product Id="*" Name="!(loc.ShortProduct) v$(var.WixMajorMinor) Core" Language="1033" Manufacturer="!(loc.Company)" Version="$(var.WixMsiProductVersion)" UpgradeCode="3618724B-2523-44F9-A908-866AA619504D">
10 + <Package Compressed="yes" InstallerVersion="200" SummaryCodepage="1252" InstallScope="perMachine" />
11 + <swid:Tag Regid="!(loc.Regid)" InstallDirectory="INSTALLFOLDER" />
12 +
13 + <MajorUpgrade DowngradeErrorMessage="A later version of [ProductName] is already installed." />
14 +
15 + <MediaTemplate CabinetTemplate="core{0}.cab" />
16 +
17 + <Property Id="QtExecCmdTimeout" Value="600000" />
18 + <CustomAction Id="InstallVSTemplateCommand" Property="WixQuietExecCmdLine" Value="&quot;[VSENVPRODUCT80]\devenv.exe&quot; /setup" />
19 + <CustomAction Id="InstallVSTemplate" BinaryKey="UtilCA" DllEntry="WixQuietExec" Return="asyncWait" />
20 +
21 + <Feature Id="Feature_WiX" Title="WiX Toolset" Level="1">
22 + <Component Id="Licensing" Directory="INSTALLFOLDER">
23 + <File Id="LICENSE.TXT" Source="LICENSE.TXT" />
24 + </Component>
25 +
26 + <Component Id="ProductRegistration" Directory="INSTALLFOLDER">
27 + <RegistryKey Root="HKLM" Key="SOFTWARE\Microsoft\Windows Installer XML\$(var.WixMajorMinor)">
28 + <RegistryValue Name="InstallFolder" Value="[INSTALLFOLDER]" Type="string" />
29 + </RegistryKey>
30 + </Component>
31 +
32 + <Component Id="ProductFamilyRegistration" Directory="INSTALLFOLDER">
33 + <RegistryKey Root="HKLM" Key="SOFTWARE\Microsoft\Windows Installer XML\$(var.WixMajor).x">
34 + <RegistryValue Name="v$(var.WixMajorMinor)" Value="[INSTALLFOLDER]" Type="string" />
35 + </RegistryKey>
36 + </Component>
37 +
38 + <Component Id="ProductInformation" Directory="BinFolder">
39 + <RegistryKey Root="HKLM" Key="SOFTWARE\Microsoft\Windows Installer XML\$(var.WixMajorMinor)">
40 + <RegistryValue Name="InstallRoot" Value="[BinFolder]" Type="string" />
41 + <RegistryValue Name="ProductVersion" Value="[ProductVersion]" Type="string" />
42 + </RegistryKey>
43 +
44 + <RemoveFolder Id="CleanupShortcutFolder" Directory="ShortcutFolder" On="uninstall" />
45 + </Component>
46 +
47 + <Component Directory="BinFolder">
48 + <File Id="wixtoolset.org.ico" Source="common\wixtoolset.org.ico" />
49 + <util:InternetShortcut Id="wixtoolset.org" Directory="ShortcutFolder" Name="WiX Home Page" Target="http://wixtoolset.org/" IconFile="file://[#wixtoolset.org.ico]" />
50 + </Component>
51 +
52 + <ComponentGroupRef Id="ToolsetComponents" />
53 + <ComponentGroupRef Id="ExtensionComponents" />
54 + <ComponentGroupRef Id="LuxComponents" />
55 + <ComponentGroupRef Id="DocComponents" />
56 + </Feature>
57 +
58 + <FeatureRef Id="Feature_MSBuild" />
59 + <FeatureRef Id="Feature_Intellisense2010" />
60 + <FeatureRef Id="Feature_Intellisense2012" />
61 + <FeatureRef Id="Feature_Intellisense2013" />
62 + <FeatureRef Id="Feature_Intellisense2015" />
63 + </Product>
64 +</Wix>
src/test/WixToolsetTest.WixCop/TestData/QtExec/v3.wxs new
+64
@@ -0,0 +1,64 @@
1 +<?xml version="1.0" encoding="UTF-8"?>
2 +<!-- 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. -->
3 +
4 +
5 +
6 +<?include WixVer.wxi ?>
7 +
8 +<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:swid="http://schemas.microsoft.com/wix/TagExtension" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
9 + <Product Id="*" Name="!(loc.ShortProduct) v$(var.WixMajorMinor) Core" Language="1033" Manufacturer="!(loc.Company)"
10 + Version="$(var.WixMsiProductVersion)" UpgradeCode="3618724B-2523-44F9-A908-866AA619504D">
11 + <Package Compressed="yes" InstallerVersion="200" SummaryCodepage="1252" InstallScope="perMachine" />
12 + <swid:Tag Regid="!(loc.Regid)" InstallDirectory="INSTALLFOLDER" />
13 +
14 + <MajorUpgrade DowngradeErrorMessage="A later version of [ProductName] is already installed." />
15 +
16 + <MediaTemplate CabinetTemplate="core{0}.cab" />
17 +
18 + <CustomAction Id="InstallVSTemplateCommand" Property="QtExecCmdLine" Value="&quot;[VSENVPRODUCT80]\devenv.exe&quot; /setup" />
19 + <CustomAction Id="InstallVSTemplate" BinaryKey="WixCA" DllEntry="CAQuietExec" Return="asyncWait" />
20 +
21 + <Feature Id="Feature_WiX" Title="WiX Toolset" Level="1">
22 + <Component Id="Licensing" Directory="INSTALLFOLDER">
23 + <File Source="LICENSE.TXT" />
24 + </Component>
25 +
26 + <Component Id="ProductRegistration" Directory="INSTALLFOLDER">
27 + <RegistryKey Root="HKLM" Key="SOFTWARE\Microsoft\Windows Installer XML\$(var.WixMajorMinor)">
28 + <RegistryValue Name="InstallFolder" Value="[INSTALLFOLDER]" Type="string" />
29 + </RegistryKey>
30 + </Component>
31 +
32 + <Component Id="ProductFamilyRegistration" Directory="INSTALLFOLDER">
33 + <RegistryKey Root="HKLM" Key="SOFTWARE\Microsoft\Windows Installer XML\$(var.WixMajor).x">
34 + <RegistryValue Name="v$(var.WixMajorMinor)" Value="[INSTALLFOLDER]" Type="string" />
35 + </RegistryKey>
36 + </Component>
37 +
38 + <Component Id="ProductInformation" Directory="BinFolder">
39 + <RegistryKey Root="HKLM" Key="SOFTWARE\Microsoft\Windows Installer XML\$(var.WixMajorMinor)">
40 + <RegistryValue Name="InstallRoot" Value="[BinFolder]" Type="string"/>
41 + <RegistryValue Name="ProductVersion" Value="[ProductVersion]" Type="string" />
42 + </RegistryKey>
43 +
44 + <RemoveFolder Id="CleanupShortcutFolder" Directory="ShortcutFolder" On="uninstall" />
45 + </Component>
46 +
47 + <Component Directory="BinFolder">
48 + <File Source="common\wixtoolset.org.ico" />
49 + <util:InternetShortcut Id="wixtoolset.org" Directory="ShortcutFolder" Name="WiX Home Page" Target="http://wixtoolset.org/" IconFile="file://[#wixtoolset.org.ico]" />
50 + </Component>
51 +
52 + <ComponentGroupRef Id="ToolsetComponents" />
53 + <ComponentGroupRef Id="ExtensionComponents" />
54 + <ComponentGroupRef Id="LuxComponents" />
55 + <ComponentGroupRef Id="DocComponents" />
56 + </Feature>
57 +
58 + <FeatureRef Id="Feature_MSBuild" />
59 + <FeatureRef Id="Feature_Intellisense2010" />
60 + <FeatureRef Id="Feature_Intellisense2012" />
61 + <FeatureRef Id="Feature_Intellisense2013" />
62 + <FeatureRef Id="Feature_Intellisense2015" />
63 + </Product>
64 +</Wix>
src/test/WixToolsetTest.WixCop/TestData/QtExec/v4_expected.wxs new
+63
@@ -0,0 +1,63 @@
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<!-- 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. -->
3 +
4 +
5 +
6 +<?include WixVer.wxi ?>
7 +
8 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:swid="http://wixtoolset.org/schemas/v4/wxs/tag" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
9 + <Product Id="*" Name="!(loc.ShortProduct) v$(var.WixMajorMinor) Core" Language="1033" Manufacturer="!(loc.Company)" Version="$(var.WixMsiProductVersion)" UpgradeCode="3618724B-2523-44F9-A908-866AA619504D">
10 + <Package Compressed="yes" InstallerVersion="200" SummaryCodepage="1252" InstallScope="perMachine" />
11 + <swid:Tag Regid="!(loc.Regid)" InstallDirectory="INSTALLFOLDER" />
12 +
13 + <MajorUpgrade DowngradeErrorMessage="A later version of [ProductName] is already installed." />
14 +
15 + <MediaTemplate CabinetTemplate="core{0}.cab" />
16 +
17 + <CustomAction Id="InstallVSTemplateCommand" Property="WixQuietExecCmdLine" Value="&quot;[VSENVPRODUCT80]\devenv.exe&quot; /setup" />
18 + <CustomAction Id="InstallVSTemplate" BinaryKey="UtilCA" DllEntry="WixQuietExec" Return="asyncWait" />
19 +
20 + <Feature Id="Feature_WiX" Title="WiX Toolset" Level="1">
21 + <Component Id="Licensing" Directory="INSTALLFOLDER">
22 + <File Id="LICENSE.TXT" Source="LICENSE.TXT" />
23 + </Component>
24 +
25 + <Component Id="ProductRegistration" Directory="INSTALLFOLDER">
26 + <RegistryKey Root="HKLM" Key="SOFTWARE\Microsoft\Windows Installer XML\$(var.WixMajorMinor)">
27 + <RegistryValue Name="InstallFolder" Value="[INSTALLFOLDER]" Type="string" />
28 + </RegistryKey>
29 + </Component>
30 +
31 + <Component Id="ProductFamilyRegistration" Directory="INSTALLFOLDER">
32 + <RegistryKey Root="HKLM" Key="SOFTWARE\Microsoft\Windows Installer XML\$(var.WixMajor).x">
33 + <RegistryValue Name="v$(var.WixMajorMinor)" Value="[INSTALLFOLDER]" Type="string" />
34 + </RegistryKey>
35 + </Component>
36 +
37 + <Component Id="ProductInformation" Directory="BinFolder">
38 + <RegistryKey Root="HKLM" Key="SOFTWARE\Microsoft\Windows Installer XML\$(var.WixMajorMinor)">
39 + <RegistryValue Name="InstallRoot" Value="[BinFolder]" Type="string" />
40 + <RegistryValue Name="ProductVersion" Value="[ProductVersion]" Type="string" />
41 + </RegistryKey>
42 +
43 + <RemoveFolder Id="CleanupShortcutFolder" Directory="ShortcutFolder" On="uninstall" />
44 + </Component>
45 +
46 + <Component Directory="BinFolder">
47 + <File Id="wixtoolset.org.ico" Source="common\wixtoolset.org.ico" />
48 + <util:InternetShortcut Id="wixtoolset.org" Directory="ShortcutFolder" Name="WiX Home Page" Target="http://wixtoolset.org/" IconFile="file://[#wixtoolset.org.ico]" />
49 + </Component>
50 +
51 + <ComponentGroupRef Id="ToolsetComponents" />
52 + <ComponentGroupRef Id="ExtensionComponents" />
53 + <ComponentGroupRef Id="LuxComponents" />
54 + <ComponentGroupRef Id="DocComponents" />
55 + </Feature>
56 +
57 + <FeatureRef Id="Feature_MSBuild" />
58 + <FeatureRef Id="Feature_Intellisense2010" />
59 + <FeatureRef Id="Feature_Intellisense2012" />
60 + <FeatureRef Id="Feature_Intellisense2013" />
61 + <FeatureRef Id="Feature_Intellisense2015" />
62 + </Product>
63 +</Wix>
src/test/WixToolsetTest.WixCop/WixCopFixture.cs
+94
@@ -3,6 +3,7 @@
3 namespace WixToolsetTest.WixCop
4 {
5 using System.IO;
6 + using System.Linq;
7 using WixBuildTools.TestSupport;
8 using Xunit;
9
@@ -99,5 +100,98 @@ namespace WixToolsetTest.WixCop
100 Assert.Equal(0, result2.ExitCode);
101 }
102 }
103 +
104 + [Fact]
105 + public void CanConvertQtExec()
106 + {
107 + const string beforeFileName = "v3.wxs";
108 + const string afterFileName = "v4_expected.wxs";
109 + var folder = TestData.Get(@"TestData\QtExec");
110 +
111 + using (var fs = new DisposableFileSystem())
112 + {
113 + var baseFolder = fs.GetFolder(true);
114 + var targetFile = Path.Combine(baseFolder, beforeFileName);
115 + File.Copy(Path.Combine(folder, beforeFileName), Path.Combine(baseFolder, beforeFileName));
116 +
117 + var runner = new WixCopRunner
118 + {
119 + FixErrors = true,
120 + SearchPatterns =
121 + {
122 + targetFile,
123 + },
124 + };
125 +
126 + var result = runner.Execute();
127 +
128 + Assert.Equal(2, result.ExitCode);
129 +
130 + var expected = File.ReadAllText(Path.Combine(folder, afterFileName)).Replace("\r\n", "\n");
131 + var actual = File.ReadAllText(targetFile).Replace("\r\n", "\n");
132 + Assert.Equal(expected, actual);
133 +
134 + var runner2 = new WixCopRunner
135 + {
136 + FixErrors = true,
137 + SearchPatterns =
138 + {
139 + targetFile,
140 + },
141 + };
142 +
143 + var result2 = runner2.Execute();
144 +
145 + Assert.Equal(0, result2.ExitCode);
146 + }
147 + }
148 +
149 + [Fact]
150 + public void DetectUnconvertableQtExecCmdTimeout()
151 + {
152 + const string beforeFileName = "v3.wxs";
153 + const string afterFileName = "v4_expected.wxs";
154 + var folder = TestData.Get(@"TestData\QtExec.bad");
155 +
156 + using (var fs = new DisposableFileSystem())
157 + {
158 + var baseFolder = fs.GetFolder(true);
159 + var targetFile = Path.Combine(baseFolder, beforeFileName);
160 + File.Copy(Path.Combine(folder, beforeFileName), Path.Combine(baseFolder, beforeFileName));
161 +
162 + var runner = new WixCopRunner
163 + {
164 + FixErrors = true,
165 + SearchPatterns =
166 + {
167 + targetFile,
168 + },
169 + };
170 +
171 + var result = runner.Execute();
172 +
173 + Assert.Equal(2, result.ExitCode);
174 +
175 + Assert.Single(result.Messages.Where(message => message.ToString().EndsWith("(QtExecCmdTimeoutAmbiguous)")));
176 +
177 + var expected = File.ReadAllText(Path.Combine(folder, afterFileName)).Replace("\r\n", "\n");
178 + var actual = File.ReadAllText(targetFile).Replace("\r\n", "\n");
179 + Assert.Equal(expected, actual);
180 +
181 + // still fails because QtExecCmdTimeoutAmbiguous is unfixable
182 + var runner2 = new WixCopRunner
183 + {
184 + FixErrors = true,
185 + SearchPatterns =
186 + {
187 + targetFile,
188 + },
189 + };
190 +
191 + var result2 = runner2.Execute();
192 +
193 + Assert.Equal(2, result2.ExitCode);
194 + }
195 + }
196 }
197 }
src/test/WixToolsetTest.WixCop/WixToolsetTest.WixCop.csproj
+4
@@ -18,6 +18,10 @@
18 <Content Include="TestData\Preprocessor\ConvertedPreprocessor.wxs" CopyToOutputDirectory="PreserveNewest" />
19 <Content Include="TestData\Preprocessor\Preprocessor.wxs" CopyToOutputDirectory="PreserveNewest" />
20 <Content Include="TestData\Preprocessor\wixcop.settings.xml" CopyToOutputDirectory="PreserveNewest" />
21 + <Content Include="TestData\QtExec\v3.wxs" CopyToOutputDirectory="PreserveNewest" />
22 + <Content Include="TestData\QtExec\v4_expected.wxs" CopyToOutputDirectory="PreserveNewest" />
23 + <Content Include="TestData\QtExec.bad\v3.wxs" CopyToOutputDirectory="PreserveNewest" />
24 + <Content Include="TestData\QtExec.bad\v4_expected.wxs" CopyToOutputDirectory="PreserveNewest" />
25 </ItemGroup>
26
27 <ItemGroup>
src/wixcop/Converter.cs
+64 -2
@@ -28,6 +28,8 @@ namespace WixToolset.Tools.WixCop
28 private static readonly XName MspPackageElementName = WixNamespace + "MspPackage";
29 private static readonly XName MsuPackageElementName = WixNamespace + "MsuPackage";
30 private static readonly XName PayloadElementName = WixNamespace + "Payload";
31 + private static readonly XName CustomActionElementName = WixNamespace + "CustomAction";
32 + private static readonly XName PropertyElementName = WixNamespace + "Property";
33 private static readonly XName WixElementWithoutNamespaceName = XNamespace.None + "Wix";
34
35 private static readonly Dictionary<string, XNamespace> OldToNewNamespaceMapping = new Dictionary<string, XNamespace>()
@@ -88,6 +90,8 @@ namespace WixToolset.Tools.WixCop
90 { Converter.MspPackageElementName, this.ConvertSuppressSignatureValidation },
91 { Converter.MsuPackageElementName, this.ConvertSuppressSignatureValidation },
92 { Converter.PayloadElementName, this.ConvertSuppressSignatureValidation },
93 + { Converter.CustomActionElementName, this.ConvertCustomActionElement },
94 + { Converter.PropertyElementName, this.ConvertPropertyElement },
95 { Converter.WixElementWithoutNamespaceName, this.ConvertWixElementWithoutNamespace }
96 };
97
@@ -263,7 +267,7 @@ namespace WixToolset.Tools.WixCop
267 }
268 }
269 }
266 -
270 +
271 private void ConvertElement(XElement element)
272 {
273 // Gather any deprecated namespaces, then update this element tree based on those deprecations.
@@ -324,7 +328,7 @@ namespace WixToolset.Tools.WixCop
328
329 if (null != suppressSignatureValidation)
330 {
327 - if (this.OnError(ConverterTestType.SuppressSignatureValidationDeprecated, element, "The chain package element contains deprecated '{0}' attribute. Use the 'EnableSignatureValidation' instead.", suppressSignatureValidation))
331 + if (this.OnError(ConverterTestType.SuppressSignatureValidationDeprecated, element, "The chain package element contains deprecated '{0}' attribute. Use the 'EnableSignatureValidation' attribute instead.", suppressSignatureValidation))
332 {
333 if ("no" == suppressSignatureValidation.Value)
334 {
@@ -336,6 +340,49 @@ namespace WixToolset.Tools.WixCop
340 }
341 }
342
343 + private void ConvertCustomActionElement(XElement xCustomAction)
344 + {
345 + var xBinaryKey = xCustomAction.Attribute("BinaryKey");
346 +
347 + if (xBinaryKey?.Value == "WixCA")
348 + {
349 + if (this.OnError(ConverterTestType.WixCABinaryIdRenamed, xCustomAction, "The WixCA custom action DLL Binary table id has been renamed. Use the id 'UtilCA' instead."))
350 + {
351 + xBinaryKey.Value = "UtilCA";
352 + }
353 + }
354 +
355 + var xDllEntry = xCustomAction.Attribute("DllEntry");
356 +
357 + if (xDllEntry?.Value == "CAQuietExec" || xDllEntry?.Value == "CAQuietExec64")
358 + {
359 + if (this.OnError(ConverterTestType.QuietExecCustomActionsRenamed, xCustomAction, "The CAQuietExec and CAQuietExec64 custom action ids have been renamed. Use the ids 'WixQuietExec' and 'WixQuietExec64' instead."))
360 + {
361 + xDllEntry.Value = xDllEntry.Value.Replace("CAQuietExec", "WixQuietExec");
362 + }
363 + }
364 +
365 + var xProperty = xCustomAction.Attribute("Property");
366 +
367 + if (xProperty?.Value == "QtExecCmdLine" || xProperty?.Value == "QtExec64CmdLine")
368 + {
369 + if (this.OnError(ConverterTestType.QuietExecCustomActionsRenamed, xCustomAction, "The QtExecCmdLine and QtExec64CmdLine property ids have been renamed. Use the ids 'WixQuietExecCmdLine' and 'WixQuietExec64CmdLine' instead."))
370 + {
371 + xProperty.Value = xProperty.Value.Replace("QtExec", "WixQuietExec");
372 + }
373 + }
374 + }
375 +
376 + private void ConvertPropertyElement(XElement xProperty)
377 + {
378 + var xId = xProperty.Attribute("Id");
379 +
380 + if (xId.Value == "QtExecCmdTimeout")
381 + {
382 + this.OnError(ConverterTestType.QtExecCmdTimeoutAmbiguous, xProperty, "QtExecCmdTimeout was previously used for both CAQuietExec and CAQuietExec64. For WixQuietExec, use WixQuietExecCmdTimeout. For WixQuietExec64, use WixQuietExec64CmdTimeout.");
383 + }
384 + }
385 +
386 /// <summary>
387 /// Converts a Wix element.
388 /// </summary>
@@ -549,6 +596,21 @@ namespace WixToolset.Tools.WixCop
596 /// SuppressSignatureValidation attribute is deprecated and replaced with EnableSignatureValidation.
597 /// </summary>
598 SuppressSignatureValidationDeprecated,
599 +
600 + /// <summary>
601 + /// WixCA Binary/@Id has been renamed to UtilCA.
602 + /// </summary>
603 + WixCABinaryIdRenamed,
604 +
605 + /// <summary>
606 + /// QtExec custom actions have been renamed.
607 + /// </summary>
608 + QuietExecCustomActionsRenamed,
609 +
610 + /// <summary>
611 + /// QtExecCmdTimeout was previously used for both CAQuietExec and CAQuietExec64. For WixQuietExec, use WixQuietExecCmdTimeout. For WixQuietExec64, use WixQuietExec64CmdTimeout.
612 + /// </summary>
613 + QtExecCmdTimeoutAmbiguous,
614 }
615 }
616 }