Add packbuilder.SetCallbacks() #947
15
odb.go
15
odb.go
|
@ -64,6 +64,21 @@ func (v *Odb) AddAlternate(backend *OdbBackend, priority int) (err error) {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (v *Odb) AddDiskAlternate(path string) (err error) {
|
||||||
|
runtime.LockOSThread()
|
||||||
|
defer runtime.UnlockOSThread()
|
||||||
|
|
||||||
|
cstr := C.CString(path)
|
||||||
|
defer C.free(unsafe.Pointer(cstr))
|
||||||
|
|
||||||
|
ret := C.git_odb_add_disk_alternate(v.ptr, cstr)
|
||||||
|
runtime.KeepAlive(v)
|
||||||
|
if ret < 0 {
|
||||||
|
return MakeGitError(ret)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (v *Odb) AddBackend(backend *OdbBackend, priority int) (err error) {
|
func (v *Odb) AddBackend(backend *OdbBackend, priority int) (err error) {
|
||||||
runtime.LockOSThread()
|
runtime.LockOSThread()
|
||||||
defer runtime.UnlockOSThread()
|
defer runtime.UnlockOSThread()
|
||||||
|
|
|
@ -6,6 +6,7 @@ package git
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
extern int _go_git_packbuilder_foreach(git_packbuilder *pb, void *payload);
|
extern int _go_git_packbuilder_foreach(git_packbuilder *pb, void *payload);
|
||||||
|
extern int _go_git_packbuilder_set_callbacks(git_packbuilder *pb, void *payload);
|
||||||
*/
|
*/
|
||||||
import "C"
|
import "C"
|
||||||
import (
|
import (
|
||||||
|
@ -15,10 +16,16 @@ import (
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
PackbuilderAddingObjects int32 = C.GIT_PACKBUILDER_ADDING_OBJECTS
|
||||||
|
PackbuilderDeltafication int32 = C.GIT_PACKBUILDER_DELTAFICATION
|
||||||
|
)
|
||||||
|
|
||||||
type Packbuilder struct {
|
type Packbuilder struct {
|
||||||
doNotCompare
|
doNotCompare
|
||||||
ptr *C.git_packbuilder
|
ptr *C.git_packbuilder
|
||||||
r *Repository
|
r *Repository
|
||||||
|
callbackHandle unsafe.Pointer
|
||||||
}
|
}
|
||||||
|
|
||||||
func (repo *Repository) NewPackbuilder() (*Packbuilder, error) {
|
func (repo *Repository) NewPackbuilder() (*Packbuilder, error) {
|
||||||
|
@ -34,13 +41,16 @@ func (repo *Repository) NewPackbuilder() (*Packbuilder, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func newPackbuilderFromC(ptr *C.git_packbuilder, r *Repository) *Packbuilder {
|
func newPackbuilderFromC(ptr *C.git_packbuilder, r *Repository) *Packbuilder {
|
||||||
pb := &Packbuilder{ptr: ptr, r: r}
|
pb := &Packbuilder{ptr: ptr, r: r, callbackHandle: nil}
|
||||||
runtime.SetFinalizer(pb, (*Packbuilder).Free)
|
runtime.SetFinalizer(pb, (*Packbuilder).Free)
|
||||||
return pb
|
return pb
|
||||||
}
|
}
|
||||||
|
|
||||||
func (pb *Packbuilder) Free() {
|
func (pb *Packbuilder) Free() {
|
||||||
runtime.SetFinalizer(pb, nil)
|
runtime.SetFinalizer(pb, nil)
|
||||||
|
if pb.callbackHandle != nil {
|
||||||
|
pointerHandles.Untrack(pb.callbackHandle)
|
||||||
|
}
|
||||||
C.git_packbuilder_free(pb.ptr)
|
C.git_packbuilder_free(pb.ptr)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -183,3 +193,47 @@ func (pb *Packbuilder) ForEach(callback PackbuilderForeachCallback) error {
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type packbuilderProgressCallbackData struct {
|
||||||
|
callback PackbuilderProgressCallback
|
||||||
|
errorTarget *error
|
||||||
|
}
|
||||||
|
|
||||||
|
//export packbuilderProgressCallback
|
||||||
|
func packbuilderProgressCallback(errorMessage **C.char, stage C.int, current, total C.uint, handle unsafe.Pointer) C.int {
|
||||||
|
data := pointerHandles.Get(handle).(*packbuilderProgressCallbackData)
|
||||||
|
if data.callback == nil {
|
||||||
|
return C.int(ErrorCodeOK)
|
||||||
|
}
|
||||||
|
|
||||||
|
err := data.callback(int32(stage), uint32(current), uint32(total))
|
||||||
|
if err != nil {
|
||||||
|
if data.errorTarget != nil {
|
||||||
|
*data.errorTarget = err
|
||||||
|
}
|
||||||
|
return setCallbackError(errorMessage, err)
|
||||||
|
}
|
||||||
|
return C.int(ErrorCodeOK)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pb *Packbuilder) SetCallbacks(callback PackbuilderProgressCallback) error {
|
||||||
|
var err error
|
||||||
|
data := packbuilderProgressCallbackData{
|
||||||
|
callback: callback,
|
||||||
|
errorTarget: &err,
|
||||||
|
}
|
||||||
|
handle := pointerHandles.Track(&data)
|
||||||
|
if pb.callbackHandle != nil {
|
||||||
|
pointerHandles.Untrack(pb.callbackHandle)
|
||||||
|
}
|
||||||
|
pb.callbackHandle = handle
|
||||||
|
|
||||||
|
runtime.LockOSThread()
|
||||||
|
defer runtime.UnlockOSThread()
|
||||||
|
ret := C._go_git_packbuilder_set_callbacks(pb.ptr, handle)
|
||||||
|
runtime.KeepAlive(pb)
|
||||||
|
if ret != 0 {
|
||||||
|
return MakeGitError(ret)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
18
wrapper.c
18
wrapper.c
|
@ -322,6 +322,24 @@ static int pack_progress_callback(int stage, unsigned int current, unsigned int
|
||||||
return set_callback_error(error_message, ret);
|
return set_callback_error(error_message, ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int packbuilder_progress_callback(int stage, unsigned int current, unsigned int total, void *data)
|
||||||
|
{
|
||||||
|
char *error_message = NULL;
|
||||||
|
const int ret = packbuilderProgressCallback(
|
||||||
|
&error_message,
|
||||||
|
stage,
|
||||||
|
current,
|
||||||
|
total,
|
||||||
|
data
|
||||||
|
);
|
||||||
|
return set_callback_error(error_message, ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
int _go_git_packbuilder_set_callbacks(git_packbuilder *pb, void *payload)
|
||||||
|
{
|
||||||
|
return git_packbuilder_set_callbacks(pb, (git_packbuilder_progress)&packbuilder_progress_callback, payload);
|
||||||
|
}
|
||||||
|
|
||||||
static int push_transfer_progress_callback(
|
static int push_transfer_progress_callback(
|
||||||
unsigned int current,
|
unsigned int current,
|
||||||
unsigned int total,
|
unsigned int total,
|
||||||
|
|
Loading…
Reference in New Issue