remote: new _ls
diff --git a/remote.go b/remote.go
index 4dca63e..529bc39 100644
--- a/remote.go
+++ b/remote.go
@@ -5,11 +5,11 @@
#include <git2.h>
#include <git2/errors.h>
-extern int _go_git_remote_ls(git_remote *remote, void *payload);
extern int _go_git_remote_set_callbacks(git_remote *remote, void *payload);
*/
import "C"
import (
+ "reflect"
"runtime"
"unsafe"
)
@@ -90,14 +90,29 @@
}
func (r *Remote) Ls() ([]*RemoteHead, error) {
- var data headlistData
+ runtime.LockOSThread()
+ defer runtime.UnlockOSThread()
- ret := C._go_git_remote_ls(r.ptr, unsafe.Pointer(&data))
+ var cheads **C.git_remote_head
+ var slice []*C.git_remote_head
+ var csize C.size_t
+
+ ret := C.git_remote_ls(&cheads, &csize, r.ptr)
if ret < 0 {
return nil, LastError()
}
- return data.slice, nil
+ sliceHeader := (*reflect.SliceHeader)((unsafe.Pointer(&slice)))
+ sliceHeader.Cap = int(csize)
+ sliceHeader.Len = int(csize)
+ sliceHeader.Data = uintptr(unsafe.Pointer(cheads))
+
+ heads := make([]*RemoteHead, csize)
+ for i, h := range slice {
+ heads[i] = newRemoteHeadFromC(h)
+ }
+
+ return heads, nil
}
func (r *Remote) Download() error {
@@ -155,7 +170,6 @@
slice []*RemoteHead
}
-//export remoteHeadlistCb
func remoteHeadlistCb(rhead *C.git_remote_head, dataptr unsafe.Pointer) int {
data := (*headlistData)(dataptr)
diff --git a/wrapper.c b/wrapper.c
index 945f106..00ae929 100644
--- a/wrapper.c
+++ b/wrapper.c
@@ -26,11 +26,6 @@
return git_odb_foreach(db, (git_odb_foreach_cb)&odbForEachCb, payload);
}
-int _go_git_remote_ls(git_remote *remote, void *payload)
-{
- return git_remote_ls(remote, (git_headlist_cb) remoteHeadlistCb, payload);
-}
-
int _go_git_remote_set_callbacks(git_remote *remote, void *payload)
{
git_remote_callbacks cbs = GIT_REMOTE_CALLBACKS_INIT;