@@ -485,6 +485,69 @@ func (v *Repository) CreateCommit(
485485 return oid, nil
486486}
487487
488+ // CreateCommitBuffer creates a commit and write it into a buffer.
489+ func (v *Repository) CreateCommitBuffer(
490+ author, committer *Signature,
491+ messageEncoding MessageEncoding,
492+ message string,
493+ tree *Tree,
494+ parents ...*Commit,
495+ ) ([]byte, error) {
496+ cmsg := C.CString(message)
497+ defer C.free(unsafe.Pointer(cmsg))
498+ var cencoding *C.char
499+ // Since the UTF-8 encoding is the default, pass in nil whenever UTF-8 is
500+ // provided. That will cause the commit to not have an explicit header for
501+ // it.
502+ if messageEncoding != MessageEncodingUTF8 && messageEncoding != MessageEncoding("") {
503+ cencoding = C.CString(string(messageEncoding))
504+ defer C.free(unsafe.Pointer(cencoding))
505+ }
506+
507+ var cparents []*C.git_commit = nil
508+ var parentsarg **C.git_commit = nil
509+
510+ nparents := len(parents)
511+ if nparents > 0 {
512+ cparents = make([]*C.git_commit, nparents)
513+ for i, v := range parents {
514+ cparents[i] = v.cast_ptr
515+ }
516+ parentsarg = &cparents[0]
517+ }
518+
519+ authorSig, err := author.toC()
520+ if err != nil {
521+ return nil, err
522+ }
523+ defer C.git_signature_free(authorSig)
524+
525+ committerSig, err := committer.toC()
526+ if err != nil {
527+ return nil, err
528+ }
529+ defer C.git_signature_free(committerSig)
530+
531+ runtime.LockOSThread()
532+ defer runtime.UnlockOSThread()
533+
534+ var buf C.git_buf
535+ defer C.git_buf_dispose(&buf)
536+ ret := C.git_commit_create_buffer(
537+ &buf, v.ptr,
538+ authorSig, committerSig,
539+ cencoding, cmsg, tree.cast_ptr, C.size_t(nparents), parentsarg)
540+
541+ runtime.KeepAlive(v)
542+ runtime.KeepAlive(buf)
543+ runtime.KeepAlive(parents)
544+ if ret < 0 {
545+ return nil, MakeGitError(ret)
546+ }
547+
548+ return C.GoBytes(unsafe.Pointer(buf.ptr), C.int(buf.size)), nil
549+ }
550+
488551func (v *Repository) CreateCommitFromIds(
489552 refname string, author, committer *Signature,
490553 message string, tree *Oid, parents ...*Oid) (*Oid, error) {
0 commit comments