@@ -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