Skip to content

Commit 482ef9c

Browse files
committed
Convert git wrapper classes to readonly structs
Replaces several internal classes with readonly structs to improve performance by avoiding unnecessary heap allocations. Updates related code to ensure compatibility with the new struct-based implementation.
1 parent e88c581 commit 482ef9c

File tree

9 files changed

+34
-35
lines changed

9 files changed

+34
-35
lines changed

src/GitVersion.LibGit2Sharp/Git/Branch.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
namespace GitVersion.Git;
55

6-
internal sealed class Branch : IBranch
6+
internal readonly struct Branch : IBranch
77
{
88
private static readonly LambdaEqualityHelper<IBranch> equalityHelper = new(x => x.Name.Canonical);
99
private static readonly LambdaKeyComparer<IBranch, string> comparerHelper = new(x => x.Name.Canonical);

src/GitVersion.LibGit2Sharp/Git/Commit.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
namespace GitVersion.Git;
66

7-
internal sealed class Commit : ICommit
7+
internal readonly struct Commit : ICommit
88
{
99
private static readonly ConcurrentDictionary<string, IReadOnlyList<string>> pathsCache = new();
1010
private static readonly LambdaEqualityHelper<ICommit> equalityHelper = new(x => x.Id);
@@ -19,7 +19,7 @@ internal Commit(LibGit2Sharp.Commit innerCommit, LibGit2Sharp.Diff repoDiff, Git
1919
repoDiff.NotNull();
2020
repo.NotNull();
2121
this.innerCommit = innerCommit.NotNull();
22-
this.parentsLazy = new(() => innerCommit.Parents.Select(parent => repo.GetOrWrap(parent, repoDiff)).ToList());
22+
this.parentsLazy = new(() => [.. innerCommit.Parents.Select(parent => repo.GetOrWrap(parent, repoDiff))]);
2323
Id = new ObjectId(innerCommit.Id);
2424
Sha = innerCommit.Sha;
2525
When = innerCommit.Committer.When;

src/GitVersion.LibGit2Sharp/Git/ObjectId.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
namespace GitVersion.Git;
55

6-
internal sealed class ObjectId : IObjectId
6+
internal readonly struct ObjectId : IObjectId
77
{
88
private static readonly LambdaEqualityHelper<IObjectId> equalityHelper = new(x => x.Sha);
99
private static readonly LambdaKeyComparer<IObjectId, string> comparerHelper = new(x => x.Sha);

src/GitVersion.LibGit2Sharp/Git/RefSpec.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
namespace GitVersion.Git;
55

6-
internal class RefSpec : IRefSpec
6+
internal readonly struct RefSpec : IRefSpec
77
{
88
private static readonly LambdaEqualityHelper<IRefSpec> equalityHelper = new(x => x.Specification);
99
private static readonly LambdaKeyComparer<IRefSpec, string> comparerHelper = new(x => x.Specification);

src/GitVersion.LibGit2Sharp/Git/Reference.cs

Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,32 +2,31 @@
22
using GitVersion.Helpers;
33
using LibGit2Sharp;
44

5-
namespace GitVersion.Git
6-
{
7-
internal sealed class Reference : IReference
8-
{
9-
private static readonly LambdaEqualityHelper<IReference> equalityHelper = new(x => x.Name.Canonical);
10-
private static readonly LambdaKeyComparer<IReference, string> comparerHelper = new(x => x.Name.Canonical);
11-
internal readonly LibGit2Sharp.Reference innerReference;
5+
namespace GitVersion.Git;
126

13-
internal Reference(LibGit2Sharp.Reference reference)
14-
{
15-
this.innerReference = reference.NotNull();
16-
Name = new ReferenceName(reference.CanonicalName);
7+
internal readonly struct Reference : IReference
8+
{
9+
private static readonly LambdaEqualityHelper<IReference> equalityHelper = new(x => x.Name.Canonical);
10+
private static readonly LambdaKeyComparer<IReference, string> comparerHelper = new(x => x.Name.Canonical);
11+
internal readonly LibGit2Sharp.Reference innerReference;
1712

18-
if (reference is DirectReference)
19-
ReferenceTargetId = new ObjectId(reference.TargetIdentifier);
20-
}
13+
internal Reference(LibGit2Sharp.Reference reference)
14+
{
15+
this.innerReference = reference.NotNull();
16+
Name = new ReferenceName(reference.CanonicalName);
2117

22-
public ReferenceName Name { get; }
23-
public IObjectId? ReferenceTargetId { get; }
24-
public int CompareTo(IReference? other) => comparerHelper.Compare(this, other);
25-
public override bool Equals(object? obj) => Equals(obj as IReference);
26-
public bool Equals(IReference? other) => equalityHelper.Equals(this, other);
27-
public override int GetHashCode() => equalityHelper.GetHashCode(this);
28-
public override string ToString() => Name.ToString();
29-
public string TargetIdentifier => this.innerReference.TargetIdentifier;
30-
public static implicit operator LibGit2Sharp.Reference(Reference d)
31-
=> d.NotNull().innerReference;
18+
if (reference is DirectReference)
19+
ReferenceTargetId = new ObjectId(reference.TargetIdentifier);
3220
}
21+
22+
public ReferenceName Name { get; }
23+
public IObjectId? ReferenceTargetId { get; }
24+
public int CompareTo(IReference? other) => comparerHelper.Compare(this, other);
25+
public override bool Equals(object? obj) => Equals(obj as IReference);
26+
public bool Equals(IReference? other) => equalityHelper.Equals(this, other);
27+
public override int GetHashCode() => equalityHelper.GetHashCode(this);
28+
public override string ToString() => Name.ToString();
29+
public string TargetIdentifier => this.innerReference.TargetIdentifier;
30+
public static implicit operator LibGit2Sharp.Reference(Reference d)
31+
=> d.innerReference;
3332
}

src/GitVersion.LibGit2Sharp/Git/ReferenceCollection.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,5 @@ public IReference? this[string name]
3838

3939
public IReference? Head => this["HEAD"];
4040

41-
public IEnumerable<IReference> FromGlob(string prefix) => this.innerCollection.FromGlob(prefix).Select(reference => new Reference(reference));
41+
public IEnumerable<IReference> FromGlob(string prefix) => this.innerCollection.FromGlob(prefix).Select(reference => (IReference)new Reference(reference));
4242
}

src/GitVersion.LibGit2Sharp/Git/Remote.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
namespace GitVersion.Git;
55

6-
internal sealed class Remote : IRemote
6+
internal readonly struct Remote : IRemote
77
{
88
private static readonly LambdaEqualityHelper<IRemote> equalityHelper = new(x => x.Name);
99
private static readonly LambdaKeyComparer<IRemote, string> comparerHelper = new(x => x.Name);

src/GitVersion.LibGit2Sharp/Git/Tag.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
namespace GitVersion.Git;
66

7-
internal sealed class Tag : ITag
7+
internal readonly struct Tag : ITag
88
{
99
private static readonly LambdaEqualityHelper<ITag> equalityHelper = new(x => x.Name.Canonical);
1010
private static readonly LambdaKeyComparer<ITag, string> comparerHelper = new(x => x.Name.Canonical);
@@ -16,9 +16,9 @@ internal sealed class Tag : ITag
1616
internal Tag(LibGit2Sharp.Tag tag, Diff diff, GitRepository repo)
1717
{
1818
this.innerTag = tag.NotNull();
19-
this.commitLazy = new(PeeledTargetCommit);
2019
this.diff = diff.NotNull();
2120
this.repo = repo.NotNull();
21+
this.commitLazy = new(PeeledTargetCommit);
2222
Name = new(this.innerTag.CanonicalName);
2323
}
2424

@@ -28,7 +28,7 @@ internal Tag(LibGit2Sharp.Tag tag, Diff diff, GitRepository repo)
2828
public string TargetSha => this.innerTag.Target.Sha;
2929
public ICommit Commit => this.commitLazy.Value.NotNull();
3030

31-
private Commit? PeeledTargetCommit()
31+
private ICommit? PeeledTargetCommit()
3232
{
3333
var target = this.innerTag.Target;
3434

src/GitVersion.LibGit2Sharp/Git/TreeChanges.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
namespace GitVersion.Git;
22

3-
internal sealed class TreeChanges(LibGit2Sharp.TreeChanges innerTreeChanges) : ITreeChanges
3+
internal readonly struct TreeChanges(LibGit2Sharp.TreeChanges innerTreeChanges) : ITreeChanges
44
{
55
private readonly LibGit2Sharp.TreeChanges innerTreeChanges = innerTreeChanges ?? throw new ArgumentNullException(nameof(innerTreeChanges));
66

0 commit comments

Comments
 (0)