From 82b24a762c5fc37db7aad365208d78eea14beb9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn=20Nieto?= Date: Thu, 14 Nov 2013 01:04:06 +0100 Subject: [PATCH] remote: new _ls --- remote.go | 24 +++++++++++++++++++----- wrapper.c | 5 ----- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/remote.go b/remote.go index 4dca63e..529bc39 100644 --- a/remote.go +++ b/remote.go @@ -5,11 +5,11 @@ package git #include #include -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) Save() error { } 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 @@ type headlistData struct { 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 @@ int _go_git_odb_foreach(git_odb *db, void *payload) 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;