| 197 | ) |
| 198 | |
| 199 | func (r *Repository) Merge(theirHeads []*AnnotatedCommit, mergeOptions *MergeOptions, checkoutOptions *CheckoutOptions) error { |
| 200 | runtime.LockOSThread() |
| 201 | defer runtime.UnlockOSThread() |
| 202 | |
| 203 | var err error |
| 204 | cMergeOpts := populateMergeOptions(&C.git_merge_options{}, mergeOptions) |
| 205 | defer freeMergeOptions(cMergeOpts) |
| 206 | cCheckoutOptions := populateCheckoutOptions(&C.git_checkout_options{}, checkoutOptions, &err) |
| 207 | defer freeCheckoutOptions(cCheckoutOptions) |
| 208 | |
| 209 | gmerge_head_array := make([]*C.git_annotated_commit, len(theirHeads)) |
| 210 | for i := 0; i < len(theirHeads); i++ { |
| 211 | gmerge_head_array[i] = theirHeads[i].ptr |
| 212 | } |
| 213 | ptr := unsafe.Pointer(&gmerge_head_array[0]) |
| 214 | ret := C.git_merge(r.ptr, (**C.git_annotated_commit)(ptr), C.size_t(len(theirHeads)), cMergeOpts, cCheckoutOptions) |
| 215 | runtime.KeepAlive(theirHeads) |
| 216 | if ret == C.int(ErrorCodeUser) && err != nil { |
| 217 | return err |
| 218 | } |
| 219 | if ret < 0 { |
| 220 | return MakeGitError(ret) |
| 221 | } |
| 222 | return nil |
| 223 | } |
| 224 | |
| 225 | type MergeAnalysis int |
| 226 | |