Skip to content

Commit e5f216f

Browse files
committed
Make Tags.Add() accept a GitObject as its target
1 parent 58932d0 commit e5f216f

File tree

2 files changed

+86
-2
lines changed

2 files changed

+86
-2
lines changed

LibGit2Sharp.Tests/TagFixture.cs

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ public void CanAddALightWeightTagFromSha()
3030
}
3131
}
3232

33-
3433
[Fact]
3534
public void CanAddALightWeightTagFromObjectId()
3635
{
@@ -44,6 +43,21 @@ public void CanAddALightWeightTagFromObjectId()
4443
}
4544
}
4645

46+
[Fact]
47+
public void CanAddALightWeightTagFromAGitObject()
48+
{
49+
TemporaryCloneOfTestRepo path = BuildTemporaryCloneOfTestRepo();
50+
using (var repo = new Repository(path.RepositoryPath))
51+
{
52+
GitObject obj = repo.Lookup(commitE90810BSha);
53+
54+
Tag newTag = repo.Tags.Add("i_am_lightweight", obj);
55+
Assert.NotNull(newTag);
56+
Assert.False(newTag.IsAnnotated);
57+
Assert.Equal(commitE90810BSha, newTag.Target.Sha);
58+
}
59+
}
60+
4761
[Fact]
4862
public void CanAddALightWeightTagFromAbbreviatedSha()
4963
{
@@ -153,7 +167,6 @@ public void CanAddAnAnnotatedTagFromSha()
153167
}
154168
}
155169

156-
157170
[Fact]
158171
public void CanAddAnAnnotatedTagFromObjectId()
159172
{
@@ -167,6 +180,21 @@ public void CanAddAnAnnotatedTagFromObjectId()
167180
}
168181
}
169182

183+
[Fact]
184+
public void CanAddAnAnnotatedTagFromObject()
185+
{
186+
TemporaryCloneOfTestRepo path = BuildTemporaryCloneOfTestRepo();
187+
using (var repo = new Repository(path.RepositoryPath))
188+
{
189+
GitObject obj = repo.Lookup(tagTestSha);
190+
191+
Tag newTag = repo.Tags.Add("unit_test",obj, signatureTim, "a new tag");
192+
Assert.NotNull(newTag);
193+
Assert.True(newTag.IsAnnotated);
194+
Assert.Equal(tagTestSha, newTag.Target.Sha);
195+
}
196+
}
197+
170198
[Fact]
171199
public void CanAddAnAnnotatedTagFromARevparseSpec()
172200
{
@@ -491,6 +519,7 @@ public void AddTagWithNullTargetThrows()
491519
{
492520
using (var repo = new Repository(BareTestRepoPath))
493521
{
522+
Assert.Throws<ArgumentNullException>(() => repo.Tags.Add("test_tag", (GitObject)null, signatureTim, "message"));
494523
Assert.Throws<ArgumentNullException>(() => repo.Tags.Add("test_tag", (string)null, signatureTim, "message"));
495524
Assert.Throws<ArgumentNullException>(() => repo.Tags.Add("test_tag", (ObjectId)null, signatureTim, "message"));
496525
}

LibGit2Sharp/TagCollection.cs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,37 @@ public virtual Tag Add(string name, ObjectId targetId, Signature tagger, string
100100
return this[name];
101101
}
102102

103+
/// <summary>
104+
/// Creates an annotated tag with the specified name.
105+
/// </summary>
106+
/// <param name = "name">The name.</param>
107+
/// <param name = "target">The target <see cref="GitObject"/>.</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, GitObject target, Signature tagger, string message, bool allowOverwrite = false)
113+
{
114+
Ensure.ArgumentNotNullOrEmptyString(name, "name");
115+
Ensure.ArgumentNotNull(target, "target");
116+
Ensure.ArgumentNotNull(tagger, "tagger");
117+
Ensure.ArgumentNotNull(message, "message");
118+
119+
string prettifiedMessage = ObjectDatabase.PrettifyMessage(message);
120+
121+
int res;
122+
using (var objectPtr = new ObjectSafeWrapper(target.Id, repo))
123+
using (SignatureSafeHandle taggerHandle = tagger.BuildHandle())
124+
{
125+
GitOid oid;
126+
res = NativeMethods.git_tag_create(out oid, repo.Handle, name, objectPtr.ObjectPtr, taggerHandle, prettifiedMessage, allowOverwrite);
127+
}
128+
129+
Ensure.Success(res);
130+
131+
return this[name];
132+
}
133+
103134
internal static string PrettifyMessage(string message)
104135
{
105136
var buffer = new byte[NativeMethods.GIT_PATH_MAX];
@@ -124,6 +155,30 @@ public virtual Tag Create(string name, string target, Signature tagger, string m
124155
return this.Add(name, target, tagger, message, allowOverwrite);
125156
}
126157

158+
/// <summary>
159+
/// Creates a lightweight tag with the specified name.
160+
/// </summary>
161+
/// <param name = "name">The name.</param>
162+
/// <param name = "target">The target <see cref="GitObject"/>.</param>
163+
/// <param name = "allowOverwrite">True to allow silent overwriting a potentially existing tag, false otherwise.</param>
164+
/// <returns></returns>
165+
public virtual Tag Add(string name, GitObject target, bool allowOverwrite = false)
166+
{
167+
Ensure.ArgumentNotNullOrEmptyString(name, "name");
168+
Ensure.ArgumentNotNull(target, "target");
169+
170+
int res;
171+
using (var objectPtr = new ObjectSafeWrapper(target.Id, repo))
172+
{
173+
GitOid oid;
174+
res = NativeMethods.git_tag_create_lightweight(out oid, repo.Handle, name, objectPtr.ObjectPtr, allowOverwrite);
175+
}
176+
177+
Ensure.Success(res);
178+
179+
return this[name];
180+
}
181+
127182
/// <summary>
128183
/// Creates a lightweight tag with the specified name.
129184
/// </summary>

0 commit comments

Comments
 (0)