Skip to content

Commit 636cc72

Browse files
authored
Merge pull request #3805 from arturcic/feature/cache
Refactor caching system in GitVersion
2 parents 8ea3aaa + cf550f4 commit 636cc72

File tree

6 files changed

+172
-155
lines changed

6 files changed

+172
-155
lines changed

src/GitVersion.Core.Tests/Core/GitVersionExecutorTests.cs

Lines changed: 116 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -91,33 +91,35 @@ public void CacheKeyForWorktree()
9191
[Test]
9292
public void CacheFileExistsOnDisk()
9393
{
94-
const string versionCacheFileContent = @"
95-
Major: 4
96-
Minor: 10
97-
Patch: 3
98-
PreReleaseTag: test.19
99-
PreReleaseTagWithDash: -test.19
100-
PreReleaseLabel: test
101-
PreReleaseLabelWithDash: -test
102-
PreReleaseNumber: 19
103-
WeightedPreReleaseNumber: 19
104-
BuildMetaData:
105-
FullBuildMetaData: Branch.feature/test.Sha.dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f
106-
MajorMinorPatch: 4.10.3
107-
SemVer: 4.10.3-test.19
108-
AssemblySemVer: 4.10.3.0
109-
AssemblySemFileVer: 4.10.3.0
110-
FullSemVer: 4.10.3-test.19
111-
InformationalVersion: 4.10.3-test.19+Branch.feature/test.Sha.dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f
112-
BranchName: feature/test
113-
EscapedBranchName: feature-test
114-
Sha: dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f
115-
ShortSha: dd2a29af
116-
VersionSourceSha: 4.10.2
117-
CommitsSinceVersionSource: 19
118-
CommitDate: 2015-11-10
119-
UncommittedChanges: 0
120-
";
94+
const string versionCacheFileContent = """
95+
{
96+
"Major": 4,
97+
"Minor": 10,
98+
"Patch": 3,
99+
"PreReleaseTag": "test.19",
100+
"PreReleaseTagWithDash": "-test.19",
101+
"PreReleaseLabel": "test",
102+
"PreReleaseLabelWithDash": "-test",
103+
"PreReleaseNumber": 19,
104+
"WeightedPreReleaseNumber": 19,
105+
"BuildMetaData": null,
106+
"FullBuildMetaData": "Branch.feature/test.Sha.dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f",
107+
"MajorMinorPatch": "4.10.3",
108+
"SemVer": "4.10.3-test.19",
109+
"AssemblySemVer": "4.10.3.0",
110+
"AssemblySemFileVer": "4.10.3.0",
111+
"FullSemVer": "4.10.3-test.19",
112+
"InformationalVersion": "4.10.3-test.19+Branch.feature/test.Sha.dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f",
113+
"BranchName": "feature/test",
114+
"EscapedBranchName": "feature-test",
115+
"Sha": "dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f",
116+
"ShortSha": "dd2a29af",
117+
"VersionSourceSha": "4.10.2",
118+
"CommitsSinceVersionSource": 19,
119+
"CommitDate": "2015-11-10T00:00:00.000Z",
120+
"UncommittedChanges": 0
121+
}
122+
""";
121123

122124
var stringBuilder = new StringBuilder();
123125
void Action(string s) => stringBuilder.AppendLine(s);
@@ -145,37 +147,39 @@ public void CacheFileExistsOnDisk()
145147

146148
var logsMessages = stringBuilder.ToString();
147149

148-
logsMessages.ShouldContain("Deserializing version variables from cache file", Case.Insensitive, logsMessages);
150+
logsMessages.ShouldContain("Loading version variables from disk cache file", Case.Insensitive, logsMessages);
149151
}
150152

