Skip to content

Commit 34c4aac

Browse files
committed
Make Tags.Add() accept an ObjectId as its target
1 parent 71a8449 commit 34c4aac

File tree

2 files changed

+74
-13
lines changed

2 files changed

+74
-13
lines changed

LibGit2Sharp.Tests/TagFixture.cs

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,21 @@ public void CanAddALightWeightTagFromSha()
2626
Tag newTag = repo.Tags.Add("i_am_lightweight", commitE90810BSha);
2727
Assert.NotNull(newTag);
2828
Assert.False(newTag.IsAnnotated);
29+
Assert.Equal(commitE90810BSha, newTag.Target.Sha);
30+
}
31+
}
32+
33+
34+
[Fact]
35+
public void CanAddALightWeightTagFromObjectId()
36+
{
37+
TemporaryCloneOfTestRepo path = BuildTemporaryCloneOfTestRepo();
38+
using (var repo = new Repository(path.RepositoryPath))
39+
{
40+
Tag newTag = repo.Tags.Add("i_am_lightweight", new ObjectId(commitE90810BSha));
41+
Assert.NotNull(newTag);
42+
Assert.False(newTag.IsAnnotated);
43+
Assert.Equal(commitE90810BSha, newTag.Target.Sha);
2944
}
3045
}
3146

@@ -134,6 +149,21 @@ public void CanAddAnAnnotatedTagFromSha()
134149
Tag newTag = repo.Tags.Add("unit_test", tagTestSha, signatureTim, "a new tag");
135150
Assert.NotNull(newTag);
136151
Assert.True(newTag.IsAnnotated);
152+
Assert.Equal(tagTestSha, newTag.Target.Sha);
153+
}
154+
}
155+
156+
157+
[Fact]
158+
public void CanAddAnAnnotatedTagFromObjectId()
159+
{
160+
TemporaryCloneOfTestRepo path = BuildTemporaryCloneOfTestRepo();
161+
using (var repo = new Repository(path.RepositoryPath))
162+
{
163+
Tag newTag = repo.Tags.Add("unit_test", new ObjectId(tagTestSha), signatureTim, "a new tag");
164+
Assert.NotNull(newTag);
165+
Assert.True(newTag.IsAnnotated);
166+
Assert.Equal(tagTestSha, newTag.Target.Sha);
137167
}
138168
}
139169

@@ -461,7 +491,8 @@ public void AddTagWithNullTargetThrows()
461491
{
462492
using (var repo = new Repository(BareTestRepoPath))
463493
{
464-
Assert.Throws<ArgumentNullException>(() => repo.Tags.Add("test_tag", null, signatureTim, "message"));
494+
Assert.Throws<ArgumentNullException>(() => repo.Tags.Add("test_tag", (string)null, signatureTim, "message"));
495+
Assert.Throws<ArgumentNullException>(() => repo.Tags.Add("test_tag", (ObjectId)null, signatureTim, "message"));
465496
}
466497
}
467498

