Add support for CreateCommitFromIds
This change adds support for CreateCommitFromIds from libgit2.
This commit is contained in:
parent
eec1547c20
commit
8ff5e43711
|
@ -3,6 +3,8 @@ package git
|
||||||
/*
|
/*
|
||||||
#include <git2.h>
|
#include <git2.h>
|
||||||
#include <git2/sys/repository.h>
|
#include <git2/sys/repository.h>
|
||||||
|
#include <git2/sys/commit.h>
|
||||||
|
#include <string.h>
|
||||||
*/
|
*/
|
||||||
import "C"
|
import "C"
|
||||||
import (
|
import (
|
||||||
|
@ -389,6 +391,66 @@ func (v *Repository) CreateCommit(
|
||||||
return oid, nil
|
return oid, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (v *Repository) CreateCommitFromIds(
|
||||||
|
refname string, author, committer *Signature,
|
||||||
|
message string, tree *Oid, parents ...*Oid) (*Oid, error) {
|
||||||
|
|
||||||
|
oid := new(Oid)
|
||||||
|
|
||||||
|
var cref *C.char
|
||||||
|
if refname == "" {
|
||||||
|
cref = nil
|
||||||
|
} else {
|
||||||
|
cref = C.CString(refname)
|
||||||
|
defer C.free(unsafe.Pointer(cref))
|
||||||
|
}
|
||||||
|
|
||||||
|
cmsg := C.CString(message)
|
||||||
|
defer C.free(unsafe.Pointer(cmsg))
|
||||||
|
|
||||||
|
var parentsarg **C.git_oid = nil
|
||||||
|
|
||||||
|
nparents := len(parents)
|
||||||
|
if nparents > 0 {
|
||||||
|
parentsarg = (**C.git_oid)(C.malloc(C.size_t(unsafe.Sizeof(uintptr(0)) * uintptr(nparents))))
|
||||||
|
defer C.free(unsafe.Pointer(parentsarg))
|
||||||
|
parentsptr := uintptr(unsafe.Pointer(parentsarg))
|
||||||
|
for _, v := range parents {
|
||||||
|
*(**C.git_oid)(unsafe.Pointer(parentsptr)) = v.toC()
|
||||||
|
parentsptr += unsafe.Sizeof(uintptr(0))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
authorSig, err := author.toC()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer C.git_signature_free(authorSig)
|
||||||
|
|
||||||
|
committerSig, err := committer.toC()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer C.git_signature_free(committerSig)
|
||||||
|
|
||||||
|
runtime.LockOSThread()
|
||||||
|
defer runtime.UnlockOSThread()
|
||||||
|
|
||||||
|
ret := C.git_commit_create_from_ids(
|
||||||
|
oid.toC(), v.ptr, cref,
|
||||||
|
authorSig, committerSig,
|
||||||
|
nil, cmsg, tree.toC(), C.size_t(nparents), parentsarg)
|
||||||
|
|
||||||
|
runtime.KeepAlive(v)
|
||||||
|
runtime.KeepAlive(oid)
|
||||||
|
runtime.KeepAlive(parents)
|
||||||
|
if ret < 0 {
|
||||||
|
return nil, MakeGitError(ret)
|
||||||
|
}
|
||||||
|
|
||||||
|
return oid, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (v *Odb) Free() {
|
func (v *Odb) Free() {
|
||||||
runtime.SetFinalizer(v, nil)
|
runtime.SetFinalizer(v, nil)
|
||||||
C.git_odb_free(v.ptr)
|
C.git_odb_free(v.ptr)
|
||||||
|
|
Loading…
Reference in New Issue