Add: julia-0.6.2
Former-commit-id: ccc667cf67d569f3fb3df39aa57c2134755a7551
This commit is contained in:
95
julia-0.6.2/share/julia/base/libgit2/commit.jl
Normal file
95
julia-0.6.2/share/julia/base/libgit2/commit.jl
Normal file
@@ -0,0 +1,95 @@
|
||||
# This file is a part of Julia. License is MIT: https://julialang.org/license
|
||||
|
||||
function message(c::GitCommit, raw::Bool=false)
|
||||
local msg_ptr::Cstring
|
||||
msg_ptr = raw? ccall((:git_commit_message_raw, :libgit2), Cstring, (Ptr{Void},), c.ptr) :
|
||||
ccall((:git_commit_message, :libgit2), Cstring, (Ptr{Void},), c.ptr)
|
||||
if msg_ptr == C_NULL
|
||||
return nothing
|
||||
end
|
||||
return unsafe_string(msg_ptr)
|
||||
end
|
||||
|
||||
function author(c::GitCommit)
|
||||
ptr = ccall((:git_commit_author, :libgit2), Ptr{SignatureStruct}, (Ptr{Void},), c.ptr)
|
||||
@assert ptr != C_NULL
|
||||
return Signature(ptr)
|
||||
end
|
||||
|
||||
function committer(c::GitCommit)
|
||||
ptr = ccall((:git_commit_committer, :libgit2), Ptr{SignatureStruct}, (Ptr{Void},), c.ptr)
|
||||
@assert ptr != C_NULL
|
||||
return Signature(ptr)
|
||||
end
|
||||
|
||||
function Base.show(io::IO, c::GitCommit)
|
||||
authstr = sprint(show, author(c))
|
||||
cmtrstr = sprint(show, committer(c))
|
||||
print(io, "Git Commit:\nCommit Author: $authstr\nCommitter: $cmtrstr\nSHA: $(GitHash(c))\nMessage:\n$(message(c))")
|
||||
end
|
||||
|
||||
""" Wrapper around `git_commit_create` """
|
||||
function commit(repo::GitRepo,
|
||||
refname::AbstractString,
|
||||
msg::AbstractString,
|
||||
author::GitSignature,
|
||||
committer::GitSignature,
|
||||
tree::GitTree,
|
||||
parents::GitCommit...)
|
||||
commit_id_ptr = Ref(GitHash())
|
||||
nparents = length(parents)
|
||||
parentptrs = Ptr{Void}[c.ptr for c in parents]
|
||||
@check ccall((:git_commit_create, :libgit2), Cint,
|
||||
(Ptr{GitHash}, Ptr{Void}, Ptr{UInt8},
|
||||
Ptr{SignatureStruct}, Ptr{SignatureStruct},
|
||||
Ptr{UInt8}, Ptr{UInt8}, Ptr{Void},
|
||||
Csize_t, Ptr{Ptr{Void}}),
|
||||
commit_id_ptr, repo.ptr, isempty(refname) ? C_NULL : refname,
|
||||
author.ptr, committer.ptr,
|
||||
C_NULL, msg, tree.ptr,
|
||||
nparents, nparents > 0 ? parentptrs : C_NULL)
|
||||
return commit_id_ptr[]
|
||||
end
|
||||
|
||||
"""Commit changes to repository"""
|
||||
function commit(repo::GitRepo, msg::AbstractString;
|
||||
refname::AbstractString=Consts.HEAD_FILE,
|
||||
author::Signature = Signature(repo),
|
||||
committer::Signature = Signature(repo),
|
||||
tree_id::GitHash = GitHash(),
|
||||
parent_ids::Vector{GitHash}=GitHash[])
|
||||
# Retrieve tree identifier
|
||||
if iszero(tree_id)
|
||||
tree_id = with(GitIndex, repo) do idx; write_tree!(idx) end
|
||||
end
|
||||
|
||||
# Retrieve parents from HEAD
|
||||
if isempty(parent_ids)
|
||||
try # if throws then HEAD not found -> empty repo
|
||||
push!(parent_ids, GitHash(repo, refname))
|
||||
end
|
||||
end
|
||||
|
||||
# return commit id
|
||||
commit_id = GitHash()
|
||||
|
||||
# get necessary objects
|
||||
tree = GitTree(repo, tree_id)
|
||||
auth_sig = convert(GitSignature, author)
|
||||
comm_sig = convert(GitSignature, committer)
|
||||
parents = GitCommit[]
|
||||
try
|
||||
for id in parent_ids
|
||||
push!(parents, GitCommit(repo, id))
|
||||
end
|
||||
commit_id = commit(repo, refname, msg, auth_sig, comm_sig, tree, parents...)
|
||||
finally
|
||||
for parent in parents
|
||||
close(parent)
|
||||
end
|
||||
close(tree)
|
||||
close(auth_sig)
|
||||
close(comm_sig)
|
||||
end
|
||||
return commit_id
|
||||
end
|
||||
Reference in New Issue
Block a user