set callbacks just before fetch, clear them after (fixes #403).
This commit is contained in:
parent
6c4e1d093b
commit
794dbe7b9c
@ -12,6 +12,7 @@ typedef ... git_index_conflict_iterator;
|
|||||||
|
|
||||||
#define GIT_OID_RAWSZ ...
|
#define GIT_OID_RAWSZ ...
|
||||||
#define GIT_PATH_MAX ...
|
#define GIT_PATH_MAX ...
|
||||||
|
#define GIT_REMOTE_CALLBACKS_VERSION ...
|
||||||
|
|
||||||
typedef struct git_oid {
|
typedef struct git_oid {
|
||||||
unsigned char id[20];
|
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_add_fetch(git_remote *remote, const char *refspec);
|
||||||
int git_remote_save(const git_remote *remote);
|
int git_remote_save(const git_remote *remote);
|
||||||
int git_remote_set_callbacks(git_remote *remote, const git_remote_callbacks *callbacks);
|
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);
|
size_t git_remote_refspec_count(git_remote *remote);
|
||||||
const git_refspec * git_remote_get_refspec(git_remote *remote, size_t n);
|
const git_refspec * git_remote_get_refspec(git_remote *remote, size_t n);
|
||||||
|
|
||||||
|
@ -127,20 +127,6 @@ class Remote(object):
|
|||||||
self._remote = ptr
|
self._remote = ptr
|
||||||
self._stored_exception = None
|
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):
|
def __del__(self):
|
||||||
C.git_remote_free(self._remote)
|
C.git_remote_free(self._remote)
|
||||||
|
|
||||||
@ -205,17 +191,39 @@ class Remote(object):
|
|||||||
Perform a fetch against this remote.
|
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:
|
if signature:
|
||||||
ptr = signature._pointer[:]
|
ptr = signature._pointer[:]
|
||||||
else:
|
else:
|
||||||
ptr = ffi.NULL
|
ptr = ffi.NULL
|
||||||
|
|
||||||
self._stored_exception = None
|
self._stored_exception = None
|
||||||
err = C.git_remote_fetch(self._remote, ptr, to_bytes(message))
|
|
||||||
if self._stored_exception:
|
|
||||||
raise self._stored_exception
|
|
||||||
|
|
||||||
check_error(err)
|
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))
|
return TransferProgress(C.git_remote_stats(self._remote))
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user