@@ -334,7 +334,7 @@ func (r *Repository) MergeBases(one, two *Oid) ([]*Oid, error) {
334
334
runtime .KeepAlive (one )
335
335
runtime .KeepAlive (two )
336
336
if ret < 0 {
337
- return make ([] * Oid , 0 ) , MakeGitError (ret )
337
+ return nil , MakeGitError (ret )
338
338
}
339
339
340
340
oids := make ([]* Oid , coids .count )
@@ -353,8 +353,78 @@ func (r *Repository) MergeBases(one, two *Oid) ([]*Oid, error) {
353
353
return oids , nil
354
354
}
355
355
356
- //TODO: int git_merge_base_many(git_oid *out, git_repository *repo, size_t length, const git_oid input_array[]);
357
- //TODO: GIT_EXTERN(int) git_merge_base_octopus(git_oid *out,git_repository *repo,size_t length,const git_oid input_array[]);
356
+ // MergeBaseMany finds a merge base given a list of commits.
357
+ func (r * Repository ) MergeBaseMany (oids []* Oid ) (* Oid , error ) {
358
+ coids := make ([]C.git_oid , len (oids ))
359
+ for i := 0 ; i < len (oids ); i ++ {
360
+ coids [i ] = * oids [i ].toC ()
361
+ }
362
+
363
+ runtime .LockOSThread ()
364
+ defer runtime .UnlockOSThread ()
365
+
366
+ var oid C.git_oid
367
+ ret := C .git_merge_base_many (& oid , r .ptr , C .size_t (len (oids )), & coids [0 ])
368
+ runtime .KeepAlive (r )
369
+ runtime .KeepAlive (coids )
370
+ if ret < 0 {
371
+ return nil , MakeGitError (ret )
372
+ }
373
+ return newOidFromC (& oid ), nil
374
+ }
375
+
376
+ // MergeBasesMany finds all merge bases given a list of commits.
377
+ func (r * Repository ) MergeBasesMany (oids []* Oid ) ([]* Oid , error ) {
378
+ inCoids := make ([]C.git_oid , len (oids ))
379
+ for i := 0 ; i < len (oids ); i ++ {
380
+ inCoids [i ] = * oids [i ].toC ()
381
+ }
382
+
383
+ runtime .LockOSThread ()
384
+ defer runtime .UnlockOSThread ()
385
+
386
+ var outCoids C.git_oidarray
387
+ ret := C .git_merge_bases_many (& outCoids , r .ptr , C .size_t (len (oids )), & inCoids [0 ])
388
+ runtime .KeepAlive (r )
389
+ runtime .KeepAlive (inCoids )
390
+ if ret < 0 {
391
+ return nil , MakeGitError (ret )
392
+ }
393
+
394
+ outOids := make ([]* Oid , outCoids .count )
395
+ hdr := reflect.SliceHeader {
396
+ Data : uintptr (unsafe .Pointer (outCoids .ids )),
397
+ Len : int (outCoids .count ),
398
+ Cap : int (outCoids .count ),
399
+ }
400
+ goSlice := * (* []C.git_oid )(unsafe .Pointer (& hdr ))
401
+
402
+ for i , cid := range goSlice {
403
+ outOids [i ] = newOidFromC (& cid )
404
+ }
405
+
406
+ return outOids , nil
407
+ }
408
+
409
+ // MergeBaseOctopus finds a merge base in preparation for an octopus merge.
410
+ func (r * Repository ) MergeBaseOctopus (oids []* Oid ) (* Oid , error ) {
411
+ coids := make ([]C.git_oid , len (oids ))
412
+ for i := 0 ; i < len (oids ); i ++ {
413
+ coids [i ] = * oids [i ].toC ()
414
+ }
415
+
416
+ runtime .LockOSThread ()
417
+ defer runtime .UnlockOSThread ()
418
+
419
+ var oid C.git_oid
420
+ ret := C .git_merge_base_octopus (& oid , r .ptr , C .size_t (len (oids )), & coids [0 ])
421
+ runtime .KeepAlive (r )
422
+ runtime .KeepAlive (coids )
423
+ if ret < 0 {
424
+ return nil , MakeGitError (ret )
425
+ }
426
+ return newOidFromC (& oid ), nil
427
+ }
358
428
359
429
type MergeFileResult struct {
360
430
Automergeable bool
0 commit comments