From 4b46919bf55e60becbca4e23efc2ce6f943b1926 Mon Sep 17 00:00:00 2001 From: nulltoken Date: Sat, 21 May 2011 13:40:57 +0200 Subject: [PATCH] Improve performance of resolving of direct references --- LibGit2Sharp/DirectReference.cs | 29 ++++++++++++++++++++++++----- LibGit2Sharp/Reference.cs | 8 +++----- LibGit2Sharp/SymbolicReference.cs | 5 ----- 3 files changed, 27 insertions(+), 15 deletions(-) diff --git a/LibGit2Sharp/DirectReference.cs b/LibGit2Sharp/DirectReference.cs index cc79e5d7c..7a3feb9a7 100644 --- a/LibGit2Sharp/DirectReference.cs +++ b/LibGit2Sharp/DirectReference.cs @@ -1,18 +1,37 @@ -namespace LibGit2Sharp +using System; + +namespace LibGit2Sharp { /// /// A DirectReference points directly to a /// public class DirectReference : Reference { + private readonly Func targetResolver; + private bool resolved; + private GitObject target; + + internal DirectReference(Func targetResolver) + { + this.targetResolver = targetResolver; + } + /// /// Gets the target of this /// - public GitObject Target { get; internal set; } - - protected override object ProvideAdditionalEqualityComponent() + public GitObject Target { - return Target; + get + { + if (resolved) + { + return target; + } + + target = targetResolver(); + resolved = true; + return target; + } } /// diff --git a/LibGit2Sharp/Reference.cs b/LibGit2Sharp/Reference.cs index fd73026a3..8aad7494d 100644 --- a/LibGit2Sharp/Reference.cs +++ b/LibGit2Sharp/Reference.cs @@ -11,7 +11,7 @@ namespace LibGit2Sharp public abstract class Reference : IEquatable { private static readonly LambdaEqualityHelper equalityHelper = - new LambdaEqualityHelper(new Func[] { x => x.CanonicalName, x => x.ProvideAdditionalEqualityComponent() }); + new LambdaEqualityHelper(new Func[] { x => x.CanonicalName, x => x.TargetIdentifier }); /// /// Gets the full name of this reference. @@ -57,8 +57,8 @@ public abstract class Reference : IEquatable var targetId = new ObjectId(oid); targetIdentifier = targetId.Sha; - var target = repo.Lookup(targetId); - reference = new DirectReference { CanonicalName = name, Target = target, TargetIdentifier = targetIdentifier}; + var targetResolver = new Func(() => repo.Lookup(targetId)); + reference = new DirectReference(targetResolver) { CanonicalName = name, TargetIdentifier = targetIdentifier}; break; default: @@ -88,8 +88,6 @@ public abstract class Reference : IEquatable Enum.GetName(typeof (GitReferenceType), type))); } - protected abstract object ProvideAdditionalEqualityComponent(); - /// /// Recursively peels the target of the reference until a direct reference is encountered. /// diff --git a/LibGit2Sharp/SymbolicReference.cs b/LibGit2Sharp/SymbolicReference.cs index 0ddc5be67..e1a8290aa 100644 --- a/LibGit2Sharp/SymbolicReference.cs +++ b/LibGit2Sharp/SymbolicReference.cs @@ -10,11 +10,6 @@ public class SymbolicReference : Reference /// public Reference Target { get; internal set; } - protected override object ProvideAdditionalEqualityComponent() - { - return Target; - } - /// /// Recursively peels the target of the reference until a direct reference is encountered. ///