remote: new _ls

This commit is contained in:
Carlos Martín Nieto 2013-11-14 01:04:06 +01:00
parent 09f2361ba6
commit 82b24a762c
2 changed files with 19 additions and 10 deletions

View File

@ -5,11 +5,11 @@ package git
#include <git2.h> #include <git2.h>
#include <git2/errors.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); extern int _go_git_remote_set_callbacks(git_remote *remote, void *payload);
*/ */
import "C" import "C"
import ( import (
"reflect"
"runtime" "runtime"
"unsafe" "unsafe"
) )
@ -90,14 +90,29 @@ func (r *Remote) Save() error {
} }
func (r *Remote) Ls() ([]*RemoteHead, 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 { if ret < 0 {
return nil, LastError() 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 { func (r *Remote) Download() error {
@ -155,7 +170,6 @@ type headlistData struct {
slice []*RemoteHead slice []*RemoteHead
} }
//export remoteHeadlistCb
func remoteHeadlistCb(rhead *C.git_remote_head, dataptr unsafe.Pointer) int { func remoteHeadlistCb(rhead *C.git_remote_head, dataptr unsafe.Pointer) int {
data := (*headlistData)(dataptr) data := (*headlistData)(dataptr)

View File

@ -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); 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) int _go_git_remote_set_callbacks(git_remote *remote, void *payload)
{ {
git_remote_callbacks cbs = GIT_REMOTE_CALLBACKS_INIT; git_remote_callbacks cbs = GIT_REMOTE_CALLBACKS_INIT;