diff --git a/base/libgit2/reference.jl b/base/libgit2/reference.jl index 444704bef6780..47c35efe64a1b 100644 --- a/base/libgit2/reference.jl +++ b/base/libgit2/reference.jl @@ -73,6 +73,13 @@ function isbranch(ref::GitReference) return err == 1 end +function istag(ref::GitReference) + isempty(ref) && return false + err = ccall((:git_reference_is_tag, :libgit2), Cint, + (Ptr{Void},), ref.ptr) + return err == 1 +end + function isremote(ref::GitReference) isempty(ref) && return false err = ccall((:git_reference_is_remote, :libgit2), Cint, @@ -96,6 +103,15 @@ function peel{T <: GitObject}(::Type{T}, ref::GitReference) return T(obj_ptr_ptr[]) end +function ref_list(repo::GitRepo) + with(StrArrayStruct()) do sa + sa_ref = Ref(sa) + @check ccall((:git_reference_list, :libgit2), Cint, + (Ptr{StrArrayStruct}, Ptr{Void}), sa_ref, repo.ptr) + convert(Vector{AbstractString}, sa_ref[]) + end +end + function create_branch(repo::GitRepo, bname::AbstractString, commit_obj::GitCommit; diff --git a/base/libgit2/tag.jl b/base/libgit2/tag.jl index 83b822ea85a2f..71f40b3a494c5 100644 --- a/base/libgit2/tag.jl +++ b/base/libgit2/tag.jl @@ -31,10 +31,13 @@ function tag_create(repo::GitRepo, tag::AbstractString, commit::Union{AbstractSt end function name(tag::GitTag) - return String(ccall((:git_tag_name, :libgit2), Cstring, (Ptr{Void}, ), tag.ptr)) + str_ptr = ccall((:git_tag_name, :libgit2), Cstring, (Ptr{Void}, ), tag.ptr) + str_ptr == C_NULL && throw(Error.GitError(Error.ERROR)) + return String(str_ptr) end function target(tag::GitTag) - oid_ptr = Ref(ccall((:git_tag_target_id, :libgit2), Ptr{Oid}, (Ptr{Void}, ), tag.ptr)) - return oid_ptr[] + oid_ptr = ccall((:git_tag_target_id, :libgit2), Ptr{Oid}, (Ptr{Void}, ), tag.ptr) + oid_ptr == C_NULL && throw(Error.GitError(Error.ERROR)) + return Oid(oid_ptr) end diff --git a/test/libgit2.jl b/test/libgit2.jl index d36ede39426fd..a446d592fc7c7 100644 --- a/test/libgit2.jl +++ b/test/libgit2.jl @@ -219,6 +219,13 @@ mktempdir() do dir @test LibGit2.iszero(commit_oid2) commit_oid2 = LibGit2.commit(repo, commit_msg2; author=test_sig, committer=test_sig) @test !LibGit2.iszero(commit_oid2) + auths = LibGit2.authors(repo) + @test length(auths) == 3 + for auth in auths + @test auth.name == test_sig.name + @test auth.time == test_sig.time + @test auth.email == test_sig.email + end # lookup commits cmt = LibGit2.get(LibGit2.GitCommit, repo, commit_oid1) @@ -315,6 +322,11 @@ mktempdir() do dir tags = LibGit2.tag_list(repo) @test length(tags) == 1 @test tag1 in tags + tag1ref = LibGit2.GitReference(repo, "refs/tags/$tag1") + @test isempty(LibGit2.fullname(tag1ref)) #because this is a reference to an OID + tag1tag = LibGit2.peel(LibGit2.GitTag,tag1ref) + @test LibGit2.name(tag1tag) == tag1 + @test LibGit2.target(tag1tag) == commit_oid1 tag_oid2 = LibGit2.tag_create(repo, tag2, commit_oid2) @test !LibGit2.iszero(tag_oid2) @@ -322,6 +334,9 @@ mktempdir() do dir @test length(tags) == 2 @test tag2 in tags + refs = LibGit2.ref_list(repo) + @test refs == ["refs/heads/master","refs/heads/test_branch","refs/tags/tag1","refs/tags/tag2"] + LibGit2.tag_delete(repo, tag1) tags = LibGit2.tag_list(repo) @test length(tags) == 1