Skip to content

Commit 4e2a729

Browse files
committed
Introduce TreeEntry.TargetType and TreeEntryDefinition.TargetType
1 parent 7df508d commit 4e2a729

File tree

10 files changed

+142
-40
lines changed

10 files changed

+142
-40
lines changed

LibGit2Sharp.Tests/CommitFixture.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -688,7 +688,7 @@ public void CanCommitALittleBit()
688688

689689
private static void AssertBlobContent(TreeEntry entry, string expectedContent)
690690
{
691-
Assert.Equal(GitObjectType.Blob, entry.Type);
691+
Assert.Equal(TreeEntryTargetType.Blob, entry.TargetType);
692692
Assert.Equal(expectedContent, ((Blob)(entry.Target)).ContentAsUtf8());
693693
}
694694

LibGit2Sharp.Tests/ObjectDatabaseFixture.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ public void CanReplaceAnExistingTreeWithAnotherPersitedTree()
198198
using (var repo = new Repository(path))
199199
{
200200
TreeDefinition td = TreeDefinition.From(repo.Head.Tip.Tree);
201-
Assert.Equal(GitObjectType.Tree, td["1"].Type);
201+
Assert.Equal(TreeEntryTargetType.Tree, td["1"].TargetType);
202202

203203
TreeDefinition newTd = new TreeDefinition()
204204
.Add("new/one", repo.Lookup<Blob>("a823312"), Mode.NonExecutableFile)
@@ -208,7 +208,7 @@ public void CanReplaceAnExistingTreeWithAnotherPersitedTree()
208208
repo.ObjectDatabase.CreateTree(newTd);
209209

210210
td.Add("1", newTd["new"]);
211-
Assert.Equal(GitObjectType.Tree, td["1/tree"].Type);
211+
Assert.Equal(TreeEntryTargetType.Tree, td["1/tree"].TargetType);
212212
}
213213
}
214214

@@ -265,7 +265,7 @@ public void CanCreateATreeContainingAGitLinkFromAnUntrackedSubmoduleInTheWorking
265265
Assert.NotNull(ted);
266266
Assert.Equal(Mode.GitLink, ted.Mode);
267267
Assert.Equal(objectId, ted.TargetId);
268-
Assert.Equal(GitObjectType.Commit, ted.Type);
268+
Assert.Equal(TreeEntryTargetType.GitLink, ted.TargetType);
269269

270270
Tree tree = repo.ObjectDatabase.CreateTree(td);
271271

LibGit2Sharp.Tests/TreeDefinitionFixture.cs

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,12 @@ public void RequestingAnEntryWithBadParamsThrows()
6363
}
6464