LibGit2Sharp/TagCollection.cs

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -73,24 +73,22 @@ IEnumerator IEnumerable.GetEnumerator()
7373
/// Creates an annotated tag with the specified name.
7474
/// </summary>
7575
/// <param name = "name">The name.</param>
76-
/// <param name = "objectish">Revparse spec of the target object.</param>
76+
/// <param name = "targetId">Id of the target object.</param>
7777
/// <param name = "tagger">The tagger.</param>
7878
/// <param name = "message">The message.</param>
7979
/// <param name = "allowOverwrite">True to allow silent overwriting a potentially existing tag, false otherwise.</param>
8080
/// <returns></returns>
81-
public virtual Tag Add(string name, string objectish, Signature tagger, string message, bool allowOverwrite = false)
81+
public virtual Tag Add(string name, ObjectId targetId, Signature tagger, string message, bool allowOverwrite = false)
8282
{
8383
Ensure.ArgumentNotNullOrEmptyString(name, "name");
84-
Ensure.ArgumentNotNullOrEmptyString(objectish, "objectish");
84+
Ensure.ArgumentNotNull(targetId, "targetId");
8585
Ensure.ArgumentNotNull(tagger, "tagger");
8686
Ensure.ArgumentNotNull(message, "message");
8787

88-
GitObject objectToTag = repo.Lookup(objectish, GitObjectType.Any, LookUpOptions.ThrowWhenNoGitObjectHasBeenFound);
89-
9088
string prettifiedMessage = ObjectDatabase.PrettifyMessage(message);
9189

9290
int res;
93-
using (var objectPtr = new ObjectSafeWrapper(objectToTag.Id, repo))
91+
using (var objectPtr = new ObjectSafeWrapper(targetId, repo))
9492
using (SignatureSafeHandle taggerHandle = tagger.BuildHandle())
9593
{
9694
GitOid oid;
@@ -102,6 +100,24 @@ public virtual Tag Add(string name, string objectish, Signature tagger, string m
102100
return this[name];
103101
}
104102

103+
/// <summary>
104+
/// Creates an annotated tag with the specified name.
105+
/// </summary>
106+
/// <param name = "name">The name.</param>
107+
/// <param name = "objectish">Revparse spec for the target object.</param>
108+
/// <param name = "tagger">The tagger.</param>
109+
/// <param name = "message">The message.</param>
110+
/// <param name = "allowOverwrite">True to allow silent overwriting a potentially existing tag, false otherwise.</param>
111+
/// <returns></returns>
112+
public virtual Tag Add(string name, string objectish, Signature tagger, string message, bool allowOverwrite = false)
113+
{
114+
Ensure.ArgumentNotNullOrEmptyString(objectish, "target");
115+
116+
GitObject objectToTag = repo.Lookup(objectish, GitObjectType.Any, LookUpOptions.ThrowWhenNoGitObjectHasBeenFound);
117+
118+
return Add(name, objectToTag.Id, tagger, message, allowOverwrite);
119+
}
120+
105121
internal static string PrettifyMessage(string message)
106122
{
107123
var buffer = new byte[NativeMethods.GIT_PATH_MAX];
@@ -130,18 +146,16 @@ public virtual Tag Create(string name, string target, Signature tagger, string m
130146
/// Creates a lightweight tag with the specified name.
131147
/// </summary>
132148
/// <param name = "name">The name.</param>
133-
/// <param name = "objectish">Revparse spec of the target object.</param>
149+
/// <param name = "targetId">Id of the target object.</param>
134150
/// <param name = "allowOverwrite">True to allow silent overwriting a potentially existing tag, false otherwise.</param>
135151
/// <returns></returns>
136-
public virtual Tag Add(string name, string objectish, bool allowOverwrite = false)
152+
public virtual Tag Add(string name, ObjectId targetId, bool allowOverwrite = false)
137153
{
138154
Ensure.ArgumentNotNullOrEmptyString(name, "name");
139-
Ensure.ArgumentNotNullOrEmptyString(objectish, "objectish");
140-
141-
GitObject objectToTag = repo.Lookup(objectish, GitObjectType.Any, LookUpOptions.ThrowWhenNoGitObjectHasBeenFound);
155+
Ensure.ArgumentNotNull(targetId, "targetId");
142156

143157
int res;
144-
using (var objectPtr = new ObjectSafeWrapper(objectToTag.Id, repo))
158+
using (var objectPtr = new ObjectSafeWrapper(targetId, repo))
145159
{
146160
GitOid oid;
147161
res = NativeMethods.git_tag_create_lightweight(out oid, repo.Handle, name, objectPtr.ObjectPtr, allowOverwrite);
@@ -152,6 +166,22 @@ public virtual Tag Add(string name, string objectish, bool allowOverwrite = fals
152166
return this[name];
153167
}
154168

169+
/// <summary>
170+
/// Creates a lightweight tag with the specified name.
171+
/// </summary>
172+
/// <param name = "name">The name.</param>
173+
/// <param name = "objectish">Revparse spec for the target object.</param>
174+
/// <param name = "allowOverwrite">True to allow silent overwriting a potentially existing tag, false otherwise.</param>
175+
/// <returns></returns>
176+
public virtual Tag Add(string name, string objectish, bool allowOverwrite = false)
177+
{
178+
Ensure.ArgumentNotNullOrEmptyString(objectish, "objectish");
179+
180+
GitObject objectToTag = repo.Lookup(objectish, GitObjectType.Any, LookUpOptions.ThrowWhenNoGitObjectHasBeenFound);
181+
182+
return Add(name, objectToTag.Id, allowOverwrite);
183+
}
184+
155185
/// <summary>
156186
/// Creates a lightweight tag with the specified name.
157187
/// </summary>

0 commit comments

Comments
 (0)