diff options
| author | Carlos Martín Nieto <[email protected]> | 2015-08-04 14:57:10 +0200 |
|---|---|---|
| committer | Carlos Martín Nieto <[email protected]> | 2015-08-04 14:59:10 +0200 |
| commit | 47949510f1f5ea851601f323ac243a9079fc0e27 (patch) | |
| tree | 32471a8da14566e788a8f51afcc833c5812b2047 /merge.go | |
| parent | 5d989f2caddad21d0296cd9a6a83cabce88858d5 (diff) | |
| parent | ed62fda34df271875320f72f36a870b78248ece2 (diff) | |
Merge remote-tracking branch 'origin/master' into next
Diffstat (limited to 'merge.go')
| -rw-r--r-- | merge.go | 31 |
1 files changed, 31 insertions, 0 deletions
@@ -10,6 +10,7 @@ extern git_annotated_commit* _go_git_annotated_commit_array_get(git_annotated_co */ import "C" import ( + "reflect" "runtime" "unsafe" ) @@ -243,6 +244,36 @@ func (r *Repository) MergeBase(one *Oid, two *Oid) (*Oid, error) { return newOidFromC(&oid), nil } +// MergeBases retrieves the list of merge bases between two commits. +// +// If none are found, an empty slice is returned and the error is set +// approprately +func (r *Repository) MergeBases(one, two *Oid) ([]*Oid, error) { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + var coids C.git_oidarray + ret := C.git_merge_bases(&coids, r.ptr, one.toC(), two.toC()) + if ret < 0 { + return make([]*Oid, 0), MakeGitError(ret) + } + + oids := make([]*Oid, coids.count) + hdr := reflect.SliceHeader { + Data: uintptr(unsafe.Pointer(coids.ids)), + Len: int(coids.count), + Cap: int(coids.count), + } + + goSlice := *(*[]C.git_oid)(unsafe.Pointer(&hdr)) + + for i, cid := range goSlice { + oids[i] = newOidFromC(&cid) + } + + return oids, nil +} + //TODO: int git_merge_base_many(git_oid *out, git_repository *repo, size_t length, const git_oid input_array[]); //TODO: GIT_EXTERN(int) git_merge_base_octopus(git_oid *out,git_repository *repo,size_t length,const git_oid input_array[]); |
