提交 1e6db85f 编写于 作者: N nulltoken

Added first draft implementation of Tag applying.

上级 35a3eb48
using System;
using NUnit.Framework;
namespace libgit2sharp.Tests
{
[TestFixture]
public class ApplyingATag : ReadWriteRepositoryFixtureBase
{
[Test]
public void ShouldWork() // TODO: Split into different tests (returnATag, PersistTheObject, MultipleApplies, ...)
{
const string targetId = "8496071c1b46c854b31185ea97743be6a8774479";
var signature = new Signature("me", "me@me.me", DateTimeOffset.Now);
Tag appliedTag;
using (var repo = new Repository(PathToRepository))
{
appliedTag = repo.ApplyTag(targetId, "tagged", "messaged", signature);
}
Tag retrievedTag;
using (var repo = new Repository(PathToRepository))
{
retrievedTag = repo.Resolve<Tag>(appliedTag.Id);
}
Assert.AreEqual(appliedTag.Id, retrievedTag.Id);
// TODO: Finalize comparison
}
}
}
\ No newline at end of file
......@@ -43,6 +43,9 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="ApplyingATag.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="GitDateFixture.cs" />
<Compile Include="ObjectIdFixture.cs" />
<Compile Include="ReadOnlyRepositoryFixtureBase.cs" />
......
......@@ -90,5 +90,20 @@ public object Resolve(string objectId, Type expectedType)
{
return _resolver.Resolve(objectId, expectedType);
}
public Tag ApplyTag(string targetId, string tagName, string tagMessage, Signature signature)
{
// TODO: To be refactored.
IntPtr tag;
OperationResult t = LibGit2Api.wrapped_git_apply_tag(out tag ,_lifecycleManager.RepositoryPtr, targetId, tagName, tagMessage, signature.Name, signature.Email, (ulong)((GitDate)signature.When).UnixTimeStamp);
return (Tag)BuildTag(tag);
}
private static object BuildTag(IntPtr gitObjectPtr)
{
// TODO: Duplicated from ObjectResolver
var gitTag = (git_tag)Marshal.PtrToStructure(gitObjectPtr, typeof(git_tag));
return gitTag.Build();
}
}
}
\ No newline at end of file
......@@ -27,5 +27,9 @@ internal static class LibGit2Api
[DllImport(Libgit2)]
public static extern OperationResult wrapped_git_odb_read(out git_rawobj rawObject, [In] IntPtr repository, [In] string objectId);
[DllImport(Libgit2)]
// TODO: Try to use a git_person struct
public static extern OperationResult wrapped_git_apply_tag(out IntPtr tagPtr, [In] IntPtr repository, [In] string targetId, [In] string tagName, [In] string tagMessage, [In] string taggerName, [In] string taggerEmail, ulong taggerTime);
}
}
\ No newline at end of file
......@@ -99,5 +99,39 @@ int wrapped_git_odb_read(git_rawobj* obj_out, git_repository* repo, const char *
if (error != GIT_SUCCESS)
return error;
return error;
}
int wrapped_git_apply_tag(git_tag** tag_out, git_repository* repo, const char *raw_target_id, const char *tag_name, const char *tag_message, const char *tagger_name, const char *tagger_email, time_t tagger_time)
{
git_oid id;
int error;
git_object* target;
git_tag* tag;
error = git_oid_mkstr(&id, raw_target_id);
if (error != GIT_SUCCESS)
return error;
error = git_repository_lookup(&target, repo, &id, GIT_OBJ_ANY);
if (error != GIT_SUCCESS)
return error;
error = git_tag_new(&tag, repo);
if (error != GIT_SUCCESS)
return error;
git_tag_set_tagger(tag, tagger_name, tagger_email, tagger_time);
git_tag_set_name(tag, tag_name);
git_tag_set_target(tag, target);
git_tag_set_message(tag, tag_message);
error = git_object_write((git_object*)tag);
if (error != GIT_SUCCESS)
return error;
*tag_out = tag;
return error;
}
\ No newline at end of file
......@@ -3,19 +3,6 @@
#include <git2.h>
typedef struct wrapped_git_repository {
size_t db;
size_t index;
size_t objects;
char *path_repository;
char *path_index;
char *path_odb;
char *path_workdir;
unsigned is_bare:1;
} wrapped_git_repository ;
GIT_BEGIN_DECL
GIT_EXTERN(int) wrapped_git_repository_open(git_repository** repo_out, const char* path);
......@@ -24,7 +11,8 @@ GIT_EXTERN(void) wrapped_git_repository_free(git_repository* repo);
GIT_EXTERN(int) wrapped_git_repository_lookup(git_object** obj_out, git_repository* repo, const char* raw_id, git_otype type);
GIT_EXTERN(int) wrapped_git_odb_exists(git_repository* repo, const char* raw_id);
GIT_EXTERN(int) wrapped_git_odb_read_header(git_rawobj* obj_out, git_repository* repo, const char* raw_id);
GIT_EXTERN(int) wrapped_git_odb_read(git_rawobj* obj_out, git_repository* repo, const char* raw_id);
GIT_EXTERN(int) wrapped_git_odb_read(git_rawobj** obj_out, git_repository* repo, const char* raw_id);
GIT_EXTERN(int) wrapped_git_apply_tag(git_tag* tag_out, git_repository* repo, const char *raw_target_id, const char *tag_name, const char *tag_message, const char *tagger_name, const char *tagger_email, time_t tagger_time);
GIT_END_DECL
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册