@@ -6,6 +6,7 @@ package git
6
6
#include <stdlib.h>
7
7
8
8
extern int _go_git_packbuilder_foreach(git_packbuilder *pb, void *payload);
9
+ extern int _go_git_packbuilder_set_callbacks(git_packbuilder *pb, void *payload);
9
10
*/
10
11
import "C"
11
12
import (
@@ -15,10 +16,16 @@ import (
15
16
"unsafe"
16
17
)
17
18
19
+ const (
20
+ PackbuilderAddingObjects int32 = C .GIT_PACKBUILDER_ADDING_OBJECTS
21
+ PackbuilderDeltafication int32 = C .GIT_PACKBUILDER_DELTAFICATION
22
+ )
23
+
18
24
type Packbuilder struct {
19
25
doNotCompare
20
- ptr * C.git_packbuilder
21
- r * Repository
26
+ ptr * C.git_packbuilder
27
+ r * Repository
28
+ callbackHandle unsafe.Pointer
22
29
}
23
30
24
31
func (repo * Repository ) NewPackbuilder () (* Packbuilder , error ) {
@@ -34,13 +41,16 @@ func (repo *Repository) NewPackbuilder() (*Packbuilder, error) {
34
41
}
35
42
36
43
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 }
38
45
runtime .SetFinalizer (pb , (* Packbuilder ).Free )
39
46
return pb
40
47
}
41
48
42
49
func (pb * Packbuilder ) Free () {
43
50
runtime .SetFinalizer (pb , nil )
51
+ if pb .callbackHandle != nil {
52
+ pointerHandles .Untrack (pb .callbackHandle )
53
+ }
44
54
C .git_packbuilder_free (pb .ptr )
45
55
}
46
56
@@ -183,3 +193,47 @@ func (pb *Packbuilder) ForEach(callback PackbuilderForeachCallback) error {
183
193
184
194
return nil
185
195
}
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
+ }
0 commit comments