Extract common converters code to Converters repo and use that instead
Rob Mensching committed
May 15, 2019 at 16:21 UTC
70d459c39d1716b2d26ffcbd2c4037d646b9ec37
5 files changed
+5
-1186
nuget.config
+1
@@ -2,6 +2,7 @@
2
<configuration>
3
<packageSources>
4
<clear />
5
+ <add key="wixtoolset-converters" value="https://ci.appveyor.com/nuget/wixtoolset-converters" />
6
<add key="wixtoolset-core" value="https://ci.appveyor.com/nuget/wixtoolset-core" />
7
<add key="wixtoolset-core-native" value="https://ci.appveyor.com/nuget/wixtoolset-core-native" />
8
<add key="wixtoolset-data" value="https://ci.appveyor.com/nuget/wixtoolset-data" />
src/test/WixToolsetTest.WixCop/ConverterFixture.cs
deleted
-554
@@ -1,554 +0,0 @@
1
-// 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.
2
-
3
-namespace WixToolsetTest.WixCop
4
-{
5
- using System;
6
- using System.IO;
7
- using System.Text;
8
- using System.Xml.Linq;
9
- using WixToolset.Data;
10
- using WixToolset.Extensibility;
11
- using WixToolset.Extensibility.Services;
12
- using WixToolset.Tools.WixCop;
13
- using Xunit;
14
-
15
- public class ConverterFixture
16
- {
17
- private static readonly XNamespace Wix4Namespace = "http://wixtoolset.org/schemas/v4/wxs";
18
-
19
- [Fact]
20
- public void EnsuresDeclaration()
21
- {
22
- var parse = String.Join(Environment.NewLine,
23
- "<Wix xmlns='http://wixtoolset.org/schemas/v4/wxs'>",
24
- " <Fragment />",
25
- "</Wix>");
26
-
27
- var expected = String.Join(Environment.NewLine,
28
- "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
29
- "<Wix xmlns=\"http://wixtoolset.org/schemas/v4/wxs\">",
30
- " <Fragment />",
31
- "</Wix>");
32
-
33
- var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
34
-
35
- var messaging = new DummyMessaging();
36
- var converter = new Converter(messaging, 2, null, null);
37
-
38
- var errors = converter.ConvertDocument(document);
39
-
40
- var actual = UnformattedDocumentString(document);
41
-
42
- Assert.Equal(1, errors);
43
- Assert.Equal(expected, actual);
44
- }
45
-
46
- [Fact]
47
- public void EnsuresUtf8Declaration()
48
- {
49
- var parse = String.Join(Environment.NewLine,
50
- "<?xml version='1.0'?>",
51
- "<Wix xmlns='http://wixtoolset.org/schemas/v4/wxs'>",
52
- " <Fragment />",
53
- "</Wix>");
54
-
55
- var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
56
-
57
- var messaging = new DummyMessaging();
58
- var converter = new Converter(messaging, 4, null, null);
59
-
60
- var errors = converter.ConvertDocument(document);
61
-
62
- Assert.Equal(1, errors);
63
- Assert.Equal("1.0", document.Declaration.Version);
64
- Assert.Equal("utf-8", document.Declaration.Encoding);
65
- }
66
-
67
- [Fact]
68
- public void CanFixWhitespace()
69
- {
70
- var parse = String.Join(Environment.NewLine,
71
- "<?xml version='1.0' encoding='utf-8'?>",
72
- "<Wix xmlns='http://wixtoolset.org/schemas/v4/wxs'>",
73
- " <Fragment>",
74
- " <Property Id='Prop'",
75
- " Value='Val'>",
76
- " </Property>",
77
- " </Fragment>",
78
- "</Wix>");
79
-
80
- var expected = String.Join(Environment.NewLine,
81
- "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
82
- "<Wix xmlns=\"http://wixtoolset.org/schemas/v4/wxs\">",
83
- " <Fragment>",
84
- " <Property Id=\"Prop\" Value=\"Val\" />",
85
- " </Fragment>",
86
- "</Wix>");
87
-
88
- var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
89
-
90
- var messaging = new DummyMessaging();
91
- var converter = new Converter(messaging, 4, null, null);
92
-
93
- var errors = converter.ConvertDocument(document);
94
-
95
- var actual = UnformattedDocumentString(document);
96
-
97
- Assert.Equal(expected, actual);
98
- Assert.Equal(4, errors);
99
- }
100
-
101
- [Fact]
102
- public void CanPreserveNewLines()
103
- {
104
- var parse = String.Join(Environment.NewLine,
105
- "<?xml version='1.0' encoding='utf-8'?>",
106
- "<Wix xmlns='http://wixtoolset.org/schemas/v4/wxs'>",
107
- " <Fragment>",
108
- "",
109
- " <Property Id='Prop' Value='Val' />",
110
- "",
111
- " </Fragment>",
112
- "</Wix>");
113
-
114
- var expected = String.Join(Environment.NewLine,
115
- "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
116
- "<Wix xmlns=\"http://wixtoolset.org/schemas/v4/wxs\">",
117
- " <Fragment>",
118
- "",
119
- " <Property Id=\"Prop\" Value=\"Val\" />",
120
- "",
121
- " </Fragment>",
122
- "</Wix>");
123
-
124
- var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
125
-
126
- var messaging = new DummyMessaging();
127
- var converter = new Converter(messaging, 4, null, null);
128
-
129
- var conversions = converter.ConvertDocument(document);
130
-
131
- var actual = UnformattedDocumentString(document);
132
-
133
- Assert.Equal(expected, actual);
134
- Assert.Equal(3, conversions);
135
- }
136
-
137
- [Fact]
138
- public void CanConvertWithNewLineAtEndOfFile()
139
- {
140
- var parse = String.Join(Environment.NewLine,
141
- "<?xml version='1.0' encoding='utf-8'?>",
142
- "<Wix xmlns='http://wixtoolset.org/schemas/v4/wxs'>",
143
- " <Fragment>",
144
- "",
145
- " <Property Id='Prop' Value='Val' />",
146
- "",
147
- " </Fragment>",
148
- "</Wix>",
149
- "");
150
-
151
- var expected = String.Join(Environment.NewLine,
152
- "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
153
- "<Wix xmlns=\"http://wixtoolset.org/schemas/v4/wxs\">",
154
- " <Fragment>",
155
- "",
156
- " <Property Id=\"Prop\" Value=\"Val\" />",
157
- "",
158
- " </Fragment>",
159
- "</Wix>",
160
- "");
161
-
162
- var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
163
-
164
- var messaging = new DummyMessaging();
165
- var converter = new Converter(messaging, 4, null, null);
166
-
167
- var conversions = converter.ConvertDocument(document);
168
-
169
- var actual = UnformattedDocumentString(document);
170
-
171
- Assert.Equal(expected, actual);
172
- Assert.Equal(3, conversions);
173
- }
174
-
175
- [Fact]
176
- public void CanFixCdataWhitespace()
177
- {
178
- var parse = String.Join(Environment.NewLine,
179
- "<?xml version='1.0' encoding='utf-8'?>",
180
- "<Wix xmlns='http://wixtoolset.org/schemas/v4/wxs'>",
181
- " <Fragment>",
182
- " <Property Id='Prop'>",
183
- " <![CDATA[1<2]]>",
184
- " </Property>",
185
- " </Fragment>",
186
- "</Wix>");
187
-
188
- var expected = String.Join(Environment.NewLine,
189
- "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
190
- "<Wix xmlns=\"http://wixtoolset.org/schemas/v4/wxs\">",
191
- " <Fragment>",
192
- " <Property Id=\"Prop\"><![CDATA[1<2]]></Property>",
193
- " </Fragment>",
194
- "</Wix>");
195
-
196
- var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
197
-
198
- var messaging = new DummyMessaging();
199
- var converter = new Converter(messaging, 2, null, null);
200
-
201
- var errors = converter.ConvertDocument(document);
202
-
203
- var actual = UnformattedDocumentString(document);
204
-
205
- Assert.Equal(expected, actual);
206
- Assert.Equal(2, errors);
207
- }
208
-
209
- [Fact]
210
- public void CanFixCdataWithWhitespace()
211
- {
212
- var parse = String.Join(Environment.NewLine,
213
- "<?xml version='1.0' encoding='utf-8'?>",
214
- "<Wix xmlns='http://wixtoolset.org/schemas/v4/wxs'>",
215
- " <Fragment>",
216
- " <Property Id='Prop'>",
217
- " <![CDATA[",
218
- " 1<2",
219
- " ]]>",
220
- " </Property>",
221
- " </Fragment>",
222
- "</Wix>");
223
-
224
- var expected = String.Join(Environment.NewLine,
225
- "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
226
- "<Wix xmlns=\"http://wixtoolset.org/schemas/v4/wxs\">",
227
- " <Fragment>",
228
- " <Property Id=\"Prop\"><![CDATA[1<2]]></Property>",
229
- " </Fragment>",
230
- "</Wix>");
231
-
232
- var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
233
-
234
- var messaging = new DummyMessaging();
235
- var converter = new Converter(messaging, 2, null, null);
236
-
237
- var errors = converter.ConvertDocument(document);
238
-
239
- var actual = UnformattedDocumentString(document);
240
-
241
- Assert.Equal(expected, actual);
242
- Assert.Equal(2, errors);
243
- }
244
-
245
- [Fact]
246
- public void CanConvertMainNamespace()
247
- {
248
- var parse = String.Join(Environment.NewLine,
249
- "<?xml version='1.0' encoding='utf-8'?>",
250
- "<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>",
251
- " <Fragment />",
252
- "</Wix>");
253
-
254
- var expected = String.Join(Environment.NewLine,
255
- "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
256
- "<Wix xmlns=\"http://wixtoolset.org/schemas/v4/wxs\">",
257
- " <Fragment />",
258
- "</Wix>");
259
-
260
- var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
261
-
262
- var messaging = new DummyMessaging();
263
- var converter = new Converter(messaging, 2, null, null);
264
-
265
- var errors = converter.ConvertDocument(document);
266
-
267
- var actual = UnformattedDocumentString(document);
268
-
269
- Assert.Equal(1, errors);
270
- //Assert.Equal(Wix4Namespace, document.Root.GetDefaultNamespace());
271
- Assert.Equal(expected, actual);
272
- }
273
-
274
- [Fact]
275
- public void CanConvertNamedMainNamespace()
276
- {
277
- var parse = String.Join(Environment.NewLine,
278
- "<?xml version='1.0' encoding='utf-8'?>",
279
- "<w:Wix xmlns:w='http://schemas.microsoft.com/wix/2006/wi'>",
280
- " <w:Fragment />",
281
- "</w:Wix>");
282
-
283
- var expected = String.Join(Environment.NewLine,
284
- "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
285
- "<w:Wix xmlns:w=\"http://wixtoolset.org/schemas/v4/wxs\">",
286
- " <w:Fragment />",
287
- "</w:Wix>");
288
-
289
- var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
290
-
291
- var messaging = new DummyMessaging();
292
- var converter = new Converter(messaging, 2, null, null);
293
-
294
- var errors = converter.ConvertDocument(document);
295
-
296
- var actual = UnformattedDocumentString(document);
297
-
298
- Assert.Equal(1, errors);
299
- Assert.Equal(expected, actual);
300
- Assert.Equal(Wix4Namespace, document.Root.GetNamespaceOfPrefix("w"));
301
- }
302
-
303
- [Fact]
304
- public void CanConvertNonWixDefaultNamespace()
305
- {
306
- var parse = String.Join(Environment.NewLine,
307
- "<?xml version='1.0' encoding='utf-8'?>",
308
- "<w:Wix xmlns:w='http://schemas.microsoft.com/wix/2006/wi' xmlns='http://schemas.microsoft.com/wix/UtilExtension'>",
309
- " <w:Fragment>",
310
- " <Test />",
311
- " </w:Fragment>",
312
- "</w:Wix>");
313
-
314
- var expected = String.Join(Environment.NewLine,
315
- "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
316
- "<w:Wix xmlns:w=\"http://wixtoolset.org/schemas/v4/wxs\" xmlns=\"http://wixtoolset.org/schemas/v4/wxs/util\">",
317
- " <w:Fragment>",
318
- " <Test />",
319
- " </w:Fragment>",
320
- "</w:Wix>");
321
-
322
- var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
323
-
324
- var messaging = new DummyMessaging();
325
- var converter = new Converter(messaging, 2, null, null);
326
-
327
- var errors = converter.ConvertDocument(document);
328
-
329
- var actual = UnformattedDocumentString(document);
330
-
331
- Assert.Equal(expected, actual);
332
- Assert.Equal(2, errors);
333
- Assert.Equal(Wix4Namespace, document.Root.GetNamespaceOfPrefix("w"));
334
- Assert.Equal("http://wixtoolset.org/schemas/v4/wxs/util", document.Root.GetDefaultNamespace());
335
- }
336
-
337
- [Fact]
338
- public void CanConvertExtensionNamespace()
339
- {
340
- var parse = String.Join(Environment.NewLine,
341
- "<?xml version='1.0' encoding='utf-8'?>",
342
- "<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi' xmlns:util='http://schemas.microsoft.com/wix/UtilExtension'>",
343
- " <Fragment />",
344
- "</Wix>");
345
-
346
- var expected = String.Join(Environment.NewLine,
347
- "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
348
- "<Wix xmlns=\"http://wixtoolset.org/schemas/v4/wxs\" xmlns:util=\"http://wixtoolset.org/schemas/v4/wxs/util\">",
349
- " <Fragment />",
350
- "</Wix>");
351
-
352
- var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
353
-
354
- var messaging = new DummyMessaging();
355
- var converter = new Converter(messaging, 2, null, null);
356
-
357
- var errors = converter.ConvertDocument(document);
358
-
359
- var actual = UnformattedDocumentString(document);
360
-
361
- Assert.Equal(2, errors);
362
- Assert.Equal(expected, actual);
363
- Assert.Equal(Wix4Namespace, document.Root.GetDefaultNamespace());
364
- }
365
-
366
- [Fact]
367
- public void CanConvertMissingNamespace()
368
- {
369
- var parse = String.Join(Environment.NewLine,
370
- "<?xml version='1.0' encoding='utf-8'?>",
371
- "<Wix>",
372
- " <Fragment />",
373
- "</Wix>");
374
-
375
- var expected = String.Join(Environment.NewLine,
376
- "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
377
- "<Wix xmlns=\"http://wixtoolset.org/schemas/v4/wxs\">",
378
- " <Fragment />",
379
- "</Wix>");
380
-
381
- var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
382
-
383
- var messaging = new DummyMessaging();
384
- var converter = new Converter(messaging, 2, null, null);
385
-
386
- var errors = converter.ConvertDocument(document);
387
-
388
- var actual = UnformattedDocumentString(document);
389
-
390
- Assert.Equal(1, errors);
391
- Assert.Equal(expected, actual);
392
- Assert.Equal(Wix4Namespace, document.Root.GetDefaultNamespace());
393
- }
394
-
395
- [Fact]
396
- public void CanConvertAnonymousFile()
397
- {
398
- var parse = String.Join(Environment.NewLine,
399
- "<?xml version='1.0' encoding='utf-8'?>",
400
- "<Wix xmlns='http://wixtoolset.org/schemas/v4/wxs'>",
401
- " <File Source='path\\to\\foo.txt' />",
402
- "</Wix>");
403
-
404
- var expected = String.Join(Environment.NewLine,
405
- "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
406
- "<Wix xmlns=\"http://wixtoolset.org/schemas/v4/wxs\">",
407
- " <File Id=\"foo.txt\" Source=\"path\\to\\foo.txt\" />",
408
- "</Wix>");
409
-
410
- var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
411
-
412
- var messaging = new DummyMessaging();
413
- var converter = new Converter(messaging, 2, null, null);
414
-
415
- var errors = converter.ConvertDocument(document);
416
-
417
- var actual = UnformattedDocumentString(document);
418
-
419
- Assert.Equal(1, errors);
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
- {
454
- var parse = String.Join(Environment.NewLine,
455
- "<?xml version='1.0' encoding='utf-8'?>",
456
- "<Wix xmlns='http://wixtoolset.org/schemas/v4/wxs'>",
457
- " <MsiPackage SuppressSignatureValidation='no' />",
458
- "</Wix>");
459
-
460
- var expected = String.Join(Environment.NewLine,
461
- "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
462
- "<Wix xmlns=\"http://wixtoolset.org/schemas/v4/wxs\">",
463
- " <MsiPackage EnableSignatureValidation=\"yes\" />",
464
- "</Wix>");
465
-
466
- var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
467
-
468
- var messaging = new DummyMessaging();
469
- var converter = new Converter(messaging, 2, null, null);
470
-
471
- var errors = converter.ConvertDocument(document);
472
-
473
- var actual = UnformattedDocumentString(document);
474
-
475
- Assert.Equal(1, errors);
476
- Assert.Equal(expected, actual);
477
- }
478
-
479
- [Fact]
480
- public void CanConvertSuppressSignatureValidationYes()
481
- {
482
- var parse = String.Join(Environment.NewLine,
483
- "<?xml version='1.0' encoding='utf-8'?>",
484
- "<Wix xmlns='http://wixtoolset.org/schemas/v4/wxs'>",
485
- " <Payload SuppressSignatureValidation='yes' />",
486
- "</Wix>");
487
-
488
- var expected = String.Join(Environment.NewLine,
489
- "<?xml version=\"1.0\" encoding=\"utf-16\"?>",
490
- "<Wix xmlns=\"http://wixtoolset.org/schemas/v4/wxs\">",
491
- " <Payload />",
492
- "</Wix>");
493
-
494
- var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
495
-
496
- var messaging = new DummyMessaging();
497
- var converter = new Converter(messaging, 2, null, null);
498
-
499
- var errors = converter.ConvertDocument(document);
500
-
501
- var actual = UnformattedDocumentString(document);
502
-
503
- Assert.Equal(1, errors);
504
- Assert.Equal(expected, actual);
505
- }
506
-
507
- private static string UnformattedDocumentString(XDocument document)
508
- {
509
- var sb = new StringBuilder();
510
-
511
- using (var writer = new StringWriter(sb))
512
- {
513
- document.Save(writer, SaveOptions.DisableFormatting);
514
- }
515
-
516
- return sb.ToString();
517
- }
518
-
519
- private class DummyMessaging : IMessaging
520
- {
521
- public bool EncounteredError { get; set; }
522
-
523
- public int LastErrorNumber { get; set; }
524
-
525
- public bool ShowVerboseMessages { get; set; }
526
-
527
- public bool SuppressAllWarnings { get; set; }
528
-
529
- public bool WarningsAsError { get; set; }
530
-
531
- public void ElevateWarningMessage(int warningNumber)
532
- {
533
- }
534
-
535
- public string FormatMessage(Message message) => String.Empty;
536
-
537
- public void SetListener(IMessageListener listener)
538
- {
539
- }
540
-
541
- public void SuppressWarningMessage(int warningNumber)
542
- {
543
- }
544
-
545
- public void Write(Message message)
546
- {
547
- }
548
-
549
- public void Write(string message, bool verbose = false)
550
- {
551
- }
552
- }
553
- }
554
-}
src/wixcop/CommandLine/ConvertCommand.cs
+3
-2
@@ -6,6 +6,7 @@ namespace WixToolset.Tools.WixCop.CommandLine
6
using System.Collections.Generic;
7
using System.IO;
8
using System.Xml;
9
+ using WixToolset.Converters;
10
using WixToolset.Extensibility.Data;
11
using WixToolset.Extensibility.Services;
12
@@ -75,7 +76,7 @@ namespace WixToolset.Tools.WixCop.CommandLine
76
}
77
78
var messaging = this.ServiceProvider.GetService<IMessaging>();
78
- var converter = new Converter(messaging, this.IndentationAmount, this.ErrorsAsWarnings, this.IgnoreErrors);
79
+ var converter = new Wix3Converter(messaging, this.IndentationAmount, this.ErrorsAsWarnings, this.IgnoreErrors);
80
81
var errors = this.InspectSubDirectories(converter, Path.GetFullPath("."));
82
@@ -131,7 +132,7 @@ namespace WixToolset.Tools.WixCop.CommandLine
132
/// </summary>
133
/// <param name="directory">The directory whose sub-directories will be inspected.</param>
134
/// <returns>The number of errors that were found.</returns>
134
- private int InspectSubDirectories(Converter converter, string directory)
135
+ private int InspectSubDirectories(Wix3Converter converter, string directory)
136
{
137
var errors = 0;
138
src/wixcop/Converter.cs
deleted
-629
@@ -1,629 +0,0 @@
1
-// 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.
2
-
3
-namespace WixToolset.Tools.WixCop
4
-{
5
- using System;
6
- using System.Collections.Generic;
7
- using System.Globalization;
8
- using System.IO;
9
- using System.Linq;
10
- using System.Text;
11
- using System.Xml;
12
- using System.Xml.Linq;
13
- using WixToolset.Data;
14
- using WixToolset.Extensibility.Services;
15
- using WixToolset.Tools.Core;
16
-
17
- /// <summary>
18
- /// WiX source code converter.
19
- /// </summary>
20
- public class Converter
21
- {
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";
29
- private static readonly XName MspPackageElementName = WixNamespace + "MspPackage";
30
- private static readonly XName MsuPackageElementName = WixNamespace + "MsuPackage";
31
- private static readonly XName PayloadElementName = WixNamespace + "Payload";
32
- private static readonly XName CustomActionElementName = WixNamespace + "CustomAction";
33
- private static readonly XName PropertyElementName = WixNamespace + "Property";
34
- private static readonly XName WixElementWithoutNamespaceName = XNamespace.None + "Wix";
35
-
36
- private static readonly Dictionary<string, XNamespace> OldToNewNamespaceMapping = new Dictionary<string, XNamespace>()
37
- {
38
- { "http://schemas.microsoft.com/wix/BalExtension", "http://wixtoolset.org/schemas/v4/wxs/bal" },
39
- { "http://schemas.microsoft.com/wix/ComPlusExtension", "http://wixtoolset.org/schemas/v4/wxs/complus" },
40
- { "http://schemas.microsoft.com/wix/DependencyExtension", "http://wixtoolset.org/schemas/v4/wxs/dependency" },
41
- { "http://schemas.microsoft.com/wix/DifxAppExtension", "http://wixtoolset.org/schemas/v4/wxs/difxapp" },
42
- { "http://schemas.microsoft.com/wix/FirewallExtension", "http://wixtoolset.org/schemas/v4/wxs/firewall" },
43
- { "http://schemas.microsoft.com/wix/GamingExtension", "http://wixtoolset.org/schemas/v4/wxs/gaming" },
44
- { "http://schemas.microsoft.com/wix/IIsExtension", "http://wixtoolset.org/schemas/v4/wxs/iis" },
45
- { "http://schemas.microsoft.com/wix/MsmqExtension", "http://wixtoolset.org/schemas/v4/wxs/msmq" },
46
- { "http://schemas.microsoft.com/wix/NetFxExtension", "http://wixtoolset.org/schemas/v4/wxs/netfx" },
47
- { "http://schemas.microsoft.com/wix/PSExtension", "http://wixtoolset.org/schemas/v4/wxs/powershell" },
48
- { "http://schemas.microsoft.com/wix/SqlExtension", "http://wixtoolset.org/schemas/v4/wxs/sql" },
49
- { "http://schemas.microsoft.com/wix/TagExtension", "http://wixtoolset.org/schemas/v4/wxs/tag" },
50
- { "http://schemas.microsoft.com/wix/UtilExtension", "http://wixtoolset.org/schemas/v4/wxs/util" },
51
- { "http://schemas.microsoft.com/wix/VSExtension", "http://wixtoolset.org/schemas/v4/wxs/vs" },
52
- { "http://wixtoolset.org/schemas/thmutil/2010", "http://wixtoolset.org/schemas/v4/thmutil" },
53
- { "http://schemas.microsoft.com/wix/2009/Lux", "http://wixtoolset.org/schemas/v4/lux" },
54
- { "http://schemas.microsoft.com/wix/2006/wi", "http://wixtoolset.org/schemas/v4/wxs" },
55
- { "http://schemas.microsoft.com/wix/2006/localization", "http://wixtoolset.org/schemas/v4/wxl" },
56
- { "http://schemas.microsoft.com/wix/2006/libraries", "http://wixtoolset.org/schemas/v4/wixlib" },
57
- { "http://schemas.microsoft.com/wix/2006/objects", "http://wixtoolset.org/schemas/v4/wixobj" },
58
- { "http://schemas.microsoft.com/wix/2006/outputs", "http://wixtoolset.org/schemas/v4/wixout" },
59
- { "http://schemas.microsoft.com/wix/2007/pdbs", "http://wixtoolset.org/schemas/v4/wixpdb" },
60
- { "http://schemas.microsoft.com/wix/2003/04/actions", "http://wixtoolset.org/schemas/v4/wi/actions" },
61
- { "http://schemas.microsoft.com/wix/2006/tables", "http://wixtoolset.org/schemas/v4/wi/tables" },
62
- { "http://schemas.microsoft.com/wix/2006/WixUnit", "http://wixtoolset.org/schemas/v4/wixunit" },
63
- };
64
-
65
- private readonly Dictionary<XName, Action<XElement>> ConvertElementMapping;
66
-
67
- /// <summary>
68
- /// Instantiate a new Converter class.
69
- /// </summary>
70
- /// <param name="indentationAmount">Indentation value to use when validating leading whitespace.</param>
71
- /// <param name="errorsAsWarnings">Test errors to display as warnings.</param>
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
- {
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 },
81
- { Converter.MspPackageElementName, this.ConvertSuppressSignatureValidation },
82
- { Converter.MsuPackageElementName, this.ConvertSuppressSignatureValidation },
83
- { Converter.PayloadElementName, this.ConvertSuppressSignatureValidation },
84
- { Converter.CustomActionElementName, this.ConvertCustomActionElement },
85
- { Converter.PropertyElementName, this.ConvertPropertyElement },
86
- { Converter.WixElementWithoutNamespaceName, this.ConvertWixElementWithoutNamespace },
87
- };
88
-
89
- this.Messaging = messaging;
90
-
91
- this.IndentationAmount = indentationAmount;
92
-
93
- this.ErrorsAsWarnings = new HashSet<ConverterTestType>(this.YieldConverterTypes(errorsAsWarnings));
94
-
95
- this.IgnoreErrors = new HashSet<ConverterTestType>(this.YieldConverterTypes(ignoreErrors));
96
- }
97
-
98
- private int Errors { get; set; }
99
-
100
- private HashSet<ConverterTestType> ErrorsAsWarnings { get; set; }
101
-
102
- private HashSet<ConverterTestType> IgnoreErrors { get; set; }
103
-
104
- private IMessaging Messaging { get; }
105
-
106
- private int IndentationAmount { get; set; }
107
-
108
- private string SourceFile { get; set; }
109
-
110
- /// <summary>
111
- /// Convert a file.
112
- /// </summary>
113
- /// <param name="sourceFile">The file to convert.</param>
114
- /// <param name="saveConvertedFile">Option to save the converted errors that are found.</param>
115
- /// <returns>The number of errors found.</returns>
116
- public int ConvertFile(string sourceFile, bool saveConvertedFile)
117
- {
118
- XDocument document;
119
-
120
- // Set the instance info.
121
- this.Errors = 0;
122
- this.SourceFile = sourceFile;
123
-
124
- try
125
- {
126
- document = XDocument.Load(this.SourceFile, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
127
- }
128
- catch (XmlException e)
129
- {
130
- this.OnError(ConverterTestType.XmlException, null, "The xml is invalid. Detail: '{0}'", e.Message);
131
-
132
- return this.Errors;
133
- }
134
-
135
- this.ConvertDocument(document);
136
-
137
- // Fix errors if requested and necessary.
138
- if (saveConvertedFile && 0 < this.Errors)
139
- {
140
- try
141
- {
142
- using (var writer = File.CreateText(this.SourceFile))
143
- {
144
- document.Save(writer, SaveOptions.DisableFormatting | SaveOptions.OmitDuplicateNamespaces);
145
- }
146
- }
147
- catch (UnauthorizedAccessException)
148
- {
149
- this.OnError(ConverterTestType.UnauthorizedAccessException, null, "Could not write to file.");
150
- }
151
- }
152
-
153
- return this.Errors;
154
- }
155
-
156
- /// <summary>
157
- /// Convert a document.
158
- /// </summary>
159
- /// <param name="document">The document to convert.</param>
160
- /// <returns>The number of errors found.</returns>
161
- public int ConvertDocument(XDocument document)
162
- {
163
- var declaration = document.Declaration;
164
-
165
- // Convert the declaration.
166
- if (null != declaration)
167
- {
168
- if (!String.Equals("utf-8", declaration.Encoding, StringComparison.OrdinalIgnoreCase))
169
- {
170
- if (this.OnError(ConverterTestType.DeclarationEncodingWrong, document.Root, "The XML declaration encoding is not properly set to 'utf-8'."))
171
- {
172
- declaration.Encoding = "utf-8";
173
- }
174
- }
175
- }
176
- else // missing declaration
177
- {
178
- if (this.OnError(ConverterTestType.DeclarationMissing, null, "This file is missing an XML declaration on the first line."))
179
- {
180
- document.Declaration = new XDeclaration("1.0", "utf-8", null);
181
- document.Root.AddBeforeSelf(new XText(XDocumentNewLine.ToString()));
182
- }
183
- }
184
-
185
- // Start converting the nodes at the top.
186
- this.ConvertNodes(document.Nodes(), 0);
187
-
188
- return this.Errors;
189
- }
190
-
191
- private void ConvertNodes(IEnumerable<XNode> nodes, int level)
192
- {
193
- // Note we operate on a copy of the node list since we may
194
- // remove some whitespace nodes during this processing.
195
- foreach (var node in nodes.ToList())
196
- {
197
- if (node is XText text)
198
- {
199
- if (!String.IsNullOrWhiteSpace(text.Value))
200
- {
201
- text.Value = text.Value.Trim();
202
- }
203
- else if (node.NextNode is XCData cdata)
204
- {
205
- this.EnsurePrecedingWhitespaceRemoved(text, node, ConverterTestType.WhitespacePrecedingNodeWrong);
206
- }
207
- else if (node.NextNode is XElement element)
208
- {
209
- this.EnsurePrecedingWhitespaceCorrect(text, node, level, ConverterTestType.WhitespacePrecedingNodeWrong);
210
- }
211
- else if (node.NextNode is null) // this is the space before the close element
212
- {
213
- if (node.PreviousNode is null || node.PreviousNode is XCData)
214
- {
215
- this.EnsurePrecedingWhitespaceRemoved(text, node.Parent, ConverterTestType.WhitespacePrecedingEndElementWrong);
216
- }
217
- else if (level == 0) // root element's close tag
218
- {
219
- this.EnsurePrecedingWhitespaceCorrect(text, node, 0, ConverterTestType.WhitespacePrecedingEndElementWrong);
220
- }
221
- else
222
- {
223
- this.EnsurePrecedingWhitespaceCorrect(text, node, level - 1, ConverterTestType.WhitespacePrecedingEndElementWrong);
224
- }
225
- }
226
- }
227
- else if (node is XElement element)
228
- {
229
- this.ConvertElement(element);
230
-
231
- this.ConvertNodes(element.Nodes(), level + 1);
232
- }
233
- }
234
- }
235
-
236
- private void EnsurePrecedingWhitespaceCorrect(XText whitespace, XNode node, int level, ConverterTestType testType)
237
- {
238
- if (!Converter.LeadingWhitespaceValid(this.IndentationAmount, level, whitespace.Value))
239
- {
240
- var message = testType == ConverterTestType.WhitespacePrecedingEndElementWrong ? "The whitespace preceding this end element is incorrect." : "The whitespace preceding this node is incorrect.";
241
-
242
- if (this.OnError(testType, node, message))
243
- {
244
- Converter.FixupWhitespace(this.IndentationAmount, level, whitespace);
245
- }
246
- }
247
- }
248
-
249
- private void EnsurePrecedingWhitespaceRemoved(XText whitespace, XNode node, ConverterTestType testType)
250
- {
251
- if (!String.IsNullOrEmpty(whitespace.Value))
252
- {
253
- var message = testType == ConverterTestType.WhitespacePrecedingEndElementWrong ? "The whitespace preceding this end element is incorrect." : "The whitespace preceding this node is incorrect.";
254
-
255
- if (this.OnError(testType, node, message))
256
- {
257
- whitespace.Remove();
258
- }
259
- }
260
- }
261
-
262
- private void ConvertElement(XElement element)
263
- {
264
- // Gather any deprecated namespaces, then update this element tree based on those deprecations.
265
- var deprecatedToUpdatedNamespaces = new Dictionary<XNamespace, XNamespace>();
266
-
267
- foreach (var declaration in element.Attributes().Where(a => a.IsNamespaceDeclaration))
268
- {
269
- if (Converter.OldToNewNamespaceMapping.TryGetValue(declaration.Value, out var ns))
270
- {
271
- if (this.OnError(ConverterTestType.XmlnsValueWrong, declaration, "The namespace '{0}' is out of date. It must be '{1}'.", declaration.Value, ns.NamespaceName))
272
- {
273
- deprecatedToUpdatedNamespaces.Add(declaration.Value, ns);
274
- }
275
- }
276
- }
277
-
278
- if (deprecatedToUpdatedNamespaces.Any())
279
- {
280
- Converter.UpdateElementsWithDeprecatedNamespaces(element.DescendantsAndSelf(), deprecatedToUpdatedNamespaces);
281
- }
282
-
283
- // Apply any specialized conversion actions.
284
- if (this.ConvertElementMapping.TryGetValue(element.Name, out var convert))
285
- {
286
- convert(element);
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"))
310
- {
311
- var attribute = element.Attribute("Name");
312
-
313
- if (null == attribute)
314
- {
315
- attribute = element.Attribute("Source");
316
- }
317
-
318
- if (null != attribute)
319
- {
320
- var name = Path.GetFileName(attribute.Value);
321
-
322
- if (this.OnError(ConverterTestType.AssignAnonymousFileId, element, "The file id is being updated to '{0}' to ensure it remains the same as the default", name))
323
- {
324
- IEnumerable<XAttribute> attributes = element.Attributes().ToList();
325
- element.RemoveAttributes();
326
- element.Add(new XAttribute("Id", ToolsCommon.GetIdentifierFromName(name)));
327
- element.Add(attributes);
328
- }
329
- }
330
- }
331
- }
332
-
333
- private void ConvertSuppressSignatureValidation(XElement element)
334
- {
335
- var suppressSignatureValidation = element.Attribute("SuppressSignatureValidation");
336
-
337
- if (null != suppressSignatureValidation)
338
- {
339
- if (this.OnError(ConverterTestType.SuppressSignatureValidationDeprecated, element, "The chain package element contains deprecated '{0}' attribute. Use the 'EnableSignatureValidation' attribute instead.", suppressSignatureValidation))
340
- {
341
- if ("no" == suppressSignatureValidation.Value)
342
- {
343
- element.Add(new XAttribute("EnableSignatureValidation", "yes"));
344
- }
345
- }
346
-
347
- suppressSignatureValidation.Remove();
348
- }
349
- }
350
-
351
- private void ConvertCustomActionElement(XElement xCustomAction)
352
- {
353
- var xBinaryKey = xCustomAction.Attribute("BinaryKey");
354
-
355
- if (xBinaryKey?.Value == "WixCA")
356
- {
357
- if (this.OnError(ConverterTestType.WixCABinaryIdRenamed, xCustomAction, "The WixCA custom action DLL Binary table id has been renamed. Use the id 'UtilCA' instead."))
358
- {
359
- xBinaryKey.Value = "UtilCA";
360
- }
361
- }
362
-
363
- var xDllEntry = xCustomAction.Attribute("DllEntry");
364
-
365
- if (xDllEntry?.Value == "CAQuietExec" || xDllEntry?.Value == "CAQuietExec64")
366
- {
367
- if (this.OnError(ConverterTestType.QuietExecCustomActionsRenamed, xCustomAction, "The CAQuietExec and CAQuietExec64 custom action ids have been renamed. Use the ids 'WixQuietExec' and 'WixQuietExec64' instead."))
368
- {
369
- xDllEntry.Value = xDllEntry.Value.Replace("CAQuietExec", "WixQuietExec");
370
- }
371
- }
372
-
373
- var xProperty = xCustomAction.Attribute("Property");
374
-
375
- if (xProperty?.Value == "QtExecCmdLine" || xProperty?.Value == "QtExec64CmdLine")
376
- {
377
- if (this.OnError(ConverterTestType.QuietExecCustomActionsRenamed, xCustomAction, "The QtExecCmdLine and QtExec64CmdLine property ids have been renamed. Use the ids 'WixQuietExecCmdLine' and 'WixQuietExec64CmdLine' instead."))
378
- {
379
- xProperty.Value = xProperty.Value.Replace("QtExec", "WixQuietExec");
380
- }
381
- }
382
- }
383
-
384
- private void ConvertPropertyElement(XElement xProperty)
385
- {
386
- var xId = xProperty.Attribute("Id");
387
-
388
- if (xId.Value == "QtExecCmdTimeout")
389
- {
390
- this.OnError(ConverterTestType.QtExecCmdTimeoutAmbiguous, xProperty, "QtExecCmdTimeout was previously used for both CAQuietExec and CAQuietExec64. For WixQuietExec, use WixQuietExecCmdTimeout. For WixQuietExec64, use WixQuietExec64CmdTimeout.");
391
- }
392
- }
393
-
394
- /// <summary>
395
- /// Converts a Wix element.
396
- /// </summary>
397
- /// <param name="element">The Wix element to convert.</param>
398
- /// <returns>The converted element.</returns>
399
- private void ConvertWixElementWithoutNamespace(XElement element)
400
- {
401
- if (this.OnError(ConverterTestType.XmlnsMissing, element, "The xmlns attribute is missing. It must be present with a value of '{0}'.", WixNamespace.NamespaceName))
402
- {
403
- element.Name = WixNamespace.GetName(element.Name.LocalName);
404
-
405
- element.Add(new XAttribute("xmlns", WixNamespace.NamespaceName)); // set the default namespace.
406
-
407
- foreach (var elementWithoutNamespace in element.Elements().Where(e => XNamespace.None == e.Name.Namespace))
408
- {
409
- elementWithoutNamespace.Name = WixNamespace.GetName(elementWithoutNamespace.Name.LocalName);
410
- }
411
- }
412
- }
413
-
414
- private IEnumerable<ConverterTestType> YieldConverterTypes(IEnumerable<string> types)
415
- {
416
- if (null != types)
417
- {
418
- foreach (var type in types)
419
- {
420
-
421
- if (Enum.TryParse<ConverterTestType>(type, true, out var itt))
422
- {
423
- yield return itt;
424
- }
425
- else // not a known ConverterTestType
426
- {
427
- this.OnError(ConverterTestType.ConverterTestTypeUnknown, null, "Unknown error type: '{0}'.", type);
428
- }
429
- }
430
- }
431
- }
432
-
433
- private static void UpdateElementsWithDeprecatedNamespaces(IEnumerable<XElement> elements, Dictionary<XNamespace, XNamespace> deprecatedToUpdatedNamespaces)
434
- {
435
- foreach (var element in elements)
436
- {
437
-
438
- if (deprecatedToUpdatedNamespaces.TryGetValue(element.Name.Namespace, out var ns))
439
- {
440
- element.Name = ns.GetName(element.Name.LocalName);
441
- }
442
-
443
- // Remove all the attributes and add them back to with their namespace updated (as necessary).
444
- IEnumerable<XAttribute> attributes = element.Attributes().ToList();
445
- element.RemoveAttributes();
446
-
447
- foreach (var attribute in attributes)
448
- {
449
- var convertedAttribute = attribute;
450
-
451
- if (attribute.IsNamespaceDeclaration)
452
- {
453
- if (deprecatedToUpdatedNamespaces.TryGetValue(attribute.Value, out ns))
454
- {
455
- convertedAttribute = ("xmlns" == attribute.Name.LocalName) ? new XAttribute(attribute.Name.LocalName, ns.NamespaceName) : new XAttribute(XNamespace.Xmlns + attribute.Name.LocalName, ns.NamespaceName);
456
- }
457
- }
458
- else if (deprecatedToUpdatedNamespaces.TryGetValue(attribute.Name.Namespace, out ns))
459
- {
460
- convertedAttribute = new XAttribute(ns.GetName(attribute.Name.LocalName), attribute.Value);
461
- }
462
-
463
- element.Add(convertedAttribute);
464
- }
465
- }
466
- }
467
-
468
- /// <summary>
469
- /// Determine if the whitespace preceding a node is appropriate for its depth level.
470
- /// </summary>
471
- /// <param name="indentationAmount">Indentation value to use when validating leading whitespace.</param>
472
- /// <param name="level">The depth level that should match this whitespace.</param>
473
- /// <param name="whitespace">The whitespace to validate.</param>
474
- /// <returns>true if the whitespace is legal; false otherwise.</returns>
475
- private static bool LeadingWhitespaceValid(int indentationAmount, int level, string whitespace)
476
- {
477
- // Strip off leading newlines; there can be an arbitrary number of these.
478
- whitespace = whitespace.TrimStart(XDocumentNewLine);
479
-
480
- var indentation = new string(' ', level * indentationAmount);
481
-
482
- return whitespace == indentation;
483
- }
484
-
485
- /// <summary>
486
- /// Fix the whitespace in a whitespace node.
487
- /// </summary>
488
- /// <param name="indentationAmount">Indentation value to use when validating leading whitespace.</param>
489
- /// <param name="level">The depth level of the desired whitespace.</param>
490
- /// <param name="whitespace">The whitespace node to fix.</param>
491
- private static void FixupWhitespace(int indentationAmount, int level, XText whitespace)
492
- {
493
- var value = new StringBuilder(whitespace.Value.Length);
494
-
495
- // Keep any previous preceeding new lines.
496
- var newlines = whitespace.Value.TakeWhile(c => c == XDocumentNewLine).Count();
497
-
498
- // Ensure there is always at least one new line before the indentation.
499
- value.Append(XDocumentNewLine, newlines == 0 ? 1 : newlines);
500
-
501
- whitespace.Value = value.Append(' ', level * indentationAmount).ToString();
502
- }
503
-
504
- /// <summary>
505
- /// Output an error message to the console.
506
- /// </summary>
507
- /// <param name="converterTestType">The type of converter test.</param>
508
- /// <param name="node">The node that caused the error.</param>
509
- /// <param name="message">Detailed error message.</param>
510
- /// <param name="args">Additional formatted string arguments.</param>
511
- /// <returns>Returns true indicating that action should be taken on this error, and false if it should be ignored.</returns>
512
- private bool OnError(ConverterTestType converterTestType, XObject node, string message, params object[] args)
513
- {
514
- if (this.IgnoreErrors.Contains(converterTestType)) // ignore the error
515
- {
516
- return false;
517
- }
518
-
519
- // Increase the error count.
520
- this.Errors++;
521
-
522
- var sourceLine = (null == node) ? new SourceLineNumber(this.SourceFile ?? "wixcop.exe") : new SourceLineNumber(this.SourceFile, ((IXmlLineInfo)node).LineNumber);
523
- var warning = this.ErrorsAsWarnings.Contains(converterTestType);
524
- var display = String.Format(CultureInfo.CurrentCulture, message, args);
525
-
526
- var msg = new Message(sourceLine, warning ? MessageLevel.Warning : MessageLevel.Error, (int)converterTestType, "{0} ({1})", display, converterTestType.ToString());
527
-
528
- this.Messaging.Write(msg);
529
-
530
- return true;
531
- }
532
-
533
- /// <summary>
534
- /// Converter test types. These are used to condition error messages down to warnings.
535
- /// </summary>
536
- private enum ConverterTestType
537
- {
538
- /// <summary>
539
- /// Internal-only: displayed when a string cannot be converted to an ConverterTestType.
540
- /// </summary>
541
- ConverterTestTypeUnknown,
542
-
543
- /// <summary>
544
- /// Displayed when an XML loading exception has occurred.
545
- /// </summary>
546
- XmlException,
547
-
548
- /// <summary>
549
- /// Displayed when a file cannot be accessed; typically when trying to save back a fixed file.
550
- /// </summary>
551
- UnauthorizedAccessException,
552
-
553
- /// <summary>
554
- /// Displayed when the encoding attribute in the XML declaration is not 'UTF-8'.
555
- /// </summary>
556
- DeclarationEncodingWrong,
557
-
558
- /// <summary>
559
- /// Displayed when the XML declaration is missing from the source file.
560
- /// </summary>
561
- DeclarationMissing,
562
-
563
- /// <summary>
564
- /// Displayed when the whitespace preceding a CDATA node is wrong.
565
- /// </summary>
566
- WhitespacePrecedingCDATAWrong,
567
-
568
- /// <summary>
569
- /// Displayed when the whitespace preceding a node is wrong.
570
- /// </summary>
571
- WhitespacePrecedingNodeWrong,
572
-
573
- /// <summary>
574
- /// Displayed when an element is not empty as it should be.
575
- /// </summary>
576
- NotEmptyElement,
577
-
578
- /// <summary>
579
- /// Displayed when the whitespace following a CDATA node is wrong.
580
- /// </summary>
581
- WhitespaceFollowingCDATAWrong,
582
-
583
- /// <summary>
584
- /// Displayed when the whitespace preceding an end element is wrong.
585
- /// </summary>
586
- WhitespacePrecedingEndElementWrong,
587
-
588
- /// <summary>
589
- /// Displayed when the xmlns attribute is missing from the document element.
590
- /// </summary>
591
- XmlnsMissing,
592
-
593
- /// <summary>
594
- /// Displayed when the xmlns attribute on the document element is wrong.
595
- /// </summary>
596
- XmlnsValueWrong,
597
-
598
- /// <summary>
599
- /// Assign an identifier to a File element when on Id attribute is specified.
600
- /// </summary>
601
- AssignAnonymousFileId,
602
-
603
- /// <summary>
604
- /// SuppressSignatureValidation attribute is deprecated and replaced with EnableSignatureValidation.
605
- /// </summary>
606
- SuppressSignatureValidationDeprecated,
607
-
608
- /// <summary>
609
- /// WixCA Binary/@Id has been renamed to UtilCA.
610
- /// </summary>
611
- WixCABinaryIdRenamed,
612
-
613
- /// <summary>
614
- /// QtExec custom actions have been renamed.
615
- /// </summary>
616
- QuietExecCustomActionsRenamed,
617
-
618
- /// <summary>
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
-}
src/wixcop/WixCop.csproj
+1
-1
@@ -21,7 +21,7 @@
21
</ItemGroup>
22
23
<ItemGroup>
24
- <PackageReference Include="WixToolset.Core" Version="4.0.*" />
24
+ <PackageReference Include="WixToolset.Converters" Version="4.0.*" />
25
</ItemGroup>
26
27
<ItemGroup>