Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/libgit2sharp.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornulltoken <emeric.fermas@gmail.com>2011-05-19 00:19:22 +0400
committernulltoken <emeric.fermas@gmail.com>2011-05-19 00:20:55 +0400
commit1047733668f011a3dc89f6e675e9d2ced40bf083 (patch)
treecaa80005a751b783f1c8ec843cc144af572b2838 /LibGit2Sharp/Reference.cs
parent2a529521cad768dedb88f358d5ad59d6ac03eeaa (diff)
Fix creation of reference to prevent it from choking on corrupted ones
Diffstat (limited to 'LibGit2Sharp/Reference.cs')
-rw-r--r--LibGit2Sharp/Reference.cs14
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)))
{