From 21696b88718ca8b37f68bc6db022a303daf32056 Mon Sep 17 00:00:00 2001 From: Keith Dahlby Date: Fri, 12 Apr 2013 22:27:44 -0500 Subject: [PATCH] Support TreeEntry.Target for gitlink entries --- LibGit2Sharp.Tests/SubmoduleFixture.cs | 8 ++++++++ LibGit2Sharp/GitLink.cs | 27 ++++++++++++++++++++++++++ LibGit2Sharp/LibGit2Sharp.csproj | 1 + LibGit2Sharp/TreeEntry.cs | 15 ++++++++++---- 4 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 LibGit2Sharp/GitLink.cs diff --git a/LibGit2Sharp.Tests/SubmoduleFixture.cs b/LibGit2Sharp.Tests/SubmoduleFixture.cs index 3e070f007..e427e624d 100644 --- a/LibGit2Sharp.Tests/SubmoduleFixture.cs +++ b/LibGit2Sharp.Tests/SubmoduleFixture.cs @@ -64,9 +64,17 @@ public void CanRetrieveTheCommitIdsOfASubmodule(string name, string headId, stri Assert.Equal((ObjectId)headId, submodule.HeadCommitId); Assert.Equal((ObjectId)indexId, submodule.IndexCommitId); Assert.Equal((ObjectId)workDirId, submodule.WorkDirCommitId); + + AssertEntryId((ObjectId)headId, repo.Head[name], c => c.Target.Id); + AssertEntryId((ObjectId)indexId, repo.Index[name], i => i.Id); } } + private static void AssertEntryId(ObjectId expected, T entry, Func selector) + { + Assert.Equal(expected, ReferenceEquals(entry, null) ? null : selector(entry)); + } + [Fact] public void CanEnumerateRepositorySubmodules() { diff --git a/LibGit2Sharp/GitLink.cs b/LibGit2Sharp/GitLink.cs new file mode 100644 index 000000000..ec06cbcc9 --- /dev/null +++ b/LibGit2Sharp/GitLink.cs @@ -0,0 +1,27 @@ +using System.Diagnostics; + +namespace LibGit2Sharp +{ + /// + /// Represents a gitlink (a reference to a commit in another Git repository) + /// + [DebuggerDisplay("{DebuggerDisplay,nq}")] + public class GitLink : GitObject + { + /// + /// Needed for mocking purposes. + /// + protected GitLink() + { } + + internal GitLink(Repository repo, ObjectId id) + : base(repo, id) + { + } + + private string DebuggerDisplay + { + get { return Id.ToString(); } + } + } +} diff --git a/LibGit2Sharp/LibGit2Sharp.csproj b/LibGit2Sharp/LibGit2Sharp.csproj index d1bcf2b22..9af3e57e2 100644 --- a/LibGit2Sharp/LibGit2Sharp.csproj +++ b/LibGit2Sharp/LibGit2Sharp.csproj @@ -70,6 +70,7 @@ + diff --git a/LibGit2Sharp/TreeEntry.cs b/LibGit2Sharp/TreeEntry.cs index 57dc6b232..c3235934b 100644 --- a/LibGit2Sharp/TreeEntry.cs +++ b/LibGit2Sharp/TreeEntry.cs @@ -72,12 +72,19 @@ internal ObjectId TargetId private GitObject RetrieveTreeEntryTarget() { - if (!Type.HasAny(new[]{GitObjectType.Tree, GitObjectType.Blob})) + switch (Type) { - throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, "TreeEntry target of type '{0}' are not supported.", Type)); + case GitObjectType.Commit: + return new GitLink(repo, targetOid); + case GitObjectType.Blob: + case GitObjectType.Tree: + return GitObject.BuildFrom(repo, targetOid, Type, Path); + default: + throw new InvalidOperationException( + string.Format(CultureInfo.InvariantCulture, + "TreeEntry target of type '{0}' is not supported.", + Type)); } - - return GitObject.BuildFrom(repo, targetOid, Type, Path); } ///