Skip to content

Refactor caching system in GitVersion #3805

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Nov 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
224 changes: 116 additions & 108 deletions src/GitVersion.Core.Tests/Core/GitVersionExecutorTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -91,33 +91,35 @@ public void CacheKeyForWorktree()
[Test]
public void CacheFileExistsOnDisk()
{
const string versionCacheFileContent = @"
Major: 4
Minor: 10
Patch: 3
PreReleaseTag: test.19
PreReleaseTagWithDash: -test.19
PreReleaseLabel: test
PreReleaseLabelWithDash: -test
PreReleaseNumber: 19
WeightedPreReleaseNumber: 19
BuildMetaData:
FullBuildMetaData: Branch.feature/test.Sha.dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f
MajorMinorPatch: 4.10.3
SemVer: 4.10.3-test.19
AssemblySemVer: 4.10.3.0
AssemblySemFileVer: 4.10.3.0
FullSemVer: 4.10.3-test.19
InformationalVersion: 4.10.3-test.19+Branch.feature/test.Sha.dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f
BranchName: feature/test
EscapedBranchName: feature-test
Sha: dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f
ShortSha: dd2a29af
VersionSourceSha: 4.10.2
CommitsSinceVersionSource: 19
CommitDate: 2015-11-10
UncommittedChanges: 0
";
const string versionCacheFileContent = """
{
"Major": 4,
"Minor": 10,
"Patch": 3,
"PreReleaseTag": "test.19",
"PreReleaseTagWithDash": "-test.19",
"PreReleaseLabel": "test",
"PreReleaseLabelWithDash": "-test",
"PreReleaseNumber": 19,
"WeightedPreReleaseNumber": 19,
"BuildMetaData": null,
"FullBuildMetaData": "Branch.feature/test.Sha.dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f",
"MajorMinorPatch": "4.10.3",
"SemVer": "4.10.3-test.19",
"AssemblySemVer": "4.10.3.0",
"AssemblySemFileVer": "4.10.3.0",
"FullSemVer": "4.10.3-test.19",
"InformationalVersion": "4.10.3-test.19+Branch.feature/test.Sha.dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f",
"BranchName": "feature/test",
"EscapedBranchName": "feature-test",
"Sha": "dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f",
"ShortSha": "dd2a29af",
"VersionSourceSha": "4.10.2",
"CommitsSinceVersionSource": 19,
"CommitDate": "2015-11-10T00:00:00.000Z",
"UncommittedChanges": 0
}
""";

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

var logsMessages = stringBuilder.ToString();

logsMessages.ShouldContain("Deserializing version variables from cache file", Case.Insensitive, logsMessages);
logsMessages.ShouldContain("Loading version variables from disk cache file", Case.Insensitive, logsMessages);
}

[Test]
public void CacheFileExistsOnDiskWhenOverrideConfigIsSpecifiedVersionShouldBeDynamicallyCalculatedWithoutSavingInCache()
{
const string versionCacheFileContent = @"
Major: 4
Minor: 10
Patch: 3
PreReleaseTag: test.19
PreReleaseTagWithDash: -test.19
PreReleaseLabel: test
PreReleaseLabelWithDash: -test
PreReleaseNumber: 19
BuildMetaData:
FullBuildMetaData: Branch.feature/test.Sha.dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f
MajorMinorPatch: 4.10.3
SemVer: 4.10.3-test.19
AssemblySemVer: 4.10.3.0
AssemblySemFileVer: 4.10.3.0
FullSemVer: 4.10.3-test.19
InformationalVersion: 4.10.3-test.19+Branch.feature/test.Sha.dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f
BranchName: feature/test
EscapedBranchName: feature-test
Sha: dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f
ShortSha: dd2a29af
CommitsSinceVersionSource: 19
CommitDate: 2015-11-10
UncommittedChanges: 0
";
const string versionCacheFileContent = """
{
"Major": 4,
"Minor": 10,
"Patch": 3,
"PreReleaseTag": "test.19",
"PreReleaseTagWithDash": "-test.19",
"PreReleaseLabel": "test",
"PreReleaseLabelWithDash": "-test",
"PreReleaseNumber": 19,
"BuildMetaData": null,
"FullBuildMetaData": "Branch.feature/test.Sha.dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f",
"MajorMinorPatch": "4.10.3",
"SemVer": "4.10.3-test.19",
"AssemblySemVer": "4.10.3.0",
"AssemblySemFileVer": "4.10.3.0",
"FullSemVer": "4.10.3-test.19",
"InformationalVersion": "4.10.3-test.19+Branch.feature/test.Sha.dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f",
"BranchName": "feature/test",
"EscapedBranchName": "feature-test",
"Sha": "dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f",
"ShortSha": "dd2a29af",
"CommitsSinceVersionSource": 19,
"CommitDate": "2015-11-10T00:00:00.000Z",
"UncommittedChanges": 0
}
""";

using var fixture = new EmptyRepositoryFixture();
fixture.Repository.MakeACommit();
Expand Down Expand Up @@ -228,40 +232,42 @@ public void CacheFileIsMissing()
gitVersionCalculator.CalculateVersionVariables();

var logsMessages = stringBuilder.ToString();
logsMessages.ShouldContain("yml not found", Case.Insensitive, logsMessages);
logsMessages.ShouldContain(".json not found", Case.Insensitive, logsMessages);
}