151153
[Test]
152154
public void CacheFileExistsOnDiskWhenOverrideConfigIsSpecifiedVersionShouldBeDynamicallyCalculatedWithoutSavingInCache()
153155
{
154-
const string versionCacheFileContent = @"
155-
Major: 4
156-
Minor: 10
157-
Patch: 3
158-
PreReleaseTag: test.19
159-
PreReleaseTagWithDash: -test.19
160-
PreReleaseLabel: test
161-
PreReleaseLabelWithDash: -test
162-
PreReleaseNumber: 19
163-
BuildMetaData:
164-
FullBuildMetaData: Branch.feature/test.Sha.dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f
165-
MajorMinorPatch: 4.10.3
166-
SemVer: 4.10.3-test.19
167-
AssemblySemVer: 4.10.3.0
168-
AssemblySemFileVer: 4.10.3.0
169-
FullSemVer: 4.10.3-test.19
170-
InformationalVersion: 4.10.3-test.19+Branch.feature/test.Sha.dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f
171-
BranchName: feature/test
172-
EscapedBranchName: feature-test
173-
Sha: dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f
174-
ShortSha: dd2a29af
175-
CommitsSinceVersionSource: 19
176-
CommitDate: 2015-11-10
177-
UncommittedChanges: 0
178-
";
156+
const string versionCacheFileContent = """
157+
{
158+
"Major": 4,
159+
"Minor": 10,
160+
"Patch": 3,
161+
"PreReleaseTag": "test.19",
162+
"PreReleaseTagWithDash": "-test.19",
163+
"PreReleaseLabel": "test",
164+
"PreReleaseLabelWithDash": "-test",
165+
"PreReleaseNumber": 19,
166+
"BuildMetaData": null,
167+
"FullBuildMetaData": "Branch.feature/test.Sha.dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f",
168+
"MajorMinorPatch": "4.10.3",
169+
"SemVer": "4.10.3-test.19",
170+
"AssemblySemVer": "4.10.3.0",
171+
"AssemblySemFileVer": "4.10.3.0",
172+
"FullSemVer": "4.10.3-test.19",
173+
"InformationalVersion": "4.10.3-test.19+Branch.feature/test.Sha.dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f",
174+
"BranchName": "feature/test",
175+
"EscapedBranchName": "feature-test",
176+
"Sha": "dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f",
177+
"ShortSha": "dd2a29af",
178+
"CommitsSinceVersionSource": 19,
179+
"CommitDate": "2015-11-10T00:00:00.000Z",
180+
"UncommittedChanges": 0
181+
}
182+
""";
179183

180184
using var fixture = new EmptyRepositoryFixture();
181185
fixture.Repository.MakeACommit();
@@ -228,40 +232,42 @@ public void CacheFileIsMissing()
228232
gitVersionCalculator.CalculateVersionVariables();
229233

230234
var logsMessages = stringBuilder.ToString();
231-
logsMessages.ShouldContain("yml not found", Case.Insensitive, logsMessages);
235+
logsMessages.ShouldContain(".json not found", Case.Insensitive, logsMessages);
232236
}
233237