6565
[Theory]
66-
[InlineData("1/branch_file.txt", "100755", GitObjectType.Blob, "45b983be36b73c0788dc9cbcb76cbb80fc7bb057")]
67-
[InlineData("README", "100644", GitObjectType.Blob, "a8233120f6ad708f843d861ce2b7228ec4e3dec6")]
68-
[InlineData("branch_file.txt", "100644", GitObjectType.Blob, "45b983be36b73c0788dc9cbcb76cbb80fc7bb057")]
69-
[InlineData("new.txt", "100644", GitObjectType.Blob, "a71586c1dfe8a71c6cbf6c129f404c5642ff31bd")]
70-
[InlineData("1", "040000", GitObjectType.Tree, "7f76480d939dc401415927ea7ef25c676b8ddb8f")]
71-
public void CanRetrieveEntries(string path, string expectedAttributes, GitObjectType expectedType, string expectedSha)
66+
[InlineData("1/branch_file.txt", "100755", TreeEntryTargetType.Blob, "45b983be36b73c0788dc9cbcb76cbb80fc7bb057")]
67+
[InlineData("README", "100644", TreeEntryTargetType.Blob, "a8233120f6ad708f843d861ce2b7228ec4e3dec6")]
68+
[InlineData("branch_file.txt", "100644", TreeEntryTargetType.Blob, "45b983be36b73c0788dc9cbcb76cbb80fc7bb057")]
69+
[InlineData("new.txt", "100644", TreeEntryTargetType.Blob, "a71586c1dfe8a71c6cbf6c129f404c5642ff31bd")]
70+
[InlineData("1", "040000", TreeEntryTargetType.Tree, "7f76480d939dc401415927ea7ef25c676b8ddb8f")]
71+
public void CanRetrieveEntries(string path, string expectedAttributes, TreeEntryTargetType expectedType, string expectedSha)
7272
{
7373
using (var repo = new Repository(BareTestRepoPath))
7474
{
@@ -77,7 +77,7 @@ public void CanRetrieveEntries(string path, string expectedAttributes, GitObject
7777
TreeEntryDefinition ted = td[path];
7878

7979
Assert.Equal(ToMode(expectedAttributes), ted.Mode);
80-
Assert.Equal(expectedType, ted.Type);
80+
Assert.Equal(expectedType, ted.TargetType);
8181
Assert.Equal(new ObjectId(expectedSha), ted.TargetId);
8282
}
8383
}
@@ -179,7 +179,7 @@ public void CanAddAnExistingSubmodule()
179179
Assert.NotNull(fetched);
180180

181181
Assert.Equal(submodule.HeadCommitId, fetched.TargetId);
182-
Assert.Equal(GitObjectType.Commit, fetched.Type);
182+
Assert.Equal(TreeEntryTargetType.GitLink, fetched.TargetType);
183183
Assert.Equal(Mode.GitLink, fetched.Mode);
184184
}
185185
}
@@ -218,7 +218,7 @@ public void CanReplaceAnExistingTreeWithABlob()
218218
using (var repo = new Repository(BareTestRepoPath))
219219
{
220220
TreeDefinition td = TreeDefinition.From(repo.Head.Tip.Tree);
221-
Assert.Equal(GitObjectType.Tree, td[targetPath].Type);
221+
Assert.Equal(TreeEntryTargetType.Tree, td[targetPath].TargetType);
222222

223223
var objectId = new ObjectId(blobSha);
224224
var blob = repo.Lookup<Blob>(objectId);
@@ -230,7 +230,7 @@ public void CanReplaceAnExistingTreeWithABlob()
230230
TreeEntryDefinition fetched = td[targetPath];
231231
Assert.NotNull(fetched);
232232

233-
Assert.Equal(GitObjectType.Blob, td[targetPath].Type);
233+
Assert.Equal(TreeEntryTargetType.Blob, td[targetPath].TargetType);
234234
Assert.Equal(objectId, fetched.TargetId);
235235
Assert.Equal(Mode.NonExecutableFile, fetched.Mode);
236236

@@ -249,7 +249,7 @@ public void CanReplaceAnExistingBlobWithATree(string targetPath)
249249
{
250250
TreeDefinition td = TreeDefinition.From(repo.Head.Tip.Tree);
251251
Assert.NotNull(td[targetPath]);
252-
Assert.Equal(GitObjectType.Blob, td[targetPath].Type);
252+
Assert.Equal(TreeEntryTargetType.Blob, td[targetPath].TargetType);
253253

254254
var objectId = new ObjectId(treeSha);
255255
var tree = repo.Lookup<Tree>(objectId);
@@ -259,7 +259,7 @@ public void CanReplaceAnExistingBlobWithATree(string targetPath)
259259
TreeEntryDefinition fetched = td[targetPath];
260260
Assert.NotNull(fetched);
261261

262-
Assert.Equal(GitObjectType.Tree, td[targetPath].Type);
262+
Assert.Equal(TreeEntryTargetType.Tree, td[targetPath].TargetType);
263263
Assert.Equal(objectId, fetched.TargetId);
264264
Assert.Equal(Mode.Directory, fetched.Mode);
265265
}
@@ -274,7 +274,7 @@ public void CanReplaceAnExistingTreeWithAGitLink()
274274
using (var repo = new Repository(SubmoduleTestRepoWorkingDirPath))
275275
{
276276
TreeDefinition td = TreeDefinition.From(repo.Head.Tip.Tree);
277-
Assert.Equal(GitObjectType.Tree, td[targetPath].Type);
277+
Assert.Equal(TreeEntryTargetType.Tree, td[targetPath].TargetType);
278278

279279
Assert.NotNull(td["just_a_dir/contents"]);
280280

@@ -284,7 +284,7 @@ public void CanReplaceAnExistingTreeWithAGitLink()
284284
Assert.NotNull(fetched);
285285

286286
Assert.Equal(commitId, fetched.TargetId);
287-
Assert.Equal(GitObjectType.Commit, fetched.Type);
287+
Assert.Equal(TreeEntryTargetType.GitLink, fetched.TargetType);
288288
Assert.Equal(Mode.GitLink, fetched.Mode);
289289

290290
Assert.Null(td["just_a_dir/contents"]);
@@ -301,7 +301,7 @@ public void CanReplaceAnExistingGitLinkWithATree()
301301
{
302302
TreeDefinition td = TreeDefinition.From(repo.Head.Tip.Tree);
303303
Assert.NotNull(td[targetPath]);
304-
Assert.Equal(GitObjectType.Commit, td[targetPath].Type);
304+
Assert.Equal(TreeEntryTargetType.GitLink, td[targetPath].TargetType);
305305
Assert.Equal(Mode.GitLink, td[targetPath].Mode);
306306

307307
var objectId = new ObjectId(treeSha);
@@ -313,7 +313,7 @@ public void CanReplaceAnExistingGitLinkWithATree()
313313
Assert.NotNull(fetched);
314314

315315
Assert.Equal(objectId, fetched.TargetId);
316-
Assert.Equal(GitObjectType.Tree, fetched.Type);
316+
Assert.Equal(TreeEntryTargetType.Tree, fetched.TargetType);
317317
Assert.Equal(Mode.Directory, fetched.Mode);
318318
}
319319
}
@@ -328,14 +328,14 @@ public void CanReplaceAnExistingBlobWithAGitLink()
328328
{
329329
TreeDefinition td = TreeDefinition.From(repo.Head.Tip.Tree);
330330
Assert.NotNull(td[targetPath]);
331-
Assert.Equal(GitObjectType.Blob, td[targetPath].Type);
331+
Assert.Equal(TreeEntryTargetType.Blob, td[targetPath].TargetType);
332332

333333
td.AddGitLink(targetPath, commitId);
334334

335335
TreeEntryDefinition fetched = td[targetPath];
336336
Assert.NotNull(fetched);
337337

338-
Assert.Equal(GitObjectType.Commit, td[targetPath].Type);
338+
Assert.Equal(TreeEntryTargetType.GitLink, td[targetPath].TargetType);
339339
Assert.Equal(commitId, fetched.TargetId);
340340
Assert.Equal(Mode.GitLink, fetched.Mode);
341341
}
@@ -351,7 +351,7 @@ public void CanReplaceAnExistingGitLinkWithABlob()
351351
{
352352
TreeDefinition td = TreeDefinition.From(repo.Head.Tip.Tree);
353353
Assert.NotNull(td[targetPath]);
354-
Assert.Equal(GitObjectType.Commit, td[targetPath].Type);
354+
Assert.Equal(TreeEntryTargetType.GitLink, td[targetPath].TargetType);
355355
Assert.Equal(Mode.GitLink, td[targetPath].Mode);
356356

357357
var objectId = new ObjectId(blobSha);
@@ -363,7 +363,7 @@ public void CanReplaceAnExistingGitLinkWithABlob()
363363
Assert.NotNull(fetched);
364364

365365
Assert.Equal(objectId, fetched.TargetId);
366-
Assert.Equal(GitObjectType.Blob, fetched.Type);
366+
Assert.Equal(TreeEntryTargetType.Blob, fetched.TargetType);
367367
Assert.Equal(Mode.NonExecutableFile, fetched.Mode);
368368
}
369369
}
@@ -374,7 +374,7 @@ public void CanNotReplaceAnExistingTreeWithATreeBeingAssembled()
374374
using (var repo = new Repository(BareTestRepoPath))
375375
{
376376
TreeDefinition td = TreeDefinition.From(repo.Head.Tip.Tree);
377-
Assert.Equal(GitObjectType.Tree, td["1"].Type);
377+
Assert.Equal(TreeEntryTargetType.Tree, td["1"].TargetType);
378378

379379
td.Add("new/one", repo.Lookup<Blob>("a823312"), Mode.NonExecutableFile)
380380
.Add("new/two", repo.Lookup<Blob>("a71586c"), Mode.NonExecutableFile)

LibGit2Sharp/GitObjectType.cs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
namespace LibGit2Sharp
1+
using System;
2+
3+
namespace LibGit2Sharp
24
{
35
/// <summary>
46
/// Underlying type of a <see cref = "GitObject" />
@@ -55,4 +57,25 @@ public enum GitObjectType
5557
/// </summary>
5658
RefDelta = 7
5759
}
60+
61+
internal static class GitObjectTypeExtensions
62+
{
63+
public static TreeEntryTargetType ToTreeEntryTargetType(this GitObjectType type)
64+
{
65+
switch (type)
66+
{
67+
case GitObjectType.Commit:
68+
return TreeEntryTargetType.GitLink;
69+
70+
case GitObjectType.Tree:
71+
return TreeEntryTargetType.Tree;
72+
73+
case GitObjectType.Blob:
74+
return TreeEntryTargetType.Blob;
75+
76+
default:
77+
throw new InvalidOperationException(string.Format("Cannot map {0} to a TreeEntryTargetType.", type));
78+
}
79+
}
80+
}
5881
}