[TestCase(ConfigurationFileLocator.DefaultFileName)]
[TestCase(ConfigurationFileLocator.DefaultAlternativeFileName)]
public void ConfigChangeInvalidatesCache(string configFileName)
{
const string versionCacheFileContent = @"
Major: 4
Minor: 10
Patch: 3
PreReleaseTag: test.19
PreReleaseTagWithDash: -test.19
PreReleaseLabel: test
PreReleaseLabelWithDash: -test
PreReleaseNumber: 19
WeightedPreReleaseNumber: 19
BuildMetaData:
FullBuildMetaData: Branch.feature/test.Sha.dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f
MajorMinorPatch: 4.10.3
SemVer: 4.10.3-test.19
AssemblySemVer: 4.10.3.0
AssemblySemFileVer: 4.10.3.0
FullSemVer: 4.10.3-test.19
InformationalVersion: 4.10.3-test.19+Branch.feature/test.Sha.dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f
BranchName: feature/test
EscapedBranchName: feature-test
Sha: dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f
ShortSha: dd2a29af
VersionSourceSha: 4.10.2
CommitsSinceVersionSource: 19
CommitDate: 2015-11-10
UncommittedChanges: 0
";
const string versionCacheFileContent = """
{
"Major": 4,
"Minor": 10,
"Patch": 3,
"PreReleaseTag": "test.19",
"PreReleaseTagWithDash": "-test.19",
"PreReleaseLabel": "test",
"PreReleaseLabelWithDash": "-test",
"PreReleaseNumber": 19,
"WeightedPreReleaseNumber": 19,
"BuildMetaData": null,
"FullBuildMetaData": "Branch.feature/test.Sha.dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f",
"MajorMinorPatch": "4.10.3",
"SemVer": "4.10.3-test.19",
"AssemblySemVer": "4.10.3.0",
"AssemblySemFileVer": "4.10.3.0",
"FullSemVer": "4.10.3-test.19",
"InformationalVersion": "4.10.3-test.19+Branch.feature/test.Sha.dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f",
"BranchName": "feature/test",
"EscapedBranchName": "feature-test",
"Sha": "dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f",
"ShortSha": "dd2a29af",
"VersionSourceSha": "4.10.2",
"CommitsSinceVersionSource": 19,
"CommitDate": "2015-11-10T00:00:00.000Z",
"UncommittedChanges": 0
}
""";

using var fixture = new EmptyRepositoryFixture();

Expand Down Expand Up @@ -295,33 +301,35 @@ public void ConfigChangeInvalidatesCache(string configFileName)
[Test]
public void NoCacheBypassesCache()
{
const string versionCacheFileContent = @"
Major: 4
Minor: 10
Patch: 3
PreReleaseTag: test.19
PreReleaseTagWithDash: -test.19
PreReleaseLabel: test
PreReleaseLabelWithDash: -test
PreReleaseNumber: 19
WeightedPreReleaseNumber: 19
BuildMetaData:
FullBuildMetaData: Branch.feature/test.Sha.dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f
MajorMinorPatch: 4.10.3
SemVer: 4.10.3-test.19
AssemblySemVer: 4.10.3.0
AssemblySemFileVer: 4.10.3.0
FullSemVer: 4.10.3-test.19
InformationalVersion: 4.10.3-test.19+Branch.feature/test.Sha.dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f
BranchName: feature/test
EscapedBranchName: feature-test
Sha: dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f
ShortSha: dd2a29af
VersionSourceSha: 4.10.2
CommitsSinceVersionSource: 19
CommitDate: 2015-11-10
UncommittedChanges: 0
";
const string versionCacheFileContent = """
{
"Major": 4,
"Minor": 10,
"Patch": 3,
"PreReleaseTag": "test.19",
"PreReleaseTagWithDash": "-test.19",
"PreReleaseLabel": "test",
"PreReleaseLabelWithDash": "-test",
"PreReleaseNumber": 19,
"WeightedPreReleaseNumber": 19,
"BuildMetaData": null,
"FullBuildMetaData": "Branch.feature/test.Sha.dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f",
"MajorMinorPatch": "4.10.3",
"SemVer": "4.10.3-test.19",
"AssemblySemVer": "4.10.3.0",
"AssemblySemFileVer": "4.10.3.0",
"FullSemVer": "4.10.3-test.19",
"InformationalVersion": "4.10.3-test.19+Branch.feature/test.Sha.dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f",
"BranchName": "feature/test",
"EscapedBranchName": "feature-test",
"Sha": "dd2a29aff0c948e1bdf3dabbe13e1576e70d5f9f",
"ShortSha": "dd2a29af",
"VersionSourceSha": "4.10.2",
"CommitsSinceVersionSource": 19,
"CommitDate": "2015-11-10T00:00:00.000Z",
"UncommittedChanges": 0
}
""";

using var fixture = new EmptyRepositoryFixture();

Expand Down
1 change: 0 additions & 1 deletion src/GitVersion.Core/GitVersion.Core.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
<PackageReference Include="Polly" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" />
<PackageReference Include="Microsoft.Extensions.Options" />
<PackageReference Include="YamlDotNet" />
</ItemGroup>

<ItemGroup>
Expand Down
33 changes: 27 additions & 6 deletions src/GitVersion.Core/OutputVariables/VersionVariablesHelper.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
using System.Text.Encodings.Web;
using GitVersion.Extensions;
using GitVersion.Helpers;
using YamlDotNet.Serialization;

namespace GitVersion.OutputVariables;

Expand Down Expand Up @@ -49,6 +48,25 @@ public static GitVersionVariables FromFile(string filePath, IFileSystem fileSyst
}
}

public static void ToFile(GitVersionVariables gitVersionVariables, string filePath, IFileSystem fileSystem)
{
try
{
var retryAction = new RetryAction<IOException>();
retryAction.Execute(() => ToFileInternal(gitVersionVariables, filePath, fileSystem));
}
catch (AggregateException ex)
{
var lastException = ex.InnerExceptions.LastOrDefault() ?? ex.InnerException;
if (lastException != null)
{
throw lastException;
}

throw;
}
}

private static GitVersionVariables FromDictionary(IEnumerable<KeyValuePair<string, string>>? properties)
{
var type = typeof(GitVersionVariables);
Expand All @@ -65,11 +83,14 @@ private static GitVersionVariables FromDictionary(IEnumerable<KeyValuePair<strin

private static GitVersionVariables FromFileInternal(string filePath, IFileSystem fileSystem)
{
using var stream = fileSystem.OpenRead(filePath);
using var reader = new StreamReader(stream);
var dictionary = new Deserializer().Deserialize<Dictionary<string, string>>(reader);
var versionVariables = FromDictionary(dictionary);
return versionVariables;
var json = fileSystem.ReadAllText(filePath);
return FromJson(json);
}

private static void ToFileInternal(GitVersionVariables gitVersionVariables, string filePath, IFileSystem fileSystem)
{
var json = gitVersionVariables.ToJson();
fileSystem.WriteAllText(filePath, json);
}

private static JsonSerializerOptions JsonSerializerOptions() => new() { WriteIndented = true, Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, Converters = { new VersionVariablesJsonStringConverter() } };
Expand Down
1 change: 1 addition & 0 deletions src/GitVersion.Core/PublicAPI.Unshipped.txt
Original file line number Diff line number Diff line change
Expand Up @@ -865,6 +865,7 @@ static GitVersion.Logging.LogExtensions.Warning(this GitVersion.Logging.ILog! lo
static GitVersion.Logging.LogExtensions.Write(this GitVersion.Logging.ILog! log, GitVersion.Logging.LogLevel level, string! format, params object![]! args) -> void
static GitVersion.OutputVariables.VersionVariablesHelper.FromFile(string! filePath, GitVersion.IFileSystem! fileSystem) -> GitVersion.OutputVariables.GitVersionVariables!
static GitVersion.OutputVariables.VersionVariablesHelper.FromJson(string! json) -> GitVersion.OutputVariables.GitVersionVariables!
static GitVersion.OutputVariables.VersionVariablesHelper.ToFile(GitVersion.OutputVariables.GitVersionVariables! gitVersionVariables, string! filePath, GitVersion.IFileSystem! fileSystem) -> void
static GitVersion.OutputVariables.VersionVariablesHelper.ToJson(this GitVersion.OutputVariables.GitVersionVariables! gitVersionVariables) -> string!
static GitVersion.ReferenceName.FromBranchName(string! branchName) -> GitVersion.ReferenceName!
static GitVersion.ReferenceName.Parse(string! canonicalName) -> GitVersion.ReferenceName!
Expand Down
Loading