@joebigelow / wix / commits / db8641b5

Make WixCop move Directory/@ShortName to @Name. (#7)

Fixes wixtoolset/issues#5652.

Sean Hall committed Dec 10, 2018 at 22:52 UTC db8641b5ab125679b028848d1747d7a4cef6fc37
3 files changed +54 -13
Tools.sln
+1 -1
@@ -22,7 +22,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixCop", "src\wixcop\WixCop
22 EndProject
23 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolset.Tools.Core", "src\WixToolset.Tools.Core\WixToolset.Tools.Core.csproj", "{9C3B486F-AE0E-43BA-823A-30808B73C6B4}"
24 EndProject
25 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixCopTests", "src\test\wixcop\WixCopTests.csproj", "{F1A8112B-95A1-4AF7-81CB-523BE7DB8E5C}"
25 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolsetTest.WixCop", "src\test\WixToolsetTest.WixCop\WixToolsetTest.WixCop.csproj", "{F1A8112B-95A1-4AF7-81CB-523BE7DB8E5C}"
26 EndProject
27 Global
28 GlobalSection(SolutionConfigurationPlatforms) = preSolution
src/test/WixToolsetTest.WixCop/ConverterFixture.cs
+28
@@ -420,6 +420,34 @@ namespace WixToolsetTest.WixCop
420 Assert.Equal(expected, actual);
421 }
422
423 + [Fact]
424 + public void CanConvertShortNameDirectoryWithoutName()
425 + {
426 + var parse = String.Join(Environment.NewLine,
427 + "<?xml version='1.0' encoding='utf-8'?>",
428 + "<Wix xmlns='http://wixtoolset.org/schemas/v4/wxs'>",
429 + " <Directory ShortName='iamshort' />",
430 + "</Wix>");
431 +
432 + var expected = String.Join(Environment.NewLine,
433 + "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
434 + "<Wix xmlns=\"http://wixtoolset.org/schemas/v4/wxs\">",
435 + " <Directory Name=\"iamshort\" />",
436 + "</Wix>");
437 +
438 + var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
439 +
440 + var messaging = new DummyMessaging();
441 + var converter = new Converter(messaging, 2, null, null);
442 +
443 + var errors = converter.ConvertDocument(document);
444 +
445 + var actual = UnformattedDocumentString(document);
446 +
447 + Assert.Equal(1, errors);
448 + Assert.Equal(expected, actual);
449 + }
450 +
451 [Fact]
452 public void CanConvertSuppressSignatureValidationNo()
453 {
src/wixcop/Converter.cs
+25 -12
@@ -22,6 +22,7 @@ namespace WixToolset.Tools.WixCop
22 private const char XDocumentNewLine = '\n'; // XDocument normalizes "\r\n" to just "\n".
23 private static readonly XNamespace WixNamespace = "http://wixtoolset.org/schemas/v4/wxs";
24
25 + private static readonly XName DirectoryElementName = WixNamespace + "Directory";
26 private static readonly XName FileElementName = WixNamespace + "File";
27 private static readonly XName ExePackageElementName = WixNamespace + "ExePackage";
28 private static readonly XName MsiPackageElementName = WixNamespace + "MsiPackage";
@@ -71,19 +72,9 @@ namespace WixToolset.Tools.WixCop
72 /// <param name="ignoreErrors">Test errors to ignore.</param>
73 public Converter(IMessaging messaging, int indentationAmount, IEnumerable<string> errorsAsWarnings = null, IEnumerable<string> ignoreErrors = null)
74 {
74 - // workaround IDE0009 bug
75 - /*this.ConvertElementMapping = new Dictionary<XName, Action<XElement>>()
76 - {
77 - { Converter.FileElementName, this.ConvertFileElement },
78 - { Converter.ExePackageElementName, this.ConvertSuppressSignatureValidation },
79 - { Converter.MsiPackageElementName, this.ConvertSuppressSignatureValidation },
80 - { Converter.MspPackageElementName, this.ConvertSuppressSignatureValidation },
81 - { Converter.MsuPackageElementName, this.ConvertSuppressSignatureValidation },
82 - { Converter.PayloadElementName, this.ConvertSuppressSignatureValidation },
83 - { Converter.WixElementWithoutNamespaceName, this.ConvertWixElementWithoutNamespace },
84 - };*/
75 this.ConvertElementMapping = new Dictionary<XName, Action<XElement>>
76 {
77 + { Converter.DirectoryElementName, this.ConvertDirectoryElement },
78 { Converter.FileElementName, this.ConvertFileElement },
79 { Converter.ExePackageElementName, this.ConvertSuppressSignatureValidation },
80 { Converter.MsiPackageElementName, this.ConvertSuppressSignatureValidation },
@@ -92,7 +83,7 @@ namespace WixToolset.Tools.WixCop
83 { Converter.PayloadElementName, this.ConvertSuppressSignatureValidation },
84 { Converter.CustomActionElementName, this.ConvertCustomActionElement },
85 { Converter.PropertyElementName, this.ConvertPropertyElement },
95 - { Converter.WixElementWithoutNamespaceName, this.ConvertWixElementWithoutNamespace }
86 + { Converter.WixElementWithoutNamespaceName, this.ConvertWixElementWithoutNamespace },
87 };
88
89 this.Messaging = messaging;
@@ -296,6 +287,23 @@ namespace WixToolset.Tools.WixCop
287 }
288 }
289
290 + private void ConvertDirectoryElement(XElement element)
291 + {
292 + if (null == element.Attribute("Name"))
293 + {
294 + var attribute = element.Attribute("ShortName");
295 + if (null != attribute)
296 + {
297 + var shortName = attribute.Value;
298 + if (this.OnError(ConverterTestType.AssignDirectoryNameFromShortName, element, "The directory ShortName attribute is being renamed to Name since Name wasn't specified for value '{0}'", shortName))
299 + {
300 + element.Add(new XAttribute("Name", shortName));
301 + attribute.Remove();
302 + }
303 + }
304 + }
305 + }
306 +
307 private void ConvertFileElement(XElement element)
308 {
309 if (null == element.Attribute("Id"))
@@ -611,6 +619,11 @@ namespace WixToolset.Tools.WixCop
619 /// QtExecCmdTimeout was previously used for both CAQuietExec and CAQuietExec64. For WixQuietExec, use WixQuietExecCmdTimeout. For WixQuietExec64, use WixQuietExec64CmdTimeout.
620 /// </summary>
621 QtExecCmdTimeoutAmbiguous,
622 +
623 + /// <summary>
624 + /// Directory/@ShortName may only be specified with Directory/@Name.
625 + /// </summary>
626 + AssignDirectoryNameFromShortName,
627 }
628 }
629 }