aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Mensching <rob@firegiant.com>2022-10-02 19:37:55 -0700
committerRob Mensching <rob@firegiant.com>2022-10-04 10:44:49 -0700
commit5c509f5611a45bdf9d252b88605537bd28f24a35 (patch)
treef2ac4c1509fe69f6489c56f257b59f4e346a51c7
parente901e04cfb8f1b759903f41b5c8f2f91e3f877aa (diff)
downloadwix-5c509f5611a45bdf9d252b88605537bd28f24a35.tar.gz
wix-5c509f5611a45bdf9d252b88605537bd28f24a35.tar.bz2
wix-5c509f5611a45bdf9d252b88605537bd28f24a35.zip
Move WixVersion to new WixToolset.Versioning package in libs segment
WixVersion is already used by the Core toolset but could also be useful for bootstrapper applications parsing bundle versions. The WixToolset.Data assembly contains a significant amount of data that bloats its size that bootstrapper applications would never need. Extracting WixVersion to its own assembly makes it much more useable. Fixes 6943
-rw-r--r--src/internal/SetBuildNumber/Directory.Packages.props.pp1
-rw-r--r--src/libs/WixToolset.Versioning/WixToolset.Versioning.csproj14
-rw-r--r--src/libs/WixToolset.Versioning/WixVersion.cs (renamed from src/api/wix/WixToolset.Data/WixVersion.cs)136
-rw-r--r--src/libs/WixToolset.Versioning/WixVersionComparer.cs253
-rw-r--r--src/libs/WixToolset.Versioning/WixVersionLabel.cs40
-rw-r--r--src/libs/dutil/WixToolset.DUtil/dutil.v3.ncrunchproject5
-rw-r--r--src/libs/dutil/test/DUtilUnitTest/DUtilUnitTest.v3.ncrunchproject5
-rw-r--r--src/libs/libs.cmd24
-rw-r--r--src/libs/libs.sln40
-rw-r--r--src/libs/libs.v3.ncrunchsolution6
-rw-r--r--src/libs/libs_t.proj2
-rw-r--r--src/libs/test/WixToolsetTest.Versioning/VerUtilTestsFixture.cs683
-rw-r--r--src/libs/test/WixToolsetTest.Versioning/WixToolsetTest.Versioning.csproj17
-rw-r--r--src/libs/test/WixToolsetTest.Versioning/WixVerFixture.cs (renamed from src/api/wix/test/WixToolsetTest.Data/WixVerFixture.cs)47
-rw-r--r--src/testresultfilelist.txt1
-rw-r--r--src/wix/WixToolset.Core.Burn/Bind/BindBundleCommand.cs1
-rw-r--r--src/wix/WixToolset.Core.Burn/Bundles/CreateBundleExeCommand.cs1
-rw-r--r--src/wix/WixToolset.Core.Burn/WixToolset.Core.Burn.csproj2
-rw-r--r--src/wix/WixToolset.Core.WindowsInstaller/Bind/ProcessPackageSoftwareTagsCommand.cs1
-rw-r--r--src/wix/WixToolset.Core.WindowsInstaller/WixToolset.Core.WindowsInstaller.csproj1
-rw-r--r--src/wix/WixToolset.Core/Common.cs1
-rw-r--r--src/wix/WixToolset.Core/ExtensibilityServices/BackendHelper.cs1
-rw-r--r--src/wix/WixToolset.Core/ExtensibilityServices/ParseHelper.cs1
-rw-r--r--src/wix/WixToolset.Core/WixToolset.Core.csproj1
24 files changed, 1275 insertions, 9 deletions
diff --git a/src/internal/SetBuildNumber/Directory.Packages.props.pp b/src/internal/SetBuildNumber/Directory.Packages.props.pp
index f77fcffa..d06990fe 100644
--- a/src/internal/SetBuildNumber/Directory.Packages.props.pp
+++ b/src/internal/SetBuildNumber/Directory.Packages.props.pp
@@ -19,6 +19,7 @@
19 19
20 <PackageVersion Include="WixToolset.Data" Version="{packageversion}" /> 20 <PackageVersion Include="WixToolset.Data" Version="{packageversion}" />
21 <PackageVersion Include="WixToolset.Extensibility" Version="{packageversion}" /> 21 <PackageVersion Include="WixToolset.Extensibility" Version="{packageversion}" />
22 <PackageVersion Include="WixToolset.Versioning" Version="{packageversion}" />
22 23
23 <PackageVersion Include="WixToolset.Burn" Version="{packageversion}" /> 24 <PackageVersion Include="WixToolset.Burn" Version="{packageversion}" />
24 <PackageVersion Include="WixToolset.Dnc.HostGenerator" Version="{packageversion}" /> 25 <PackageVersion Include="WixToolset.Dnc.HostGenerator" Version="{packageversion}" />
diff --git a/src/libs/WixToolset.Versioning/WixToolset.Versioning.csproj b/src/libs/WixToolset.Versioning/WixToolset.Versioning.csproj
new file mode 100644
index 00000000..2c23f391
--- /dev/null
+++ b/src/libs/WixToolset.Versioning/WixToolset.Versioning.csproj
@@ -0,0 +1,14 @@
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<Project Sdk="Microsoft.NET.Sdk">
5 <PropertyGroup>
6 <TargetFrameworks>netstandard2.0</TargetFrameworks>
7 <TargetFrameworks Condition=" '$(Configuration)'=='Release' ">$(TargetFrameworks);net472</TargetFrameworks>
8 <LangVersion>7.3</LangVersion>
9 <Description>WiX Toolset Versioning</Description>
10 <DebugType>embedded</DebugType>
11 <PublishRepositoryUrl>true</PublishRepositoryUrl>
12 <CreateDocumentationFile>true</CreateDocumentationFile>
13 </PropertyGroup>
14</Project>
diff --git a/src/api/wix/WixToolset.Data/WixVersion.cs b/src/libs/WixToolset.Versioning/WixVersion.cs
index a0de7a10..7333701f 100644
--- a/src/api/wix/WixToolset.Data/WixVersion.cs
+++ b/src/libs/WixToolset.Versioning/WixVersion.cs
@@ -1,6 +1,6 @@
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. 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 2
3namespace WixToolset.Data 3namespace WixToolset.Versioning
4{ 4{
5 using System; 5 using System;
6 using System.Collections.Generic; 6 using System.Collections.Generic;
@@ -11,13 +11,12 @@ namespace WixToolset.Data
11 /// large numbers and semantic versions with 4-part versions with 11 /// large numbers and semantic versions with 4-part versions with
12 /// or without leading "v" indicators. 12 /// or without leading "v" indicators.
13 /// </summary> 13 /// </summary>
14 [CLSCompliant(false)] 14 public class WixVersion : IComparable, IComparable<WixVersion>, IEquatable<WixVersion>
15 public class WixVersion
16 { 15 {
17 /// <summary> 16 /// <summary>
18 /// Gets the prefix of the version if present when parsed. Usually, 'v' or 'V'. 17 /// Gets the prefix of the version if present when parsed. Usually, 'v' or 'V'.
19 /// </summary> 18 /// </summary>
20 public char? Prefix { get; set; } 19 public char? Prefix { get; set; }
21 20
22 /// <summary> 21 /// <summary>
23 /// Gets or sets the major version. 22 /// Gets or sets the major version.
@@ -75,6 +74,63 @@ namespace WixToolset.Data
75 public string Metadata { get; set; } 74 public string Metadata { get; set; }
76 75
77 /// <summary> 76 /// <summary>
77 /// Compare to another WixVersion.
78 /// </summary>
79 /// <param name="version">WixVersion to compare.</param>
80 /// <returns>A comparison between versions.</returns>
81 public int CompareTo(WixVersion version)
82 {
83 return WixVersionComparer.Default.Compare(this, version);
84 }
85
86 /// <summary>
87 /// Compare to another object.
88 /// </summary>
89 /// <param name="version">Object to compare.</param>
90 /// <returns>A comparison between objects.</returns>
91 public int CompareTo(object version)
92 {
93 return WixVersionComparer.Default.Compare(this, version as WixVersion);
94 }
95
96 /// <summary>
97 /// Returns a value indicating whether the current System.Version object is equal to a specified object.
98 /// </summary>
99 /// <param name="version">An WixVersion to compare with the current WixVersion object, or null.</param>
100 /// <returns>
101 /// true if the current WixVersion object and obj are both WixVersion objects,
102 /// and every component of the current System.Version object matches the corresponding
103 /// component of obj; otherwise, false.
104 /// </returns>
105 public bool Equals(WixVersion version)
106 {
107 return WixVersionComparer.Default.Equals(this, version);
108 }
109
110 /// <summary>
111 /// Returns a value indicating whether the current WixVersion object is equal to a specified object.
112 /// </summary>
113 /// <param name="obj">An object to compare with the current WixVersion object, or null.</param>
114 /// <returns>
115 /// true if the current WixVersion object and obj are both WixVersion objects,
116 /// and every component of the current System.Version object matches the corresponding
117 /// component of obj; otherwise, false.
118 /// </returns>
119 public override bool Equals(object obj)
120 {
121 return WixVersionComparer.Default.Equals(this, obj as WixVersion);
122 }
123
124 /// <summary>
125 /// Returns a hash code for the current WixVersion object.
126 /// </summary>
127 /// <returns>A 32-bit signed integer hash code.</returns>
128 public override int GetHashCode()
129 {
130 return WixVersionComparer.Default.GetHashCode(this);
131 }
132
133 /// <summary>
78 /// Parse a string value into a <c>WixVersion</c>. The returned version may be invalid. 134 /// Parse a string value into a <c>WixVersion</c>. The returned version may be invalid.
79 /// </summary> 135 /// </summary>
80 /// <param name="parse">String value to parse into a version.</param> 136 /// <param name="parse">String value to parse into a version.</param>
@@ -331,5 +387,77 @@ namespace WixToolset.Data
331 387
332 return true; 388 return true;
333 } 389 }
390
391 /// <summary>
392 /// Determines whether two specified WixVersion objects are equal.
393 /// </summary>
394 /// <param name="v1">The first WixVersion object.</param>
395 /// <param name="v2">The second WixVersion object.</param>
396 /// <returns>true if v1 equals v2; otherwise, false.</returns>
397 public static bool operator ==(WixVersion v1, WixVersion v2)
398 {
399 return WixVersionComparer.Default.Equals(v1, v2);
400 }
401
402 /// <summary>
403 /// Determines whether two specified System.Version objects are not equal.
404 /// </summary>
405 /// <param name="v1">The first WixVersion object.</param>
406 /// <param name="v2">The second WixVersion object.</param>
407 /// <returns>true if v1 does not equal v2; otherwise, false.</returns>
408 public static bool operator !=(WixVersion v1, WixVersion v2)
409 {
410 return !WixVersionComparer.Default.Equals(v1, v2);
411 }
412
413 /// <summary>
414 /// Determines whether the first specified System.Version object is less than the second specified System.Version object.
415 /// </summary>
416 /// <param name="v1">The first WixVersion object.</param>
417 /// <param name="v2">The second WixVersion object.</param>
418 /// <returns>true if v1 is less than v2; otherwise, false.</returns>
419 /// <exception cref="ArgumentNullException">v1 is null.</exception>
420 public static bool operator <(WixVersion v1, WixVersion v2)
421 {
422 return WixVersionComparer.Default.Compare(v1, v2) == -1;
423 }
424
425 /// <summary>
426 /// Determines whether the first specified System.Version object is greater than the second specified System.Version object.
427 /// </summary>
428 /// <param name="v1">The first WixVersion object.</param>
429 /// <param name="v2">The second WixVersion object.</param>
430 /// <returns>true if v1 is greater than v2; otherwise, false.</returns>
431 public static bool operator >(WixVersion v1, WixVersion v2)
432 {
433 return WixVersionComparer.Default.Compare(v1, v2) == 1;
434 }
435
436 /// <summary>
437 /// Determines whether the first specified System.Version object is less than or equal to the second System.Version object.
438 /// </summary>
439 /// <param name="v1">The first WixVersion object.</param>
440 /// <param name="v2">The second WixVersion object.</param>
441 /// <returns>true if v1 is less than or equal to v2; otherwise, false.</returns>
442 /// <exception cref="ArgumentNullException">v1 is null.</exception>
443 public static bool operator <=(WixVersion v1, WixVersion v2)
444 {
445 var result = WixVersionComparer.Default.Compare(v1, v2);
446
447 return result == 0 || result == -1;
448 }
449
450 /// <summary>
451 /// Determines whether the first specified System.Version object is greater than or equal to the second specified System.Version object.
452 /// </summary>
453 /// <param name="v1">The first WixVersion object.</param>
454 /// <param name="v2">The second WixVersion object.</param>
455 /// <returns>true if v1 is greater than or equal to v2; otherwise, false.</returns>
456 public static bool operator >=(WixVersion v1, WixVersion v2)
457 {
458 var result = WixVersionComparer.Default.Compare(v1, v2);
459
460 return result == 0 || result == 1;
461 }
334 } 462 }
335} 463}
diff --git a/src/libs/WixToolset.Versioning/WixVersionComparer.cs b/src/libs/WixToolset.Versioning/WixVersionComparer.cs
new file mode 100644
index 00000000..be203634
--- /dev/null
+++ b/src/libs/WixToolset.Versioning/WixVersionComparer.cs
@@ -0,0 +1,253 @@
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
3namespace WixToolset.Versioning
4{
5 using System;
6 using System.Collections.Generic;
7
8 /// <summary>
9 /// WixVersion comparer.
10 /// </summary>
11 public class WixVersionComparer : IEqualityComparer<WixVersion>, IComparer<WixVersion>
12 {
13 /// <summary>
14 /// Default WixVersion comparer.
15 /// </summary>
16 public static readonly WixVersionComparer Default = new WixVersionComparer();
17
18 /// <inheritdoc />
19 public int Compare(WixVersion x, WixVersion y)
20 {
21 if ((object)x == y)
22 {
23 return 0;
24 }
25
26 if (x is null)
27 {
28 return -1;
29 }
30
31 if (y is null)
32 {
33 return 1;
34 }
35
36 var result = x.Major.CompareTo(y.Major);
37 if (result != 0)
38 {
39 return result;
40 }
41
42 result = x.Minor.CompareTo(y.Minor);
43 if (result != 0)
44 {
45 return result;
46 }
47
48 result = x.Patch.CompareTo(y.Patch);
49 if (result != 0)
50 {
51 return result;
52 }
53
54 result = x.Revision.CompareTo(y.Revision);
55 if (result != 0)
56 {
57 return result;
58 }
59
60 var xLabelCount = x.Labels?.Length ?? 0;
61 var yLabelCount = y.Labels?.Length ?? 0;
62 var maxLabelCount = Math.Max(xLabelCount, yLabelCount);
63
64 if (xLabelCount > 0)
65 {
66 if (yLabelCount == 0)
67 {
68 return -1;
69 }
70 }
71 else if (yLabelCount > 0)
72 {
73 return 1;
74 }
75
76 for (var i = 0; i < maxLabelCount; ++i)
77 {
78 var xLabel = i < xLabelCount ? x.Labels[i] : null;
79 var yLabel = i < yLabelCount ? y.Labels[i] : null;
80
81 result = CompareReleaseLabel(xLabel, yLabel);
82 if (result != 0)
83 {
84 return result;
85 }
86 }
87
88 var compareMetadata = false;
89
90 if (x.Invalid)
91 {
92 if (!y.Invalid)
93 {
94 return -1;
95 }
96 else
97 {
98 compareMetadata = true;
99 }
100 }
101 else if (y.Invalid)
102 {
103 return 1;
104 }
105
106 if (compareMetadata)
107 {
108 result = String.Compare(x.Metadata, y.Metadata, StringComparison.OrdinalIgnoreCase);
109 }
110
111 return (result == 0) ? 0 : (result < 0) ? -1 : 1;
112 }
113
114 /// <inheritdoc />
115 public bool Equals(WixVersion x, WixVersion y)
116 {
117 if ((object)x == y)
118 {
119 return true;
120 }
121
122 if (x is null)
123 {
124 return false;
125 }
126
127 if (y is null)
128 {
129 return false;
130 }
131
132 if (x.Major != y.Major)
133 {
134 return false;
135 }
136
137 if (x.Minor != y.Minor)
138 {
139 return false;
140 }
141
142 if (x.Patch != y.Patch)
143 {
144 return false;
145 }
146
147 if (x.Revision != y.Revision)
148 {
149 return false;
150 }
151
152 var labelCount = x.Labels?.Length ?? 0;
153 if (labelCount != (y.Labels?.Length ?? 0))
154 {
155 return false;
156 }
157
158 for (var i = 0; i < labelCount; ++i)
159 {
160 var result = CompareReleaseLabel(x.Labels[i], y.Labels[i]);
161 if (result != 0)
162 {
163 return false;
164 }
165 }
166
167 if (x.Invalid)
168 {
169 if (y.Invalid)
170 {
171 return String.Equals(x.Metadata, y.Metadata, StringComparison.OrdinalIgnoreCase);
172 }
173 else
174 {
175 return false;
176 }
177 }
178 else if (y.Invalid)
179 {
180 return false;
181 }
182
183 return true;
184 }
185
186 /// <inheritdoc />
187 public int GetHashCode(WixVersion version)
188 {
189 var hash = 23L;
190 hash = hash * 37 + (version.Prefix ?? '\0');
191 hash = hash * 37 + version.Major;
192 hash = hash * 37 + version.Minor;
193 hash = hash * 37 + version.Patch;
194 hash = hash * 37 + version.Revision;
195 hash = hash * 37 + (version.Invalid ? 1 : 0);
196 hash = hash * 37 + (version.HasMajor ? 1 : 0);
197 hash = hash * 37 + (version.HasMinor ? 1 : 0);
198 hash = hash * 37 + (version.HasPatch ? 1 : 0);
199 hash = hash * 37 + (version.HasRevision ? 1 : 0);
200
201 if (version.Labels != null)
202 {
203 foreach (var label in version.Labels)
204 {
205 hash = hash * 37 + label.Label.GetHashCode();
206 }
207 }
208
209 hash = hash * 37 + version.Metadata?.GetHashCode() ?? 0;
210
211 return unchecked((int)hash);
212 }
213
214 private static int CompareReleaseLabel(WixVersionLabel l1, WixVersionLabel l2)
215 {
216 if (l1 == l2)
217 {
218 return 0;
219 }
220 else if (l2 == null)
221 {
222 return 1;
223 }
224 else if (l1 == null)
225 {
226 return -1;
227 }
228
229 if (l1.Numeric.HasValue)
230 {
231 if (l2.Numeric.HasValue)
232 {
233 return l1.Numeric.Value.CompareTo(l2.Numeric.Value);
234 }
235 else
236 {
237 return -1;
238 }
239 }
240 else
241 {
242 if (l2.Numeric.HasValue)
243 {
244 return 1;
245 }
246 else
247 {
248 return String.Compare(l1.Label, l2.Label, StringComparison.OrdinalIgnoreCase);
249 }
250 }
251 }
252 }
253}
diff --git a/src/libs/WixToolset.Versioning/WixVersionLabel.cs b/src/libs/WixToolset.Versioning/WixVersionLabel.cs
new file mode 100644
index 00000000..c5dcb875
--- /dev/null
+++ b/src/libs/WixToolset.Versioning/WixVersionLabel.cs
@@ -0,0 +1,40 @@
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
3namespace WixToolset.Versioning
4{
5 /// <summary>
6 /// Label in a <c>WixVersion</c>.
7 /// </summary>
8 public class WixVersionLabel
9 {
10 /// <summary>
11 /// Creates a string only version label.
12 /// </summary>
13 /// <param name="label">String value for version label.</param>
14 public WixVersionLabel(string label)
15 {
16 this.Label = label;
17 }
18
19 /// <summary>
20 /// Creates a string version label with numeric value.
21 /// </summary>
22 /// <param name="label">String value for version label.</param>
23 /// <param name="numeric">Numeric value for the version label.</param>
24 public WixVersionLabel(string label, uint? numeric)
25 {
26 this.Label = label;
27 this.Numeric = numeric;
28 }
29
30 /// <summary>
31 /// Gets the string label value.
32 /// </summary>
33 public string Label { get; set; }
34
35 /// <summary>
36 /// Gets the optional numeric label value.
37 /// </summary>
38 public uint? Numeric { get; set; }
39 }
40}
diff --git a/src/libs/dutil/WixToolset.DUtil/dutil.v3.ncrunchproject b/src/libs/dutil/WixToolset.DUtil/dutil.v3.ncrunchproject
new file mode 100644
index 00000000..319cd523
--- /dev/null
+++ b/src/libs/dutil/WixToolset.DUtil/dutil.v3.ncrunchproject
@@ -0,0 +1,5 @@
1<ProjectConfiguration>
2 <Settings>
3 <IgnoreThisComponentCompletely>True</IgnoreThisComponentCompletely>
4 </Settings>
5</ProjectConfiguration> \ No newline at end of file
diff --git a/src/libs/dutil/test/DUtilUnitTest/DUtilUnitTest.v3.ncrunchproject b/src/libs/dutil/test/DUtilUnitTest/DUtilUnitTest.v3.ncrunchproject
new file mode 100644
index 00000000..319cd523
--- /dev/null
+++ b/src/libs/dutil/test/DUtilUnitTest/DUtilUnitTest.v3.ncrunchproject
@@ -0,0 +1,5 @@
1<ProjectConfiguration>
2 <Settings>
3 <IgnoreThisComponentCompletely>True</IgnoreThisComponentCompletely>
4 </Settings>
5</ProjectConfiguration> \ No newline at end of file
diff --git a/src/libs/libs.cmd b/src/libs/libs.cmd
index e3107fbc..e9402701 100644
--- a/src/libs/libs.cmd
+++ b/src/libs/libs.cmd
@@ -3,18 +3,42 @@
3 3
4@set _C=Debug 4@set _C=Debug
5@set _L=%~dp0..\..\build\logs 5@set _L=%~dp0..\..\build\logs
6
6:parse_args 7:parse_args
7@if /i "%1"=="release" set _C=Release 8@if /i "%1"=="release" set _C=Release
9@if /i "%1"=="inc" set _INC=1
10@if /i "%1"=="clean" set _CLEAN=1
8@if not "%1"=="" shift & goto parse_args 11@if not "%1"=="" shift & goto parse_args
9 12
10@set _B=%~dp0..\..\build\libs\%_C% 13@set _B=%~dp0..\..\build\libs\%_C%
11 14
15:: Clean
16
17@if "%_INC%"=="" call :clean
18@if NOT "%_CLEAN%"=="" goto :end
19
12@echo Building libs %_C% 20@echo Building libs %_C%
13 21
14msbuild -Restore libs_t.proj -p:Configuration=%_C% -nologo -m -warnaserror -bl:%_L%\libs_build.binlog || exit /b 22msbuild -Restore libs_t.proj -p:Configuration=%_C% -nologo -m -warnaserror -bl:%_L%\libs_build.binlog || exit /b
15 23
24dotnet test %_B%\net6.0\WixToolsetTest.Versioning.dll --nologo -l "trx;LogFileName=%_L%\TestResults\WixToolsetTest.Versioning.trx" || exit /b
16dotnet test %_B%\x86\DUtilUnitTest.dll --nologo -l "trx;LogFileName=%_L%\TestResults\DutilUnitTest32.trx" || exit /b 25dotnet test %_B%\x86\DUtilUnitTest.dll --nologo -l "trx;LogFileName=%_L%\TestResults\DutilUnitTest32.trx" || exit /b
17dotnet test %_B%\x64\DUtilUnitTest.dll --nologo -l "trx;LogFileName=%_L%\TestResults\DutilUnitTest64.trx" || exit /b 26dotnet test %_B%\x64\DUtilUnitTest.dll --nologo -l "trx;LogFileName=%_L%\TestResults\DutilUnitTest64.trx" || exit /b
18 27
28@goto :end
29
30:clean
31@rd /s/q "..\..\build\libs" 2> nul
32@del "..\..\build\artifacts\WixToolset.DUtil.*.nupkg" 2> nul
33@del "..\..\build\artifacts\WixToolset.Versioning.*.nupkg" 2> nul
34@del "..\..\build\artifacts\WixToolset.WcaUtil.*.nupkg" 2> nul
35@del "%_L%\TestResults\WixToolsetTest.Versioning.trx" 2> nul
36@del "%_L%\TestResults\DutilUnitTest*.trx" 2> nul
37@rd /s/q "%USERPROFILE%\.nuget\packages\wixtoolset.dutil" 2> nul
38@rd /s/q "%USERPROFILE%\.nuget\packages\wixtoolset.versioning" 2> nul
39@rd /s/q "%USERPROFILE%\.nuget\packages\wixtoolset.wcautil" 2> nul
40@exit /b
41
42:end
19@popd 43@popd
20@endlocal 44@endlocal
diff --git a/src/libs/libs.sln b/src/libs/libs.sln
index e0a4a149..1c9c10d1 100644
--- a/src/libs/libs.sln
+++ b/src/libs/libs.sln
@@ -1,7 +1,7 @@
1 1
2Microsoft Visual Studio Solution File, Format Version 12.00 2Microsoft Visual Studio Solution File, Format Version 12.00
3# Visual Studio Version 16 3# Visual Studio Version 17
4VisualStudioVersion = 16.6.30114.105 4VisualStudioVersion = 17.3.32922.545
5MinimumVisualStudioVersion = 10.0.40219.1 5MinimumVisualStudioVersion = 10.0.40219.1
6Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dutil", "dutil\WixToolset.DUtil\dutil.vcxproj", "{1244E671-F108-4334-BA52-8A7517F26ECD}" 6Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dutil", "dutil\WixToolset.DUtil\dutil.vcxproj", "{1244E671-F108-4334-BA52-8A7517F26ECD}"
7EndProject 7EndProject
@@ -9,6 +9,10 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DUtilUnitTest", "dutil\test
9EndProject 9EndProject
10Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wcautil", "wcautil\WixToolset.WcaUtil\wcautil.vcxproj", "{5B3714B6-3A76-463E-8595-D48DA276C512}" 10Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wcautil", "wcautil\WixToolset.WcaUtil\wcautil.vcxproj", "{5B3714B6-3A76-463E-8595-D48DA276C512}"
11EndProject 11EndProject
12Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolset.Versioning", "WixToolset.Versioning\WixToolset.Versioning.csproj", "{7B14B536-4205-4186-B9FD-0765B84F2075}"
13EndProject
14Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolsetTest.Versioning", "test\WixToolsetTest.Versioning\WixToolsetTest.Versioning.csproj", "{3D510701-FF05-4E3B-BB99-BDB97963C3F8}"
15EndProject
12Global 16Global
13 GlobalSection(SolutionConfigurationPlatforms) = preSolution 17 GlobalSection(SolutionConfigurationPlatforms) = preSolution
14 Debug|Any CPU = Debug|Any CPU 18 Debug|Any CPU = Debug|Any CPU
@@ -59,6 +63,38 @@ Global
59 {5B3714B6-3A76-463E-8595-D48DA276C512}.Release|x64.Build.0 = Release|x64 63 {5B3714B6-3A76-463E-8595-D48DA276C512}.Release|x64.Build.0 = Release|x64
60 {5B3714B6-3A76-463E-8595-D48DA276C512}.Release|x86.ActiveCfg = Release|Win32 64 {5B3714B6-3A76-463E-8595-D48DA276C512}.Release|x86.ActiveCfg = Release|Win32
61 {5B3714B6-3A76-463E-8595-D48DA276C512}.Release|x86.Build.0 = Release|Win32 65 {5B3714B6-3A76-463E-8595-D48DA276C512}.Release|x86.Build.0 = Release|Win32
66 {7B14B536-4205-4186-B9FD-0765B84F2075}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
67 {7B14B536-4205-4186-B9FD-0765B84F2075}.Debug|Any CPU.Build.0 = Debug|Any CPU
68 {7B14B536-4205-4186-B9FD-0765B84F2075}.Debug|ARM64.ActiveCfg = Debug|Any CPU
69 {7B14B536-4205-4186-B9FD-0765B84F2075}.Debug|ARM64.Build.0 = Debug|Any CPU
70 {7B14B536-4205-4186-B9FD-0765B84F2075}.Debug|x64.ActiveCfg = Debug|Any CPU
71 {7B14B536-4205-4186-B9FD-0765B84F2075}.Debug|x64.Build.0 = Debug|Any CPU
72 {7B14B536-4205-4186-B9FD-0765B84F2075}.Debug|x86.ActiveCfg = Debug|Any CPU
73 {7B14B536-4205-4186-B9FD-0765B84F2075}.Debug|x86.Build.0 = Debug|Any CPU
74 {7B14B536-4205-4186-B9FD-0765B84F2075}.Release|Any CPU.ActiveCfg = Release|Any CPU
75 {7B14B536-4205-4186-B9FD-0765B84F2075}.Release|Any CPU.Build.0 = Release|Any CPU
76 {7B14B536-4205-4186-B9FD-0765B84F2075}.Release|ARM64.ActiveCfg = Release|Any CPU
77 {7B14B536-4205-4186-B9FD-0765B84F2075}.Release|ARM64.Build.0 = Release|Any CPU
78 {7B14B536-4205-4186-B9FD-0765B84F2075}.Release|x64.ActiveCfg = Release|Any CPU
79 {7B14B536-4205-4186-B9FD-0765B84F2075}.Release|x64.Build.0 = Release|Any CPU
80 {7B14B536-4205-4186-B9FD-0765B84F2075}.Release|x86.ActiveCfg = Release|Any CPU
81 {7B14B536-4205-4186-B9FD-0765B84F2075}.Release|x86.Build.0 = Release|Any CPU
82 {3D510701-FF05-4E3B-BB99-BDB97963C3F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
83 {3D510701-FF05-4E3B-BB99-BDB97963C3F8}.Debug|Any CPU.Build.0 = Debug|Any CPU
84 {3D510701-FF05-4E3B-BB99-BDB97963C3F8}.Debug|ARM64.ActiveCfg = Debug|Any CPU
85 {3D510701-FF05-4E3B-BB99-BDB97963C3F8}.Debug|ARM64.Build.0 = Debug|Any CPU
86 {3D510701-FF05-4E3B-BB99-BDB97963C3F8}.Debug|x64.ActiveCfg = Debug|Any CPU
87 {3D510701-FF05-4E3B-BB99-BDB97963C3F8}.Debug|x64.Build.0 = Debug|Any CPU
88 {3D510701-FF05-4E3B-BB99-BDB97963C3F8}.Debug|x86.ActiveCfg = Debug|Any CPU
89 {3D510701-FF05-4E3B-BB99-BDB97963C3F8}.Debug|x86.Build.0 = Debug|Any CPU
90 {3D510701-FF05-4E3B-BB99-BDB97963C3F8}.Release|Any CPU.ActiveCfg = Release|Any CPU
91 {3D510701-FF05-4E3B-BB99-BDB97963C3F8}.Release|Any CPU.Build.0 = Release|Any CPU
92 {3D510701-FF05-4E3B-BB99-BDB97963C3F8}.Release|ARM64.ActiveCfg = Release|Any CPU
93 {3D510701-FF05-4E3B-BB99-BDB97963C3F8}.Release|ARM64.Build.0 = Release|Any CPU
94 {3D510701-FF05-4E3B-BB99-BDB97963C3F8}.Release|x64.ActiveCfg = Release|Any CPU
95 {3D510701-FF05-4E3B-BB99-BDB97963C3F8}.Release|x64.Build.0 = Release|Any CPU
96 {3D510701-FF05-4E3B-BB99-BDB97963C3F8}.Release|x86.ActiveCfg = Release|Any CPU
97 {3D510701-FF05-4E3B-BB99-BDB97963C3F8}.Release|x86.Build.0 = Release|Any CPU
62 EndGlobalSection 98 EndGlobalSection
63 GlobalSection(SolutionProperties) = preSolution 99 GlobalSection(SolutionProperties) = preSolution
64 HideSolutionNode = FALSE 100 HideSolutionNode = FALSE
diff --git a/src/libs/libs.v3.ncrunchsolution b/src/libs/libs.v3.ncrunchsolution
new file mode 100644
index 00000000..10420ac9
--- /dev/null
+++ b/src/libs/libs.v3.ncrunchsolution
@@ -0,0 +1,6 @@
1<SolutionConfiguration>
2 <Settings>
3 <AllowParallelTestExecution>True</AllowParallelTestExecution>
4 <SolutionConfigured>True</SolutionConfigured>
5 </Settings>
6</SolutionConfiguration> \ No newline at end of file
diff --git a/src/libs/libs_t.proj b/src/libs/libs_t.proj
index 8c35f1c3..5c23cbf7 100644
--- a/src/libs/libs_t.proj
+++ b/src/libs/libs_t.proj
@@ -2,5 +2,7 @@
2 <ItemGroup> 2 <ItemGroup>
3 <ProjectReference Include="dutil\dutil_t.proj" /> 3 <ProjectReference Include="dutil\dutil_t.proj" />
4 <ProjectReference Include="wcautil\wcautil_t.proj" /> 4 <ProjectReference Include="wcautil\wcautil_t.proj" />
5 <ProjectReference Include="WixToolset.Versioning\WixToolset.Versioning.csproj" Targets="Pack" />
6 <ProjectReference Include="test\WixToolsetTest.Versioning\WixToolsetTest.Versioning.csproj" />
5 </ItemGroup> 7 </ItemGroup>
6</Project> 8</Project>
diff --git a/src/libs/test/WixToolsetTest.Versioning/VerUtilTestsFixture.cs b/src/libs/test/WixToolsetTest.Versioning/VerUtilTestsFixture.cs
new file mode 100644
index 00000000..3dff28c6
--- /dev/null
+++ b/src/libs/test/WixToolsetTest.Versioning/VerUtilTestsFixture.cs
@@ -0,0 +1,683 @@
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
3namespace WixToolsetTest.Versioning
4{
5 using System;
6 using WixToolset.Versioning;
7 using Xunit;
8
9 public class VerUtilTestsFixture
10 {
11 [Fact]
12 public void VerCompareVersionsTreatsMissingRevisionAsZero()
13 {
14 var version1 = WixVersion.Parse("1.2.3.4");
15 var version2 = WixVersion.Parse("1.2.3");
16 var version3 = WixVersion.Parse("1.2.3.0");
17
18 Assert.Null(version1.Prefix);
19 Assert.Equal(1U, version1.Major);
20 Assert.Equal(2U, version1.Minor);
21 Assert.Equal(3U, version1.Patch);
22 Assert.Equal(4U, version1.Revision);
23 Assert.Null(version1.Labels);
24 Assert.Null(version1.Metadata);
25 Assert.False(version1.Invalid);
26 Assert.True(version1.HasMajor);
27 Assert.True(version1.HasMinor);
28 Assert.True(version1.HasPatch);
29 Assert.True(version1.HasRevision);
30
31 Assert.Null(version2.Prefix);
32 Assert.Equal(1U, version2.Major);
33 Assert.Equal(2U, version2.Minor);
34 Assert.Equal(3U, version2.Patch);
35 Assert.Equal(0U, version2.Revision);
36 Assert.Null(version2.Labels);
37 Assert.Null(version2.Metadata);
38 Assert.False(version2.Invalid);
39 Assert.True(version2.HasMajor);
40 Assert.True(version2.HasMinor);
41 Assert.True(version2.HasPatch);
42 Assert.False(version2.HasRevision);
43
44 Assert.Null(version3.Prefix);
45 Assert.Equal(1U, version3.Major);
46 Assert.Equal(2U, version3.Minor);
47 Assert.Equal(3U, version3.Patch);
48 Assert.Equal(0U, version3.Revision);
49 Assert.Null(version3.Labels);
50 Assert.Null(version3.Metadata);
51 Assert.False(version3.Invalid);
52 Assert.True(version3.HasMajor);
53 Assert.True(version3.HasMinor);
54 Assert.True(version3.HasPatch);
55 Assert.True(version3.HasRevision);
56
57 Assert.Equal(1, version1.CompareTo(version2));
58 Assert.Equal(0, version3.CompareTo(version2));
59 }
60
61 [Fact]
62 public void VerCompareVersionsTreatsNumericReleaseLabelsAsNumbers()
63 {
64 var version1 = WixVersion.Parse("1.0-2.0");
65 var version2 = WixVersion.Parse("1.0-19");
66
67 Assert.Null(version1.Prefix);
68 Assert.Equal(1U, version1.Major);
69 Assert.Equal(0U, version1.Minor);
70 Assert.Equal(0U, version1.Patch);
71 Assert.Equal(0U, version1.Revision);
72 Assert.Equal(2, version1.Labels.Length);
73
74 Assert.Equal(2U, version1.Labels[0].Numeric);
75 Assert.Equal("2", version1.Labels[0].Label);
76
77 Assert.Equal(0U, version1.Labels[1].Numeric);
78 Assert.Equal("0", version1.Labels[1].Label);
79
80 Assert.Null(version1.Metadata);
81 Assert.False(version1.Invalid);
82 Assert.True(version1.HasMajor);
83 Assert.True(version1.HasMinor);
84 Assert.False(version1.HasPatch);
85 Assert.False(version1.HasRevision);
86
87
88 Assert.Null(version2.Prefix);
89 Assert.Equal(1U, version2.Major);
90 Assert.Equal(0U, version2.Minor);
91 Assert.Equal(0U, version2.Patch);
92 Assert.Equal(0U, version2.Revision);
93 Assert.Single(version2.Labels);
94
95 Assert.Equal(19U, version2.Labels[0].Numeric);
96 Assert.Equal("19", version2.Labels[0].Label);
97
98 Assert.Null(version2.Metadata);
99 Assert.False(version2.Invalid);
100 Assert.True(version2.HasMajor);
101 Assert.True(version2.HasMinor);
102 Assert.False(version2.HasPatch);
103 Assert.False(version2.HasRevision);
104
105 TestVerutilCompareParsedVersions(version1, version2, -1);
106 }
107
108 [Fact]
109 public void VerCompareVersionsHandlesNormallyInvalidVersions()
110 {
111 var version1 = WixVersion.Parse("10.-4.0");
112 var version2 = WixVersion.Parse("10.-2.0");
113 var version3 = WixVersion.Parse("0");
114 var version4 = WixVersion.Parse("");
115 var version5 = WixVersion.Parse("10-2");
116 var version6 = WixVersion.Parse("10-4.@");
117
118
119 Assert.Null(version1.Prefix);
120 Assert.Equal(10U, version1.Major);
121 Assert.Equal(0U, version1.Minor);
122 Assert.Equal(0U, version1.Patch);
123 Assert.Equal(0U, version1.Revision);
124 Assert.Null(version1.Labels);
125 Assert.Equal("-4.0", version1.Metadata);
126 Assert.True(version1.Invalid);
127 Assert.True(version1.HasMajor);
128 Assert.False(version1.HasMinor);
129 Assert.False(version1.HasPatch);
130 Assert.False(version1.HasRevision);
131
132
133 Assert.Null(version2.Prefix);
134 Assert.Equal(10U, version2.Major);
135 Assert.Equal(0U, version2.Minor);
136 Assert.Equal(0U, version2.Patch);
137 Assert.Equal(0U, version2.Revision);
138 Assert.Null(version2.Labels);
139 Assert.Equal("-2.0", version2.Metadata);
140 Assert.True(version2.Invalid);
141 Assert.True(version2.HasMajor);
142 Assert.False(version2.HasMinor);
143 Assert.False(version2.HasPatch);
144 Assert.False(version2.HasRevision);
145
146
147 Assert.Null(version3.Prefix);
148 Assert.Equal(0U, version3.Major);
149 Assert.Equal(0U, version3.Minor);
150 Assert.Equal(0U, version3.Patch);
151 Assert.Equal(0U, version3.Revision);
152 Assert.Null(version3.Labels);
153 Assert.Null(version3.Metadata);
154 Assert.False(version3.Invalid);
155 Assert.True(version3.HasMajor);
156 Assert.False(version3.HasMinor);
157 Assert.False(version3.HasPatch);
158 Assert.False(version3.HasRevision);
159
160 Assert.Null(version4.Prefix);
161 Assert.Equal(0U, version4.Major);
162 Assert.Equal(0U, version4.Minor);
163 Assert.Equal(0U, version4.Patch);
164 Assert.Equal(0U, version4.Revision);
165 Assert.Null(version4.Labels);
166 Assert.Equal(String.Empty, version4.Metadata);
167 Assert.True(version4.Invalid);
168 Assert.False(version4.HasMajor);
169 Assert.False(version4.HasMinor);
170 Assert.False(version4.HasPatch);
171 Assert.False(version4.HasRevision);
172
173 Assert.Null(version5.Prefix);
174 Assert.Equal(10U, version5.Major);
175 Assert.Equal(0U, version5.Minor);
176 Assert.Equal(0U, version5.Patch);
177 Assert.Equal(0U, version5.Revision);
178 Assert.Single(version5.Labels);
179 Assert.Equal(2U, version5.Labels[0].Numeric);
180 Assert.Equal("2", version5.Labels[0].Label);
181
182 Assert.Null(version5.Metadata);
183 Assert.False(version5.Invalid);
184 Assert.True(version5.HasMajor);
185 Assert.False(version5.HasMinor);
186 Assert.False(version5.HasPatch);
187 Assert.False(version5.HasRevision);
188
189 Assert.Null(version6.Prefix);
190 Assert.Equal(10U, version6.Major);
191 Assert.Equal(0U, version6.Minor);
192 Assert.Equal(0U, version6.Patch);
193 Assert.Equal(0U, version6.Revision);
194 Assert.Single(version6.Labels);
195 Assert.Equal(4U, version6.Labels[0].Numeric);
196 Assert.Equal("4", version6.Labels[0].Label);
197
198 Assert.Equal("@", version6.Metadata);
199 Assert.True(version6.Invalid);
200 Assert.True(version6.HasMajor);
201 Assert.False(version6.HasMinor);
202 Assert.False(version6.HasPatch);
203 Assert.False(version6.HasRevision);
204
205 TestVerutilCompareParsedVersions(version1, version2, 1);
206 TestVerutilCompareParsedVersions(version3, version4, 1);
207 TestVerutilCompareParsedVersions(version5, version6, -1);
208 }
209
210 [Fact]
211 public void VerCompareVersionsTreatsHyphenAsVersionSeparator()
212 {
213 var version1 = WixVersion.Parse("0.0.1-a");
214 var version2 = WixVersion.Parse("0-2");
215 var version3 = WixVersion.Parse("1-2");
216
217
218 Assert.Null(version1.Prefix);
219 Assert.Equal(0U, version1.Major);
220 Assert.Equal(0U, version1.Minor);
221 Assert.Equal(1U, version1.Patch);
222 Assert.Equal(0U, version1.Revision);
223 Assert.Single(version1.Labels);
224 Assert.Null(version1.Labels[0].Numeric);
225 Assert.Equal("a", version1.Labels[0].Label);
226
227 Assert.Null(version1.Metadata);
228 Assert.False(version1.Invalid);
229 Assert.True(version1.HasMajor);
230 Assert.True(version1.HasMinor);
231 Assert.True(version1.HasPatch);
232 Assert.False(version1.HasRevision);
233
234 Assert.Null(version2.Prefix);
235 Assert.Equal(0U, version2.Major);
236 Assert.Equal(0U, version2.Minor);
237 Assert.Equal(0U, version2.Patch);
238 Assert.Equal(0U, version2.Revision);
239 Assert.Single(version2.Labels);
240 Assert.Equal(2U, version2.Labels[0].Numeric);
241 Assert.Equal("2", version2.Labels[0].Label);
242
243 Assert.Null(version2.Metadata);
244 Assert.False(version2.Invalid);
245 Assert.True(version2.HasMajor);
246 Assert.False(version2.HasMinor);
247 Assert.False(version2.HasPatch);
248 Assert.False(version2.HasRevision);
249
250 Assert.Null(version3.Prefix);
251 Assert.Equal(1U, version3.Major);
252 Assert.Equal(0U, version3.Minor);
253 Assert.Equal(0U, version3.Patch);
254 Assert.Equal(0U, version3.Revision);
255 Assert.Single(version3.Labels);
256 Assert.Equal(2U, version3.Labels[0].Numeric);
257 Assert.Equal("2", version3.Labels[0].Label);
258
259 Assert.Null(version3.Metadata);
260 Assert.False(version3.Invalid);
261 Assert.True(version3.HasMajor);
262 Assert.False(version3.HasMinor);
263 Assert.False(version3.HasPatch);
264 Assert.False(version3.HasRevision);
265
266 TestVerutilCompareParsedVersions(version1, version2, 1);
267 TestVerutilCompareParsedVersions(version1, version3, -1);
268 }
269
270 [Fact]
271 public void VerCompareVersionsIgnoresLeadingZeroes()
272 {
273 var version1 = WixVersion.Parse("0.01-a.1");
274 var version2 = WixVersion.Parse("0.1.0-a.1");
275 var version3 = WixVersion.Parse("0.1-a.b.0");
276 var version4 = WixVersion.Parse("0.1.0-a.b.000");
277
278 Assert.Null(version1.Prefix);
279 Assert.Equal(0U, version1.Major);
280 Assert.Equal(1U, version1.Minor);
281 Assert.Equal(0U, version1.Patch);
282 Assert.Equal(0U, version1.Revision);
283 Assert.Equal(2, version1.Labels.Length);
284 Assert.Null(version1.Labels[0].Numeric);
285 Assert.Equal("a", version1.Labels[0].Label);
286 Assert.Equal(1U, version1.Labels[1].Numeric);
287 Assert.Equal("1", version1.Labels[1].Label);
288
289 Assert.Null(version1.Metadata);
290 Assert.False(version1.Invalid);
291 Assert.True(version1.HasMajor);
292 Assert.True(version1.HasMinor);
293 Assert.False(version1.HasPatch);
294 Assert.False(version1.HasRevision);
295
296 Assert.Null(version2.Prefix);
297 Assert.Equal(0U, version2.Major);
298 Assert.Equal(1U, version2.Minor);
299 Assert.Equal(0U, version2.Patch);
300 Assert.Equal(0U, version2.Revision);
301 Assert.Equal(2, version2.Labels.Length);
302
303 Assert.Null(version2.Labels[0].Numeric);
304 Assert.Equal("a", version2.Labels[0].Label);
305 Assert.Equal(1U, version2.Labels[1].Numeric);
306 Assert.Equal("1", version2.Labels[1].Label);
307
308 Assert.Null(version2.Metadata);
309 Assert.False(version2.Invalid);
310 Assert.True(version2.HasMajor);
311 Assert.True(version2.HasMinor);
312 Assert.True(version2.HasPatch);
313 Assert.False(version2.HasRevision);
314
315 Assert.Null(version3.Prefix);
316 Assert.Equal(0U, version3.Major);
317 Assert.Equal(1U, version3.Minor);
318 Assert.Equal(0U, version3.Patch);
319 Assert.Equal(0U, version3.Revision);
320 Assert.Equal(3, version3.Labels.Length);
321 Assert.Null(version3.Labels[0].Numeric);
322 Assert.Equal("a", version3.Labels[0].Label);
323 Assert.Null(version3.Labels[1].Numeric);
324 Assert.Equal("b", version3.Labels[1].Label);
325 Assert.Equal(0U, version3.Labels[2].Numeric);
326 Assert.Equal("0", version3.Labels[2].Label);
327
328 Assert.Null(version3.Metadata);
329 Assert.False(version3.Invalid);
330 Assert.True(version3.HasMajor);
331 Assert.True(version3.HasMinor);
332 Assert.False(version3.HasPatch);
333 Assert.False(version3.HasRevision);
334
335 Assert.Null(version4.Prefix);
336 Assert.Equal(0U, version4.Major);
337 Assert.Equal(1U, version4.Minor);
338 Assert.Equal(0U, version4.Patch);
339 Assert.Equal(0U, version4.Revision);
340 Assert.Equal(3, version4.Labels.Length);
341 Assert.Null(version4.Labels[0].Numeric);
342 Assert.Equal("a", version4.Labels[0].Label);
343 Assert.Null(version4.Labels[1].Numeric);
344 Assert.Equal("b", version4.Labels[1].Label);
345 Assert.Equal(0U, version4.Labels[2].Numeric);
346 Assert.Equal("000", version4.Labels[2].Label);
347
348 Assert.Null(version4.Metadata);
349 Assert.False(version4.Invalid);
350 Assert.True(version4.HasMajor);
351 Assert.True(version4.HasMinor);
352 Assert.True(version4.HasPatch);
353 Assert.False(version4.HasRevision);
354
355 TestVerutilCompareParsedVersions(version1, version2, 0);
356 TestVerutilCompareParsedVersions(version3, version4, 0);
357 }
358
359 [Fact]
360 public void VerCompareVersionsTreatsUnexpectedContentAsMetadata()
361 {
362 var version1 = WixVersion.Parse("1.2.3+abcd");
363 var version2 = WixVersion.Parse("1.2.3.abcd");
364 var version3 = WixVersion.Parse("1.2.3.-abcd");
365
366 Assert.Null(version1.Prefix);
367 Assert.Equal(1U, version1.Major);
368 Assert.Equal(2U, version1.Minor);
369 Assert.Equal(3U, version1.Patch);
370 Assert.Equal(0U, version1.Revision);
371 Assert.Null(version1.Labels);
372 Assert.Equal("abcd", version1.Metadata);
373 Assert.False(version1.Invalid);
374 Assert.True(version1.HasMajor);
375 Assert.True(version1.HasMinor);
376 Assert.True(version1.HasPatch);
377 Assert.False(version1.HasRevision);
378
379 Assert.Null(version2.Prefix);
380 Assert.Equal(1U, version2.Major);
381 Assert.Equal(2U, version2.Minor);
382 Assert.Equal(3U, version2.Patch);
383 Assert.Equal(0U, version2.Revision);
384 Assert.Null(version2.Labels);
385 Assert.Equal("abcd", version2.Metadata);
386 Assert.True(version2.Invalid);
387 Assert.True(version2.HasMajor);
388 Assert.True(version2.HasMinor);
389 Assert.True(version2.HasPatch);
390 Assert.False(version2.HasRevision);
391
392
393 Assert.Null(version3.Prefix);
394 Assert.Equal(1U, version3.Major);
395 Assert.Equal(2U, version3.Minor);
396 Assert.Equal(3U, version3.Patch);
397 Assert.Equal(0U, version3.Revision);
398 Assert.Null(version3.Labels);
399 Assert.Equal("-abcd", version3.Metadata);
400 Assert.True(version3.Invalid);
401 Assert.True(version3.HasMajor);
402 Assert.True(version3.HasMinor);
403 Assert.True(version3.HasPatch);
404 Assert.False(version3.HasRevision);
405
406 TestVerutilCompareParsedVersions(version1, version2, 1);
407 TestVerutilCompareParsedVersions(version1, version3, 1);
408 TestVerutilCompareParsedVersions(version2, version3, 1);
409 }
410
411 [Fact]
412 public void VerCompareVersionsIgnoresLeadingV()
413 {
414 var version1 = WixVersion.Parse("10.20.30.40");
415 var version2 = WixVersion.Parse("v10.20.30.40");
416 var version3 = WixVersion.Parse("V10.20.30.40");
417 var version4 = WixVersion.Parse("v10.20.30.40-abc");
418 var version5 = WixVersion.Parse("vvv");
419
420 Assert.Null(version1.Prefix);
421 Assert.Equal(10U, version1.Major);
422 Assert.Equal(20U, version1.Minor);
423 Assert.Equal(30U, version1.Patch);
424 Assert.Equal(40U, version1.Revision);
425 Assert.Null(version1.Labels);
426 Assert.Null(version1.Metadata);
427 Assert.False(version1.Invalid);
428 Assert.True(version1.HasMajor);
429 Assert.True(version1.HasMinor);
430 Assert.True(version1.HasPatch);
431 Assert.True(version1.HasRevision);
432
433 Assert.Equal('v', version2.Prefix);
434 Assert.Equal(10U, version2.Major);
435 Assert.Equal(20U, version2.Minor);
436 Assert.Equal(30U, version2.Patch);
437 Assert.Equal(40U, version2.Revision);
438 Assert.Null(version2.Labels);
439 Assert.Null(version2.Metadata);
440 Assert.False(version2.Invalid);
441 Assert.True(version2.HasMajor);
442 Assert.True(version2.HasMinor);
443 Assert.True(version2.HasPatch);
444 Assert.True(version2.HasRevision);
445
446 Assert.Equal('V', version3.Prefix);
447 Assert.Equal(10U, version3.Major);
448 Assert.Equal(20U, version3.Minor);
449 Assert.Equal(30U, version3.Patch);
450 Assert.Equal(40U, version3.Revision);
451 Assert.Null(version3.Labels);
452 Assert.Null(version3.Metadata);
453 Assert.False(version3.Invalid);
454 Assert.True(version3.HasMajor);
455 Assert.True(version3.HasMinor);
456 Assert.True(version3.HasPatch);
457 Assert.True(version3.HasRevision);
458
459 Assert.Equal('v', version4.Prefix);
460 Assert.Equal(10U, version4.Major);
461 Assert.Equal(20U, version4.Minor);
462 Assert.Equal(30U, version4.Patch);
463 Assert.Equal(40U, version4.Revision);
464 Assert.Single(version4.Labels);
465 Assert.Null(version4.Labels[0].Numeric);
466 Assert.Equal("abc", version4.Labels[0].Label);
467
468 Assert.Null(version4.Metadata);
469 Assert.False(version4.Invalid);
470 Assert.True(version4.HasMajor);
471 Assert.True(version4.HasMinor);
472 Assert.True(version4.HasPatch);
473 Assert.True(version4.HasRevision);
474
475 Assert.Null(version5.Prefix);
476 Assert.Equal(0U, version5.Major);
477 Assert.Equal(0U, version5.Minor);
478 Assert.Equal(0U, version5.Patch);
479 Assert.Equal(0U, version5.Revision);
480 Assert.Null(version5.Labels);
481 Assert.Equal("vvv", version5.Metadata);
482 Assert.True(version5.Invalid);
483 Assert.False(version5.HasMajor);
484 Assert.False(version5.HasMinor);
485 Assert.False(version5.HasPatch);
486 Assert.False(version5.HasRevision);
487
488 TestVerutilCompareParsedVersions(version1, version2, 0);
489 TestVerutilCompareParsedVersions(version1, version3, 0);
490 TestVerutilCompareParsedVersions(version1, version4, 1);
491 }
492
493 [Fact]
494 public void VerCompareVersionsHandlesTooLargeNumbers()
495 {
496 var version1 = WixVersion.Parse("4294967295.4294967295.4294967295.4294967295");
497 var version2 = WixVersion.Parse("4294967296.4294967296.4294967296.4294967296");
498
499 Assert.Null(version1.Prefix);
500 Assert.Equal(4294967295, version1.Major);
501 Assert.Equal(4294967295, version1.Minor);
502 Assert.Equal(4294967295, version1.Patch);
503 Assert.Equal(4294967295, version1.Revision);
504 Assert.Null(version1.Labels);
505 Assert.Null(version1.Metadata);
506 Assert.False(version1.Invalid);
507 Assert.True(version1.HasMajor);
508 Assert.True(version1.HasMinor);
509 Assert.True(version1.HasPatch);
510 Assert.True(version1.HasRevision);
511
512 Assert.Null(version2.Prefix);
513 Assert.Equal(0U, version2.Major);
514 Assert.Equal(0U, version2.Minor);
515 Assert.Equal(0U, version2.Patch);
516 Assert.Equal(0U, version2.Revision);
517 Assert.Null(version2.Labels);
518 Assert.Equal("4294967296.4294967296.4294967296.4294967296", version2.Metadata);
519 Assert.True(version2.Invalid);
520 Assert.False(version2.HasMajor);
521 Assert.False(version2.HasMinor);
522 Assert.False(version2.HasPatch);
523 Assert.False(version2.HasRevision);
524
525 TestVerutilCompareParsedVersions(version1, version2, 1);
526 }
527
528 [Fact]
529 public void VerCompareVersionsIgnoresMetadataForValidVersions()
530 {
531 var version1 = WixVersion.Parse("1.2.3+abc");
532 var version2 = WixVersion.Parse("1.2.3+xyz");
533
534 Assert.Null(version1.Prefix);
535 Assert.Equal(1U, version1.Major);
536 Assert.Equal(2U, version1.Minor);
537 Assert.Equal(3U, version1.Patch);
538 Assert.Equal(0U, version1.Revision);
539 Assert.Null(version1.Labels);
540 Assert.Equal("abc", version1.Metadata);
541 Assert.False(version1.Invalid);
542 Assert.True(version1.HasMajor);
543 Assert.True(version1.HasMinor);
544 Assert.True(version1.HasPatch);
545 Assert.False(version1.HasRevision);
546
547
548 Assert.Null(version2.Prefix);
549 Assert.Equal(1U, version2.Major);
550 Assert.Equal(2U, version2.Minor);
551 Assert.Equal(3U, version2.Patch);
552 Assert.Equal(0U, version2.Revision);
553 Assert.Null(version2.Labels);
554 Assert.Equal("xyz", version2.Metadata);
555 Assert.False(version2.Invalid);
556 Assert.True(version2.HasMajor);
557 Assert.True(version2.HasMinor);
558 Assert.True(version2.HasPatch);
559 Assert.False(version2.HasRevision);
560
561 TestVerutilCompareParsedVersions(version1, version2, 0);
562 }
563
564 [Fact]
565 public void VerParseVersionTreatsTrailingDotsAsInvalid()
566 {
567 var version1 = WixVersion.Parse(".");
568 var version2 = WixVersion.Parse("1.");
569 var version3 = WixVersion.Parse("2.1.");
570 var version4 = WixVersion.Parse("3.2.1.");
571 var version5 = WixVersion.Parse("4.3.2.1.");
572 var version6 = WixVersion.Parse("5-.");
573 var version7 = WixVersion.Parse("6-a.");
574
575 Assert.Null(version1.Prefix);
576 Assert.Equal(0U, version1.Major);
577 Assert.Equal(0U, version1.Minor);
578 Assert.Equal(0U, version1.Patch);
579 Assert.Equal(0U, version1.Revision);
580 Assert.Null(version1.Labels);
581 Assert.Equal(".", version1.Metadata);
582 Assert.True(version1.Invalid);
583 Assert.False(version1.HasMajor);
584 Assert.False(version1.HasMinor);
585 Assert.False(version1.HasPatch);
586 Assert.False(version1.HasRevision);
587
588
589 Assert.Null(version2.Prefix);
590 Assert.Equal(1U, version2.Major);
591 Assert.Equal(0U, version2.Minor);
592 Assert.Equal(0U, version2.Patch);
593 Assert.Equal(0U, version2.Revision);
594 Assert.Null(version2.Labels);
595 Assert.Empty(version2.Metadata);
596 Assert.True(version2.Invalid);
597 Assert.True(version2.HasMajor);
598 Assert.False(version2.HasMinor);
599 Assert.False(version2.HasPatch);
600 Assert.False(version2.HasRevision);
601
602
603 Assert.Null(version3.Prefix);
604 Assert.Equal(2U, version3.Major);
605 Assert.Equal(1U, version3.Minor);
606 Assert.Equal(0U, version3.Patch);
607 Assert.Equal(0U, version3.Revision);
608 Assert.Null(version3.Labels);
609 Assert.Empty(version3.Metadata);
610 Assert.True(version3.Invalid);
611 Assert.True(version3.HasMajor);
612 Assert.True(version3.HasMinor);
613 Assert.False(version3.HasPatch);
614 Assert.False(version3.HasRevision);
615
616 Assert.Null(version4.Prefix);
617 Assert.Equal(3U, version4.Major);
618 Assert.Equal(2U, version4.Minor);
619 Assert.Equal(1U, version4.Patch);
620 Assert.Equal(0U, version4.Revision);
621 Assert.Null(version4.Labels);
622 Assert.Empty(version4.Metadata);
623 Assert.True(version4.Invalid);
624 Assert.True(version4.HasMajor);
625 Assert.True(version4.HasMinor);
626 Assert.True(version4.HasPatch);
627 Assert.False(version4.HasRevision);
628
629 Assert.Null(version5.Prefix);
630 Assert.Equal(4U, version5.Major);
631 Assert.Equal(3U, version5.Minor);
632 Assert.Equal(2U, version5.Patch);
633 Assert.Equal(1U, version5.Revision);
634 Assert.Null(version5.Labels);
635 Assert.Empty(version5.Metadata);
636 Assert.True(version5.Invalid);
637 Assert.True(version5.HasMajor);
638 Assert.True(version5.HasMinor);
639 Assert.True(version5.HasPatch);
640 Assert.True(version5.HasRevision);
641
642 Assert.Null(version6.Prefix);
643 Assert.Equal(5U, version6.Major);
644 Assert.Equal(0U, version6.Minor);
645 Assert.Equal(0U, version6.Patch);
646 Assert.Equal(0U, version6.Revision);
647 Assert.Null(version6.Labels);
648 Assert.Equal(".", version6.Metadata);
649 Assert.True(version6.Invalid);
650 Assert.True(version6.HasMajor);
651 Assert.False(version6.HasMinor);
652 Assert.False(version6.HasPatch);
653 Assert.False(version6.HasRevision);
654
655 Assert.Null(version7.Prefix);
656 Assert.Equal(6U, version7.Major);
657 Assert.Equal(0U, version7.Minor);
658 Assert.Equal(0U, version7.Patch);
659 Assert.Equal(0U, version7.Revision);
660 Assert.Single(version7.Labels);
661 Assert.Null(version7.Labels[0].Numeric);
662 Assert.Equal("a", version7.Labels[0].Label);
663 Assert.Empty(version7.Metadata);
664 Assert.True(version7.Invalid);
665 Assert.True(version7.HasMajor);
666 Assert.False(version7.HasMinor);
667 Assert.False(version7.HasPatch);
668 Assert.False(version7.HasRevision);
669 }
670
671 private static void TestVerutilCompareParsedVersions(WixVersion version1, WixVersion version2, int expectedResult)
672 {
673 var result = version1.CompareTo(version2);
674 Assert.Equal(expectedResult, result);
675
676 result = version2.CompareTo(version1);
677 Assert.Equal(expectedResult, -result);
678
679 var equal = version1.Equals(version2);
680 Assert.Equal(expectedResult == 0, equal);
681 }
682 }
683}
diff --git a/src/libs/test/WixToolsetTest.Versioning/WixToolsetTest.Versioning.csproj b/src/libs/test/WixToolsetTest.Versioning/WixToolsetTest.Versioning.csproj
new file mode 100644
index 00000000..0ac65fec
--- /dev/null
+++ b/src/libs/test/WixToolsetTest.Versioning/WixToolsetTest.Versioning.csproj
@@ -0,0 +1,17 @@
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<Project Sdk="Microsoft.NET.Sdk">
5 <PropertyGroup>
6 <TargetFramework>net6.0</TargetFramework>
7 <IsWixTestProject>true</IsWixTestProject>
8 </PropertyGroup>
9
10 <ItemGroup>
11 <ProjectReference Include="..\..\WixToolset.Versioning\WixToolset.Versioning.csproj" />
12 </ItemGroup>
13
14 <ItemGroup>
15 <PackageReference Include="WixBuildTools.TestSupport" />
16 </ItemGroup>
17</Project>
diff --git a/src/api/wix/test/WixToolsetTest.Data/WixVerFixture.cs b/src/libs/test/WixToolsetTest.Versioning/WixVerFixture.cs
index 56c72896..9026cba6 100644
--- a/src/api/wix/test/WixToolsetTest.Data/WixVerFixture.cs
+++ b/src/libs/test/WixToolsetTest.Versioning/WixVerFixture.cs
@@ -1,10 +1,10 @@
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. 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 2
3namespace WixToolsetTest.Data 3namespace WixToolsetTest.Versioning
4{ 4{
5 using System; 5 using System;
6 using System.Linq; 6 using System.Linq;
7 using WixToolset.Data; 7 using WixToolset.Versioning;
8 using Xunit; 8 using Xunit;
9 9
10 public class WixVerFixture 10 public class WixVerFixture
@@ -404,5 +404,48 @@ namespace WixToolsetTest.Data
404 Assert.Equal(String.Empty, version.Metadata); 404 Assert.Equal(String.Empty, version.Metadata);
405 Assert.True(version.Invalid); 405 Assert.True(version.Invalid);
406 } 406 }
407
408 [Fact]
409 public void CanCompareVersions()
410 {
411 var version1 = WixVersion.Parse("1");
412 var version10 = WixVersion.Parse("1.0");
413 var version100 = WixVersion.Parse("1.0.0");
414 var version2 = WixVersion.Parse("2.0.0");
415 var version201 = WixVersion.Parse("2.0.1");
416 var version2a = WixVersion.Parse("2-a");
417 var version2b = WixVersion.Parse("2-b");
418 var versionInvalid3a = WixVersion.Parse("3.-a");
419 var versionInvalid3b = WixVersion.Parse("3.-b");
420
421 Assert.Equal(version1, version1);
422 Assert.Equal(version1, version10);
423 Assert.True(version1 == version10);
424 Assert.True(version1 == version100);
425 Assert.True(version1 <= version10);
426 Assert.True(version1 >= version10);
427 Assert.False(version1 != version10);
428 Assert.False(version1 < version10);
429 Assert.False(version1 < version100);
430 Assert.False(version1 > version10);
431 Assert.False(version1 > version100);
432
433 Assert.NotEqual(version1, version2);
434 Assert.True(version1 < version2);
435 Assert.False(version1 > version2);
436
437 Assert.True(version2 > version2a);
438 Assert.True(version2 != version2a);
439 Assert.False(version2 < version2a);
440
441 Assert.True(version2 < version201);
442
443 Assert.True(version2a < version2b);
444 Assert.False(version2a > version2b);
445
446 Assert.True(versionInvalid3a < versionInvalid3b);
447
448 Assert.True(version1 < versionInvalid3a);
449 }
407 } 450 }
408} 451}
diff --git a/src/testresultfilelist.txt b/src/testresultfilelist.txt
index 87de7c4e..59584e64 100644
--- a/src/testresultfilelist.txt
+++ b/src/testresultfilelist.txt
@@ -20,4 +20,5 @@ build/logs/TestResults/WixToolsetTest.ManagedHost.trx
20build/logs/TestResults/WixToolsetTest.Mba.Core.trx 20build/logs/TestResults/WixToolsetTest.Mba.Core.trx
21build/logs/TestResults/WixToolsetTest.MsiE2E.trx 21build/logs/TestResults/WixToolsetTest.MsiE2E.trx
22build/logs/TestResults/WixToolsetTest.Sdk.trx 22build/logs/TestResults/WixToolsetTest.Sdk.trx
23build/logs/TestResults/WixToolsetTest.Versioning.trx
23build/logs/TestResults/WixToolsetTest.WixE2ETests.trx \ No newline at end of file 24build/logs/TestResults/WixToolsetTest.WixE2ETests.trx \ No newline at end of file
diff --git a/src/wix/WixToolset.Core.Burn/Bind/BindBundleCommand.cs b/src/wix/WixToolset.Core.Burn/Bind/BindBundleCommand.cs
index d001bf50..6ae3520f 100644
--- a/src/wix/WixToolset.Core.Burn/Bind/BindBundleCommand.cs
+++ b/src/wix/WixToolset.Core.Burn/Bind/BindBundleCommand.cs
@@ -17,6 +17,7 @@ namespace WixToolset.Core.Burn
17 using WixToolset.Extensibility; 17 using WixToolset.Extensibility;
18 using WixToolset.Extensibility.Data; 18 using WixToolset.Extensibility.Data;
19 using WixToolset.Extensibility.Services; 19 using WixToolset.Extensibility.Services;
20 using WixToolset.Versioning;
20 21
21 /// <summary> 22 /// <summary>
22 /// Binds a this.bundle. 23 /// Binds a this.bundle.
diff --git a/src/wix/WixToolset.Core.Burn/Bundles/CreateBundleExeCommand.cs b/src/wix/WixToolset.Core.Burn/Bundles/CreateBundleExeCommand.cs
index 4aed18da..aa4730fb 100644
--- a/src/wix/WixToolset.Core.Burn/Bundles/CreateBundleExeCommand.cs
+++ b/src/wix/WixToolset.Core.Burn/Bundles/CreateBundleExeCommand.cs
@@ -15,6 +15,7 @@ namespace WixToolset.Core.Burn.Bundles
15 using WixToolset.Dtf.Resources; 15 using WixToolset.Dtf.Resources;
16 using WixToolset.Extensibility.Data; 16 using WixToolset.Extensibility.Data;
17 using WixToolset.Extensibility.Services; 17 using WixToolset.Extensibility.Services;
18 using WixToolset.Versioning;
18 19
19 internal class CreateBundleExeCommand 20 internal class CreateBundleExeCommand
20 { 21 {
diff --git a/src/wix/WixToolset.Core.Burn/WixToolset.Core.Burn.csproj b/src/wix/WixToolset.Core.Burn/WixToolset.Core.Burn.csproj
index 754af45e..d56ed326 100644
--- a/src/wix/WixToolset.Core.Burn/WixToolset.Core.Burn.csproj
+++ b/src/wix/WixToolset.Core.Burn/WixToolset.Core.Burn.csproj
@@ -15,7 +15,6 @@
15 </PropertyGroup> 15 </PropertyGroup>
16 16
17 <ItemGroup> 17 <ItemGroup>
18 <ProjectReference Include="..\WixToolset.Core\WixToolset.Core.csproj" />
19 <ProjectReference Include="..\WixToolset.Core.Native\WixToolset.Core.Native.csproj" /> 18 <ProjectReference Include="..\WixToolset.Core.Native\WixToolset.Core.Native.csproj" />
20 </ItemGroup> 19 </ItemGroup>
21 20
@@ -24,5 +23,6 @@
24 <PackageReference Include="WixToolset.Data" /> 23 <PackageReference Include="WixToolset.Data" />
25 <PackageReference Include="WixToolset.Dtf.Resources" /> 24 <PackageReference Include="WixToolset.Dtf.Resources" />
26 <PackageReference Include="WixToolset.Extensibility" /> 25 <PackageReference Include="WixToolset.Extensibility" />
26 <PackageReference Include="WixToolset.Versioning" />
27 </ItemGroup> 27 </ItemGroup>
28</Project> 28</Project>
diff --git a/src/wix/WixToolset.Core.WindowsInstaller/Bind/ProcessPackageSoftwareTagsCommand.cs b/src/wix/WixToolset.Core.WindowsInstaller/Bind/ProcessPackageSoftwareTagsCommand.cs
index 67815fcf..1348f163 100644
--- a/src/wix/WixToolset.Core.WindowsInstaller/Bind/ProcessPackageSoftwareTagsCommand.cs
+++ b/src/wix/WixToolset.Core.WindowsInstaller/Bind/ProcessPackageSoftwareTagsCommand.cs
@@ -11,6 +11,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
11 using WixToolset.Data.Symbols; 11 using WixToolset.Data.Symbols;
12 using WixToolset.Extensibility.Data; 12 using WixToolset.Extensibility.Data;
13 using WixToolset.Extensibility.Services; 13 using WixToolset.Extensibility.Services;
14 using WixToolset.Versioning;
14 15
15 internal class ProcessPackageSoftwareTagsCommand 16 internal class ProcessPackageSoftwareTagsCommand
16 { 17 {
diff --git a/src/wix/WixToolset.Core.WindowsInstaller/WixToolset.Core.WindowsInstaller.csproj b/src/wix/WixToolset.Core.WindowsInstaller/WixToolset.Core.WindowsInstaller.csproj
index fa4ae68c..1f01fff9 100644
--- a/src/wix/WixToolset.Core.WindowsInstaller/WixToolset.Core.WindowsInstaller.csproj
+++ b/src/wix/WixToolset.Core.WindowsInstaller/WixToolset.Core.WindowsInstaller.csproj
@@ -19,6 +19,7 @@
19 <ItemGroup> 19 <ItemGroup>
20 <PackageReference Include="WixToolset.Data" /> 20 <PackageReference Include="WixToolset.Data" />
21 <PackageReference Include="WixToolset.Extensibility" /> 21 <PackageReference Include="WixToolset.Extensibility" />
22 <PackageReference Include="WixToolset.Versioning" />
22 </ItemGroup> 23 </ItemGroup>
23 24
24 <ItemGroup> 25 <ItemGroup>
diff --git a/src/wix/WixToolset.Core/Common.cs b/src/wix/WixToolset.Core/Common.cs
index c838463d..f581e1a4 100644
--- a/src/wix/WixToolset.Core/Common.cs
+++ b/src/wix/WixToolset.Core/Common.cs
@@ -14,6 +14,7 @@ namespace WixToolset.Core
14 using WixToolset.Data; 14 using WixToolset.Data;
15 using WixToolset.Extensibility; 15 using WixToolset.Extensibility;
16 using WixToolset.Extensibility.Services; 16 using WixToolset.Extensibility.Services;
17 using WixToolset.Versioning;
17 18
18 /// <summary> 19 /// <summary>
19 /// Common Wix utility methods and types. 20 /// Common Wix utility methods and types.
diff --git a/src/wix/WixToolset.Core/ExtensibilityServices/BackendHelper.cs b/src/wix/WixToolset.Core/ExtensibilityServices/BackendHelper.cs
index 4a5cc607..43f7aa01 100644
--- a/src/wix/WixToolset.Core/ExtensibilityServices/BackendHelper.cs
+++ b/src/wix/WixToolset.Core/ExtensibilityServices/BackendHelper.cs
@@ -8,6 +8,7 @@ namespace WixToolset.Core.ExtensibilityServices
8 using WixToolset.Data; 8 using WixToolset.Data;
9 using WixToolset.Extensibility.Data; 9 using WixToolset.Extensibility.Data;
10 using WixToolset.Extensibility.Services; 10 using WixToolset.Extensibility.Services;
11 using WixToolset.Versioning;
11 12
12 internal class BackendHelper : LayoutServices, IBackendHelper 13 internal class BackendHelper : LayoutServices, IBackendHelper
13 { 14 {
diff --git a/src/wix/WixToolset.Core/ExtensibilityServices/ParseHelper.cs b/src/wix/WixToolset.Core/ExtensibilityServices/ParseHelper.cs
index 5f4ac726..0ec5b514 100644
--- a/src/wix/WixToolset.Core/ExtensibilityServices/ParseHelper.cs
+++ b/src/wix/WixToolset.Core/ExtensibilityServices/ParseHelper.cs
@@ -15,6 +15,7 @@ namespace WixToolset.Core.ExtensibilityServices
15 using WixToolset.Extensibility; 15 using WixToolset.Extensibility;
16 using WixToolset.Extensibility.Data; 16 using WixToolset.Extensibility.Data;
17 using WixToolset.Extensibility.Services; 17 using WixToolset.Extensibility.Services;
18 using WixToolset.Versioning;
18 19
19 internal class ParseHelper : IParseHelper 20 internal class ParseHelper : IParseHelper
20 { 21 {
diff --git a/src/wix/WixToolset.Core/WixToolset.Core.csproj b/src/wix/WixToolset.Core/WixToolset.Core.csproj
index f2ee3a2c..42b0c0c7 100644
--- a/src/wix/WixToolset.Core/WixToolset.Core.csproj
+++ b/src/wix/WixToolset.Core/WixToolset.Core.csproj
@@ -17,6 +17,7 @@
17 <ItemGroup> 17 <ItemGroup>
18 <PackageReference Include="WixToolset.Data" /> 18 <PackageReference Include="WixToolset.Data" />
19 <PackageReference Include="WixToolset.Extensibility" /> 19 <PackageReference Include="WixToolset.Extensibility" />
20 <PackageReference Include="WixToolset.Versioning" />
20 </ItemGroup> 21 </ItemGroup>
21 22
22 <ItemGroup> 23 <ItemGroup>