Skip to content

Commit 946d11f

Browse files
committed
Add packbuilder.SetCallbacks()
Add `SetCallbacks` function to packbuilder which invokes `git_packbuilder_set_callbacks` and allows packbuilder progress information to be reported back to the caller.
1 parent 4b14d29 commit 946d11f

File tree

2 files changed

+75
-3
lines changed

2 files changed

+75
-3
lines changed

packbuilder.go

+57-3
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package git
66
#include <stdlib.h>
77
88
extern int _go_git_packbuilder_foreach(git_packbuilder *pb, void *payload);
9+
extern int _go_git_packbuilder_set_callbacks(git_packbuilder *pb, void *payload);
910
*/
1011
import "C"
1112
import (
@@ -15,10 +16,16 @@ import (
1516
"unsafe"
1617
)
1718

19+
const (
20+
PackbuilderAddingObjects int32 = C.GIT_PACKBUILDER_ADDING_OBJECTS
21+
PackbuilderDeltafication int32 = C.GIT_PACKBUILDER_DELTAFICATION
22+
)
23+
1824
type Packbuilder struct {
1925
doNotCompare
20-
ptr *C.git_packbuilder
21-
r *Repository
26+
ptr *C.git_packbuilder
27+
r *Repository
28+
callbackHandle unsafe.Pointer
2229
}
2330

2431
func (repo *Repository) NewPackbuilder() (*Packbuilder, error) {
@@ -34,13 +41,16 @@ func (repo *Repository) NewPackbuilder() (*Packbuilder, error) {
3441
}
3542

3643
func newPackbuilderFromC(ptr *C.git_packbuilder, r *Repository) *Packbuilder {
37-
pb := &Packbuilder{ptr: ptr, r: r}
44+
pb := &Packbuilder{ptr: ptr, r: r, callbackHandle: nil}
3845
runtime.SetFinalizer(pb, (*Packbuilder).Free)
3946
return pb
4047
}
4148

4249
func (pb *Packbuilder) Free() {
4350
runtime.SetFinalizer(pb, nil)
51+
if pb.callbackHandle != nil {
52+
pointerHandles.Untrack(pb.callbackHandle)
53+
}
4454
C.git_packbuilder_free(pb.ptr)
4555
}
4656

@@ -183,3 +193,47 @@ func (pb *Packbuilder) ForEach(callback PackbuilderForeachCallback) error {
183193

184194
return nil
185195
}
196+
197+
type packbuilderProgressCallbackData struct {
198+
callback PackbuilderProgressCallback
199+
errorTarget *error
200+
}
201+
202+
//export packbuilderProgressCallback
203+
func packbuilderProgressCallback(errorMessage **C.char, stage C.int, current, total C.uint, handle unsafe.Pointer) C.int {
204+
data := pointerHandles.Get(handle).(*packbuilderProgressCallbackData)
205+
if data.callback == nil {
206+
return C.int(ErrorCodeOK)
207+
}
208+
209+
err := data.callback(int32(stage), uint32(current), uint32(total))
210+
if err != nil {
211+
if data.errorTarget != nil {
212+
*data.errorTarget = err
213+
}
214+
return setCallbackError(errorMessage, err)
215+
}
216+
return C.int(ErrorCodeOK)
217+
}
218+
219+
func (pb *Packbuilder) SetCallbacks(callback PackbuilderProgressCallback) error {
220+
var err error
221+
data := packbuilderProgressCallbackData{
222+
callback: callback,
223+
errorTarget: &err,
224+
}
225+
handle := pointerHandles.Track(&data)
226+
if pb.callbackHandle != nil {
227+
pointerHandles.Untrack(pb.callbackHandle)
228+
}
229+
pb.callbackHandle = handle
230+
231+
runtime.LockOSThread()
232+
defer runtime.UnlockOSThread()
233+
ret := C._go_git_packbuilder_set_callbacks(pb.ptr, handle)
234+
runtime.KeepAlive(pb)
235+
if ret != 0 {
236+
return MakeGitError(ret)
237+
}
238+
return nil
239+
}

wrapper.c

+18
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,24 @@ static int pack_progress_callback(int stage, unsigned int current, unsigned int
322322
return set_callback_error(error_message, ret);
323323
}
324324

325+
static int packbuilder_progress_callback(int stage, unsigned int current, unsigned int total, void *data)
326+
{
327+
char *error_message = NULL;
328+
const int ret = packbuilderProgressCallback(
329+
&error_message,
330+
stage,
331+
current,
332+
total,
333+
data
334+
);
335+
return set_callback_error(error_message, ret);
336+
}
337+
338+
int _go_git_packbuilder_set_callbacks(git_packbuilder *pb, void *payload)
339+
{
340+
return git_packbuilder_set_callbacks(pb, (git_packbuilder_progress)&packbuilder_progress_callback, payload);
341+
}
342+
325343
static int push_transfer_progress_callback(
326344
unsigned int current,
327345
unsigned int total,

0 commit comments

Comments
 (0)