diff options
author | nulltoken <emeric.fermas@gmail.com> | 2011-05-19 00:19:22 +0400 |
---|---|---|
committer | nulltoken <emeric.fermas@gmail.com> | 2011-05-19 00:20:55 +0400 |
commit | 1047733668f011a3dc89f6e675e9d2ced40bf083 (patch) | |
tree | caa80005a751b783f1c8ec843cc144af572b2838 /LibGit2Sharp/Reference.cs | |
parent | 2a529521cad768dedb88f358d5ad59d6ac03eeaa (diff) |
Fix creation of reference to prevent it from choking on corrupted ones
Diffstat (limited to 'LibGit2Sharp/Reference.cs')
-rw-r--r-- | LibGit2Sharp/Reference.cs | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/LibGit2Sharp/Reference.cs b/LibGit2Sharp/Reference.cs index ec71e7e7..442f5367 100644 --- a/LibGit2Sharp/Reference.cs +++ b/LibGit2Sharp/Reference.cs @@ -18,7 +18,7 @@ namespace LibGit2Sharp /// </summary> public string CanonicalName { get; protected set; } - //TODO: Cries for refactoring. + //TODO: Cries for refactoring... really! internal static T BuildFromPtr<T>(IntPtr ptr, Repository repo) where T : class { if (ptr == IntPtr.Zero) @@ -30,33 +30,35 @@ namespace LibGit2Sharp var type = NativeMethods.git_reference_type(ptr); Reference reference; + string targetIdentifier; switch (type) { case GitReferenceType.Symbolic: IntPtr resolveRef; - var targetName = NativeMethods.git_reference_target(ptr); + targetIdentifier = NativeMethods.git_reference_target(ptr); int res = NativeMethods.git_reference_resolve(out resolveRef, ptr); if (res == (int) GitErrorCode.GIT_ENOTFOUND) { - reference = new SymbolicReference { CanonicalName = name, Target = null, TargetIdentifier = targetName }; + reference = new SymbolicReference { CanonicalName = name, Target = null, TargetIdentifier = targetIdentifier }; break; } Ensure.Success(res); var targetRef = BuildFromPtr<Reference>(resolveRef, repo); - reference = new SymbolicReference { CanonicalName = name, Target = targetRef, TargetIdentifier = targetName}; + reference = new SymbolicReference { CanonicalName = name, Target = targetRef, TargetIdentifier = targetIdentifier}; break; case GitReferenceType.Oid: var oidPtr = NativeMethods.git_reference_oid(ptr); var oid = (GitOid)Marshal.PtrToStructure(oidPtr, typeof(GitOid)); var targetId = new ObjectId(oid); + targetIdentifier = targetId.Sha; var target = repo.Lookup(targetId); - reference = new DirectReference { CanonicalName = name, Target = target, TargetIdentifier = targetId.Sha}; + reference = new DirectReference { CanonicalName = name, Target = target, TargetIdentifier = targetIdentifier}; break; default: @@ -68,7 +70,7 @@ namespace LibGit2Sharp return reference as T; } - GitObject targetGitObject = repo.Lookup(reference.ResolveToDirectReference().Target.Id); + GitObject targetGitObject = repo.Lookup(targetIdentifier); if (Equals(typeof(T), typeof(Tag))) { |