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=""[VSENVPRODUCT80]\devenv.exe" /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=""[VSENVPRODUCT80]\devenv.exe" /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=""[VSENVPRODUCT80]\devenv.exe" /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=""[VSENVPRODUCT80]\devenv.exe" /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
}