LibGit2Sharp/LibGit2Sharp.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
<Compile Include="Core\Handles\NullRepositorySafeHandle.cs" />
7676
<Compile Include="GitLink.cs" />
7777
<Compile Include="Core\RepositoryOpenFlags.cs" />
78+
<Compile Include="TreeEntryTargetType.cs" />
7879
<Compile Include="UnmatchedPathException.cs" />
7980
<Compile Include="Core\Handles\ReflogEntrySafeHandle.cs" />
8081
<Compile Include="Core\Handles\ReflogSafeHandle.cs" />

LibGit2Sharp/Tree.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public virtual IEnumerable<Tree> Trees
7676
get
7777
{
7878
return this
79-
.Where(e => e.Type == GitObjectType.Tree)
79+
.Where(e => e.TargetType == TreeEntryTargetType.Tree)
8080
.Select(e => e.Target)
8181
.Cast<Tree>();
8282
}
@@ -90,7 +90,7 @@ public virtual IEnumerable<Blob> Blobs
9090
get
9191
{
9292
return this
93-
.Where(e => e.Type == GitObjectType.Blob)
93+
.Where(e => e.TargetType == TreeEntryTargetType.Blob)
9494
.Select(e => e.Target)
9595
.Cast<Blob>();
9696
}

LibGit2Sharp/TreeDefinition.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -217,14 +217,14 @@ private TreeDefinition RetrieveOrBuildTreeDefinition(string treeName, bool shoul
217217

218218
if (hasAnEntryBeenFound)
219219
{
220-
switch (treeEntryDefinition.Type)
220+
switch (treeEntryDefinition.TargetType)
221221
{
222-
case GitObjectType.Tree:
222+
case TreeEntryTargetType.Tree:
223223
td = From(treeEntryDefinition.Target as Tree);
224224
break;
225225

226-
case GitObjectType.Blob:
227-
case GitObjectType.Commit:
226+
case TreeEntryTargetType.Blob:
227+
case TreeEntryTargetType.GitLink:
228228
if (shouldOverWrite)
229229
{
230230
td = new TreeDefinition();

LibGit2Sharp/TreeEntry.cs

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,11 @@ internal TreeEntry(SafeHandle obj, ObjectId parentTreeId, Repository repo, FileP
3131
this.parentTreeId = parentTreeId;
3232
this.repo = repo;
3333
targetOid = Proxy.git_tree_entry_id(obj);
34-
Type = Proxy.git_tree_entry_type(obj);
34+
35+
GitObjectType treeEntryTargetType = Proxy.git_tree_entry_type(obj);
36+
Type = treeEntryTargetType;
37+
TargetType = treeEntryTargetType.ToTreeEntryTargetType();
38+
3539
target = new Lazy<GitObject>(RetrieveTreeEntryTarget);
3640

3741
Mode = Proxy.git_tree_entry_attributes(obj);
@@ -70,20 +74,27 @@ internal ObjectId TargetId
7074
/// </summary>
7175
public virtual GitObjectType Type { get; private set; }
7276

77+
/// <summary>
78+
/// Gets the <see cref = "TreeEntryTargetType" /> of the <see cref = "Target" /> being pointed at.
79+
/// </summary>
80+
public virtual TreeEntryTargetType TargetType { get; private set; }
81+
7382
private GitObject RetrieveTreeEntryTarget()
7483
{
75-
switch (Type)
84+
switch (TargetType)
7685
{
77-
case GitObjectType.Commit:
86+
case TreeEntryTargetType.GitLink:
7887
return new GitLink(repo, targetOid);
79-
case GitObjectType.Blob:
80-
case GitObjectType.Tree:
81-
return GitObject.BuildFrom(repo, targetOid, Type, Path);
88+
89+
case TreeEntryTargetType.Blob:
90+
case TreeEntryTargetType.Tree:
91+
return GitObject.BuildFrom(repo, targetOid, TargetType.ToGitObjectType(), Path);
92+
8293
default:
8394
throw new InvalidOperationException(
8495
string.Format(CultureInfo.InvariantCulture,
8596
"TreeEntry target of type '{0}' is not supported.",
86-
Type));
97+
TargetType));
8798
}
8899
}
89100

LibGit2Sharp/TreeEntryDefinition.cs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public class TreeEntryDefinition : IEquatable<TreeEntryDefinition>
1212
private Lazy<GitObject> target;
1313

1414
private static readonly LambdaEqualityHelper<TreeEntryDefinition> equalityHelper =
15-
new LambdaEqualityHelper<TreeEntryDefinition>(x => x.Mode, x => x.Type, x => x.TargetId);
15+
new LambdaEqualityHelper<TreeEntryDefinition>(x => x.Mode, x => x.TargetType, x => x.TargetId);
1616

1717
internal static readonly Mode[] BlobModes = new[] { Mode.NonExecutableFile, Mode.ExecutableFile, Mode.NonExecutableGroupWritableFile, Mode.SymbolicLink };
1818

@@ -33,6 +33,11 @@ protected TreeEntryDefinition()
3333
/// </summary>
3434
public virtual GitObjectType Type { get; private set; }
3535

36+
/// <summary>
37+
/// Gets the <see cref = "TreeEntryTargetType" /> of the target being pointed at.
38+
/// </summary>
39+
public virtual TreeEntryTargetType TargetType { get; private set; }
40+
3641
/// <summary>
3742
/// Gets the <see cref = "ObjectId" /> of the target being pointed at.
3843
/// </summary>
@@ -49,6 +54,7 @@ internal static TreeEntryDefinition From(TreeEntry treeEntry)
4954
{
5055
Mode = treeEntry.Mode,
5156
Type = treeEntry.Type,
57+
TargetType = treeEntry.TargetType,
5258
TargetId = treeEntry.TargetId,
5359
target = new Lazy<GitObject>(() => treeEntry.Target)
5460
};
@@ -60,6 +66,7 @@ internal static TreeEntryDefinition From(Blob blob, Mode mode)
6066
{
6167
Mode = mode,
6268
Type = GitObjectType.Blob,
69+
TargetType = TreeEntryTargetType.Blob,
6370
TargetId = blob.Id,
6471
target = new Lazy<GitObject>(() => blob)
6572
};
@@ -82,6 +89,7 @@ internal static TreeEntryDefinition From(ObjectId objectId)
8289
{
8390
Mode = Mode.GitLink,
8491
Type = GitObjectType.Commit,
92+
TargetType = TreeEntryTargetType.GitLink,
8593
TargetId = objectId,
8694
target = new Lazy<GitObject>(() => { throw new InvalidOperationException("Shouldn't be necessary."); }),
8795
};
@@ -93,6 +101,7 @@ internal static TreeEntryDefinition From(Tree tree)
93101
{
94102
Mode = Mode.Directory,
95103
Type = GitObjectType.Tree,
104+
TargetType = TreeEntryTargetType.Tree,
96105
TargetId = tree.Id,
97106
target = new Lazy<GitObject>(() => tree)
98107
};
@@ -174,6 +183,11 @@ public override GitObjectType Type
174183
{
175184
get { return GitObjectType.Tree; }
176185
}
186+
187+
public override TreeEntryTargetType TargetType
188+
{
189+
get { return TreeEntryTargetType.Tree; }
190+
}
177191
}
178192

179193
internal class TransientBlobTreeEntryDefinition : TransientTreeEntryDefinition
@@ -183,6 +197,11 @@ public override GitObjectType Type
183197
get { return GitObjectType.Blob; }
184198
}
185199

200+
public override TreeEntryTargetType TargetType
201+
{
202+
get { return TreeEntryTargetType.Blob; }
203+
}
204+
186205
public Func<ObjectDatabase, Blob> Builder { get; set; }
187206
}
188207
}

0 commit comments

Comments
 (0)