diff options
| author | Jason Toffaletti <[email protected]> | 2014-01-05 20:55:32 +0000 |
|---|---|---|
| committer | Jason Toffaletti <[email protected]> | 2014-01-05 20:55:32 +0000 |
| commit | 5d8a14d108ac963a4865cd03e20e56b28ee9626e (patch) | |
| tree | 5badc289d5021ada588cdffe3b5c27c6ff9defae /remote.go | |
| parent | e825d66fba2cb4169c7f3b0a43c491cf9e8c0738 (diff) | |
wrappers for git_cred, git_transfer_progress. don't call nil callbacks.
Diffstat (limited to 'remote.go')
| -rw-r--r-- | remote.go | 90 |
1 files changed, 67 insertions, 23 deletions
@@ -13,9 +13,11 @@ extern void _setup_callbacks(git_remote_callbacks *callbacks); */ import "C" -import ( - "unsafe" -) +import "unsafe" + +type TransferProgress struct { + ptr *C.git_transfer_progress +} type RemoteCompletion uint const ( @@ -26,60 +28,102 @@ const ( type ProgressCallback func(str string) int type CompletionCallback func(RemoteCompletion) int -type CredentialsCallback func(url string, username_from_url string, allowed_types uint) int // FIXME -type TransferProgressCallback func() int // FIXME +type CredentialsCallback func(url string, username_from_url string, allowed_types CredType) (int, Cred) +type TransferProgressCallback func(stats TransferProgress) int type UpdateTipsCallback func(refname string, a *Oid, b *Oid) int +type RemoteCallbacks struct { + ProgressCallback + CompletionCallback + CredentialsCallback + TransferProgressCallback + UpdateTipsCallback +} + +func populateRemoteCallbacks(ptr *C.git_remote_callbacks, callbacks *RemoteCallbacks) { + *ptr = C.git_remote_callbacks_init() + if callbacks == nil { + return + } + C._setup_callbacks(ptr) + ptr.payload = unsafe.Pointer(callbacks) +} + //export progressCallback func progressCallback(_str *C.char, _len C.int, data unsafe.Pointer) int { callbacks := (*RemoteCallbacks)(data) - str := C.GoStringN(_str, _len) + if callbacks.ProgressCallback == nil { + return 0 + } + str := C.GoStringN(_str, _len) return callbacks.ProgressCallback(str) } //export completionCallback func completionCallback(completion_type C.git_remote_completion_type, data unsafe.Pointer) int { callbacks := (*RemoteCallbacks)(data) + if callbacks.CompletionCallback == nil { + return 0 + } return callbacks.CompletionCallback((RemoteCompletion)(completion_type)) } //export credentialsCallback func credentialsCallback(_cred **C.git_cred, _url *C.char, _username_from_url *C.char, allowed_types uint, data unsafe.Pointer) int { callbacks := (*RemoteCallbacks)(data) - //cred := C.GoString(_cred) + if callbacks.CredentialsCallback == nil { + return 0 + } url := C.GoString(_url) username_from_url := C.GoString(_username_from_url) - return callbacks.CredentialsCallback(url, username_from_url, allowed_types) + ret, cred := callbacks.CredentialsCallback(url, username_from_url, (CredType)(allowed_types)) + if gcred, ok := cred.(gitCred); ok { + *_cred = gcred.ptr + } + return ret } //export transferProgressCallback -func transferProgressCallback(stats C.git_transfer_progress, data unsafe.Pointer) int { +func transferProgressCallback(stats *C.git_transfer_progress, data unsafe.Pointer) int { callbacks := (*RemoteCallbacks)(data) - return callbacks.TransferProgressCallback() + if callbacks.TransferProgressCallback == nil { + return 0 + } + return callbacks.TransferProgressCallback(TransferProgress{stats}) } //export updateTipsCallback func updateTipsCallback(_refname *C.char, _a *C.git_oid, _b *C.git_oid, data unsafe.Pointer) int { callbacks := (*RemoteCallbacks)(data) + if callbacks.UpdateTipsCallback == nil { + return 0 + } refname := C.GoString(_refname) a := newOidFromC(_a) b := newOidFromC(_b) return callbacks.UpdateTipsCallback(refname, a, b) } -type RemoteCallbacks struct { - ProgressCallback - CompletionCallback - CredentialsCallback - TransferProgressCallback - UpdateTipsCallback +func (o TransferProgress) TotalObjects() uint { + return uint(o.ptr.total_objects) } -func populateRemoteCallbacks(ptr *C.git_remote_callbacks, callbacks *RemoteCallbacks) { - *ptr = C.git_remote_callbacks_init() - if callbacks == nil { - return - } - C._setup_callbacks(ptr) - ptr.payload = unsafe.Pointer(callbacks) +func (o TransferProgress) IndexedObjects() uint { + return uint(o.ptr.indexed_objects) +} + +func (o TransferProgress) ReceivedObjects() uint { + return uint(o.ptr.received_objects) +} + +func (o TransferProgress) LocalObjects() uint { + return uint(o.ptr.local_objects) +} + +func (o TransferProgress) TotalDeltas() uint { + return uint(o.ptr.total_deltas) +} + +func (o TransferProgress) ReceivedBytes() uint { + return uint(o.ptr.received_bytes) } |
