96 lines
3.2 KiB
Julia
96 lines
3.2 KiB
Julia
# 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
|