set callbacks just before fetch, clear them after (fixes #403).

This commit is contained in:
Matthew Duggan 2014-08-18 18:22:45 +09:00
parent 6c4e1d093b
commit 794dbe7b9c
2 changed files with 28 additions and 18 deletions

@ -12,6 +12,7 @@ typedef ... git_index_conflict_iterator;
#define GIT_OID_RAWSZ ...
#define GIT_PATH_MAX ...
#define GIT_REMOTE_CALLBACKS_VERSION ...
typedef struct git_oid {
unsigned char id[20];
@ -136,6 +137,7 @@ int git_remote_add_push(git_remote *remote, const char *refspec);
int git_remote_add_fetch(git_remote *remote, const char *refspec);
int git_remote_save(const git_remote *remote);
int git_remote_set_callbacks(git_remote *remote, const git_remote_callbacks *callbacks);
int git_remote_init_callbacks(git_remote_callbacks *opts, unsigned int version);
size_t git_remote_refspec_count(git_remote *remote);
const git_refspec * git_remote_get_refspec(git_remote *remote, size_t n);

@ -127,20 +127,6 @@ class Remote(object):
self._remote = ptr
self._stored_exception = None
# Build the callback structure
callbacks = ffi.new('git_remote_callbacks *')
callbacks.version = 1
callbacks.sideband_progress = self._sideband_progress_cb
callbacks.transfer_progress = self._transfer_progress_cb
callbacks.update_tips = self._update_tips_cb
callbacks.credentials = self._credentials_cb
# We need to make sure that this handle stays alive
self._self_handle = ffi.new_handle(self)
callbacks.payload = self._self_handle
err = C.git_remote_set_callbacks(self._remote, callbacks)
check_error(err)
def __del__(self):
C.git_remote_free(self._remote)
@ -205,17 +191,39 @@ class Remote(object):
Perform a fetch against this remote.
"""
defaultcallbacks = ffi.new('git_remote_callbacks *')
err = C.git_remote_init_callbacks(defaultcallbacks,
C.GIT_REMOTE_CALLBACKS_VERSION)
# Build the callback structure
callbacks = ffi.new('git_remote_callbacks *')
callbacks.version = 1
callbacks.sideband_progress = self._sideband_progress_cb
callbacks.transfer_progress = self._transfer_progress_cb
callbacks.update_tips = self._update_tips_cb
callbacks.credentials = self._credentials_cb
callbacks.payload = ffi.new_handle(self)
err = C.git_remote_set_callbacks(self._remote, callbacks)
check_error(err)
if signature:
ptr = signature._pointer[:]
else:
ptr = ffi.NULL
self._stored_exception = None
try:
err = C.git_remote_fetch(self._remote, ptr, to_bytes(message))
if self._stored_exception:
raise self._stored_exception
check_error(err)
finally:
# Even on error, clear stored callbacks and reset to default
err = C.git_remote_set_callbacks(self._remote, defaultcallbacks)
check_error(err)
return TransferProgress(C.git_remote_stats(self._remote))