234238
[TestCase(ConfigurationFileLocator.DefaultFileName)]
235239
[TestCase(ConfigurationFileLocator.DefaultAlternativeFileName)]
236240
public void ConfigChangeInvalidatesCache(string configFileName)
237241
{
238-
const string versionCacheFileContent = @"
239-
Major: 4
240-
Minor: 10
241-
Patch: 3
242-
PreReleaseTag: test.19
243-
PreReleaseTagWithDash: -test.19
244-
PreReleaseLabel: test
245-
PreReleaseLabelWithDash: -test
246-
PreReleaseNumber: 19
247-
WeightedPreReleaseNumber: 19
248-
BuildMetaData:
249-
FullBuildMetaData: Branch.feature/test.Sha.dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f
250-
MajorMinorPatch: 4.10.3
251-
SemVer: 4.10.3-test.19
252-
AssemblySemVer: 4.10.3.0
253-
AssemblySemFileVer: 4.10.3.0
254-
FullSemVer: 4.10.3-test.19
255-
InformationalVersion: 4.10.3-test.19+Branch.feature/test.Sha.dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f
256-
BranchName: feature/test
257-
EscapedBranchName: feature-test
258-
Sha: dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f
259-
ShortSha: dd2a29af
260-
VersionSourceSha: 4.10.2
261-
CommitsSinceVersionSource: 19
262-
CommitDate: 2015-11-10
263-
UncommittedChanges: 0
264-
";
242+
const string versionCacheFileContent = """
243+
{
244+
"Major": 4,
245+
"Minor": 10,
246+
"Patch": 3,
247+
"PreReleaseTag": "test.19",
248+
"PreReleaseTagWithDash": "-test.19",
249+
"PreReleaseLabel": "test",
250+
"PreReleaseLabelWithDash": "-test",
251+
"PreReleaseNumber": 19,
252+
"WeightedPreReleaseNumber": 19,
253+
"BuildMetaData": null,
254+
"FullBuildMetaData": "Branch.feature/test.Sha.dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f",
255+
"MajorMinorPatch": "4.10.3",
256+
"SemVer": "4.10.3-test.19",
257+
"AssemblySemVer": "4.10.3.0",
258+
"AssemblySemFileVer": "4.10.3.0",
259+
"FullSemVer": "4.10.3-test.19",
260+
"InformationalVersion": "4.10.3-test.19+Branch.feature/test.Sha.dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f",
261+
"BranchName": "feature/test",
262+
"EscapedBranchName": "feature-test",
263+
"Sha": "dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f",
264+
"ShortSha": "dd2a29af",
265+
"VersionSourceSha": "4.10.2",
266+
"CommitsSinceVersionSource": 19,
267+
"CommitDate": "2015-11-10T00:00:00.000Z",
268+
"UncommittedChanges": 0
269+
}
270+
""";
265271

266272
using var fixture = new EmptyRepositoryFixture();
267273

@@ -295,33 +301,35 @@ public void ConfigChangeInvalidatesCache(string configFileName)
295301
[Test]
296302
public void NoCacheBypassesCache()
297303
{
298-
const string versionCacheFileContent = @"
299-
Major: 4
300-
Minor: 10
301-
Patch: 3
302-
PreReleaseTag: test.19
303-
PreReleaseTagWithDash: -test.19
304-
PreReleaseLabel: test
305-
PreReleaseLabelWithDash: -test
306-
PreReleaseNumber: 19
307-
WeightedPreReleaseNumber: 19
308-
BuildMetaData:
309-
FullBuildMetaData: Branch.feature/test.Sha.dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f
310-
MajorMinorPatch: 4.10.3
311-
SemVer: 4.10.3-test.19
312-
AssemblySemVer: 4.10.3.0
313-
AssemblySemFileVer: 4.10.3.0
314-
FullSemVer: 4.10.3-test.19
315-
InformationalVersion: 4.10.3-test.19+Branch.feature/test.Sha.dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f
316-
BranchName: feature/test
317-
EscapedBranchName: feature-test
318-
Sha: dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f
319-
ShortSha: dd2a29af
320-
VersionSourceSha: 4.10.2
321-
CommitsSinceVersionSource: 19
322-
CommitDate: 2015-11-10
323-
UncommittedChanges: 0
324-
";
304+
const string versionCacheFileContent = """
305+
{
306+
"Major": 4,
307+
"Minor": 10,
308+
"Patch": 3,
309+
"PreReleaseTag": "test.19",
310+
"PreReleaseTagWithDash": "-test.19",
311+
"PreReleaseLabel": "test",
312+
"PreReleaseLabelWithDash": "-test",
313+
"PreReleaseNumber": 19,
314+
"WeightedPreReleaseNumber": 19,
315+
"BuildMetaData": null,
316+
"FullBuildMetaData": "Branch.feature/test.Sha.dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f",
317+
"MajorMinorPatch": "4.10.3",
318+
"SemVer": "4.10.3-test.19",
319+
"AssemblySemVer": "4.10.3.0",
320+
"AssemblySemFileVer": "4.10.3.0",
321+
"FullSemVer": "4.10.3-test.19",
322+
"InformationalVersion": "4.10.3-test.19+Branch.feature/test.Sha.dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f",
323+
"BranchName": "feature/test",
324+
"EscapedBranchName": "feature-test",
325+
"Sha": "dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f",
326+
"ShortSha": "dd2a29af",
327+
"VersionSourceSha": "4.10.2",
328+
"CommitsSinceVersionSource": 19,
329+
"CommitDate": "2015-11-10T00:00:00.000Z",
330+
"UncommittedChanges": 0
331+
}
332+
""";
325333

326334
using var fixture = new EmptyRepositoryFixture();
327335

src/GitVersion.Core/GitVersion.Core.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
<PackageReference Include="Polly" />
1616
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" />
1717
<PackageReference Include="Microsoft.Extensions.Options" />
18-
<PackageReference Include="YamlDotNet" />
1918
</ItemGroup>
2019

2120
<ItemGroup>

src/GitVersion.Core/OutputVariables/VersionVariablesHelper.cs

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using System.Text.Encodings.Web;
22
using GitVersion.Extensions;
33
using GitVersion.Helpers;
4-
using YamlDotNet.Serialization;
54

65
namespace GitVersion.OutputVariables;
76

@@ -49,6 +48,25 @@ public static GitVersionVariables FromFile(string filePath, IFileSystem fileSyst
4948
}
5049
}
5150

51+
public static void ToFile(GitVersionVariables gitVersionVariables, string filePath, IFileSystem fileSystem)
52+
{
53+
try
54+
{
55+
var retryAction = new RetryAction<IOException>();
56+
retryAction.Execute(() => ToFileInternal(gitVersionVariables, filePath, fileSystem));
57+
}
58+
catch (AggregateException ex)
59+
{
60+
var lastException = ex.InnerExceptions.LastOrDefault() ?? ex.InnerException;
61+
if (lastException != null)
62+
{
63+
throw lastException;
64+
}
65+
66+
throw;
67+
}
68+
}
69+
5270
private static GitVersionVariables FromDictionary(IEnumerable<KeyValuePair<string, string>>? properties)
5371
{
5472
var type = typeof(GitVersionVariables);
@@ -65,11 +83,14 @@ private static GitVersionVariables FromDictionary(IEnumerable<KeyValuePair<strin
6583

6684
private static GitVersionVariables FromFileInternal(string filePath, IFileSystem fileSystem)
6785
{
68-
using var stream = fileSystem.OpenRead(filePath);
69-
using var reader = new StreamReader(stream);
70-
var dictionary = new Deserializer().Deserialize<Dictionary<string, string>>(reader);
71-
var versionVariables = FromDictionary(dictionary);
72-
return versionVariables;
86+
var json = fileSystem.ReadAllText(filePath);
87+
return FromJson(json);
88+
}
89+
90+
private static void ToFileInternal(GitVersionVariables gitVersionVariables, string filePath, IFileSystem fileSystem)
91+
{
92+
var json = gitVersionVariables.ToJson();
93+
fileSystem.WriteAllText(filePath, json);
7394
}
7495

7596
private static JsonSerializerOptions JsonSerializerOptions() => new() { WriteIndented = true, Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, Converters = { new VersionVariablesJsonStringConverter() } };

src/GitVersion.Core/PublicAPI.Unshipped.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -865,6 +865,7 @@ static GitVersion.Logging.LogExtensions.Warning(this GitVersion.Logging.ILog! lo
865865
static GitVersion.Logging.LogExtensions.Write(this GitVersion.Logging.ILog! log, GitVersion.Logging.LogLevel level, string! format, params object![]! args) -> void
866866
static GitVersion.OutputVariables.VersionVariablesHelper.FromFile(string! filePath, GitVersion.IFileSystem! fileSystem) -> GitVersion.OutputVariables.GitVersionVariables!
867867
static GitVersion.OutputVariables.VersionVariablesHelper.FromJson(string! json) -> GitVersion.OutputVariables.GitVersionVariables!
868+
static GitVersion.OutputVariables.VersionVariablesHelper.ToFile(GitVersion.OutputVariables.GitVersionVariables! gitVersionVariables, string! filePath, GitVersion.IFileSystem! fileSystem) -> void
868869
static GitVersion.OutputVariables.VersionVariablesHelper.ToJson(this GitVersion.OutputVariables.GitVersionVariables! gitVersionVariables) -> string!
869870
static GitVersion.ReferenceName.FromBranchName(string! branchName) -> GitVersion.ReferenceName!
870871
static GitVersion.ReferenceName.Parse(string! canonicalName) -> GitVersion.ReferenceName!

0 commit comments

Comments
 (0)