From 9effa2fb72f20332c2c8a83540bb224a32e0265b Mon Sep 17 00:00:00 2001 From: Jacques Germishuys Date: Sun, 20 Apr 2014 19:19:13 +0200 Subject: Fire progress callbacks also for pushes. It's not very useful to only know that a pre-receive hook has declined a push, you probably want to know why. --- include/git2/remote.h | 3 +- src/transports/smart_protocol.c | 71 ++++++++++++++++++++--------------------- 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/include/git2/remote.h b/include/git2/remote.h index d57321f03..88040d49c 100644 --- a/include/git2/remote.h +++ b/include/git2/remote.h @@ -455,7 +455,8 @@ struct git_remote_callbacks { /** * Textual progress from the remote. Text send over the * progress side-band will be passed to this function (this is - * the 'counting objects' output. + * the 'counting objects' output. This callback should return a value less + * than zero to cancel the operation. */ int (*progress)(const char *str, int len, void *data); diff --git a/src/transports/smart_protocol.c b/src/transports/smart_protocol.c index 7e8fcdd92..e5b56eaff 100644 --- a/src/transports/smart_protocol.c +++ b/src/transports/smart_protocol.c @@ -478,7 +478,7 @@ int git_smart__download_pack( git_transport *transport, git_repository *repo, git_transfer_progress *stats, - git_transfer_progress_callback progress_cb, + git_transfer_progress_callback transfer_progress_cb, void *progress_payload) { transport_smart *t = (transport_smart *)transport; @@ -490,8 +490,8 @@ int git_smart__download_pack( memset(stats, 0, sizeof(git_transfer_progress)); - if (progress_cb) { - npp.callback = progress_cb; + if (transfer_progress_cb) { + npp.callback = transfer_progress_cb; npp.payload = progress_payload; npp.stats = stats; t->packetsize_cb = &network_packetsize; @@ -504,7 +504,7 @@ int git_smart__download_pack( } if ((error = git_repository_odb__weakptr(&odb, repo)) < 0 || - ((error = git_odb_write_pack(&writepack, odb, progress_cb, progress_payload)) != 0)) + ((error = git_odb_write_pack(&writepack, odb, transfer_progress_cb, progress_payload)) != 0)) goto done; /* @@ -518,7 +518,7 @@ int git_smart__download_pack( } do { - git_pkt *pkt; + git_pkt *pkt = NULL; /* Check cancellation before network call */ if (t->cancelled.val) { @@ -527,40 +527,34 @@ int git_smart__download_pack( goto done; } - if ((error = recv_pkt(&pkt, buf)) < 0) - goto done; - - /* Check cancellation after network call */ - if (t->cancelled.val) { - giterr_clear(); - error = GIT_EUSER; - goto done; + if ((error = recv_pkt(&pkt, buf)) >= 0) { + /* Check cancellation after network call */ + if (t->cancelled.val) { + giterr_clear(); + error = GIT_EUSER; + } else if (pkt->type == GIT_PKT_PROGRESS) { + if (t->progress_cb) { + git_pkt_progress *p = (git_pkt_progress *) pkt; + error = t->progress_cb(p->data, p->len, t->message_cb_payload); + } + } else if (pkt->type == GIT_PKT_DATA) { + git_pkt_data *p = (git_pkt_data *) pkt; + error = writepack->append(writepack, p->data, p->len, stats); + } else if (pkt->type == GIT_PKT_FLUSH) { + /* A flush indicates the end of the packfile */ + git__free(pkt); + break; + } } - if (pkt->type == GIT_PKT_PROGRESS) { - if (t->progress_cb) { - git_pkt_progress *p = (git_pkt_progress *) pkt; - error = t->progress_cb(p->data, p->len, t->message_cb_payload); - if (error) - goto done; - } - git__free(pkt); - } else if (pkt->type == GIT_PKT_DATA) { - git_pkt_data *p = (git_pkt_data *) pkt; - error = writepack->append(writepack, p->data, p->len, stats); + git__free(pkt); + if (error < 0) + goto done; - git__free(pkt); - if (error != 0) - goto done; - } else if (pkt->type == GIT_PKT_FLUSH) { - /* A flush indicates the end of the packfile */ - git__free(pkt); - break; - } } while (1); /* - * Trailing execution of progress_cb, if necessary... + * Trailing execution of transfer_progress_cb, if necessary... * Only the callback through the npp datastructure currently * updates the last_fired_bytes value. It is possible that * progress has already been reported with the correct @@ -579,7 +573,7 @@ int git_smart__download_pack( done: if (writepack) writepack->free(writepack); - if (progress_cb) { + if (transfer_progress_cb) { t->packetsize_cb = NULL; t->packetsize_payload = NULL; } @@ -696,10 +690,11 @@ static int add_push_report_sideband_pkt(git_push *push, git_pkt_data *data_pkt) return 0; } -static int parse_report(gitno_buffer *buf, git_push *push) +static int parse_report(transport_smart *transport, git_push *push) { git_pkt *pkt = NULL; const char *line_end = NULL; + gitno_buffer *buf = &transport->buffer; int error, recvd; for (;;) { @@ -738,6 +733,10 @@ static int parse_report(gitno_buffer *buf, git_push *push) error = -1; break; case GIT_PKT_PROGRESS: + if (transport->progress_cb) { + git_pkt_progress *p = (git_pkt_progress *) pkt; + error = transport->progress_cb(p->data, p->len, transport->message_cb_payload); + } break; default: error = add_push_report_pkt(push, pkt); @@ -953,7 +952,7 @@ int git_smart__push(git_transport *transport, git_push *push) * we consider the pack to have been unpacked successfully */ if (!push->specs.length || !push->report_status) push->unpack_ok = 1; - else if ((error = parse_report(&t->buffer, push)) < 0) + else if ((error = parse_report(t, push)) < 0) goto done; /* If progress is being reported write the final report */ -- cgit v1.2.1 From 4f62163ead2bde1af3cd7d0c0b8990e1831d3ffd Mon Sep 17 00:00:00 2001 From: Jacques Germishuys Date: Sun, 20 Apr 2014 22:06:05 +0200 Subject: Check the return codes of remote callbacks. The user may have requested that the operation be cancelled. --- include/git2/remote.h | 3 +-- src/transports/smart_protocol.c | 14 +++++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/include/git2/remote.h b/include/git2/remote.h index 88040d49c..d57321f03 100644 --- a/include/git2/remote.h +++ b/include/git2/remote.h @@ -455,8 +455,7 @@ struct git_remote_callbacks { /** * Textual progress from the remote. Text send over the * progress side-band will be passed to this function (this is - * the 'counting objects' output. This callback should return a value less - * than zero to cancel the operation. + * the 'counting objects' output. */ int (*progress)(const char *str, int len, void *data); diff --git a/src/transports/smart_protocol.c b/src/transports/smart_protocol.c index e5b56eaff..6f935173a 100644 --- a/src/transports/smart_protocol.c +++ b/src/transports/smart_protocol.c @@ -882,10 +882,7 @@ static int stream_thunk(void *buf, size_t size, void *data) if ((current_time - payload->last_progress_report_time) >= MIN_PROGRESS_UPDATE_INTERVAL) { payload->last_progress_report_time = current_time; - if (payload->cb(payload->pb->nr_written, payload->pb->nr_objects, payload->last_bytes, payload->cb_payload)) { - giterr_clear(); - error = GIT_EUSER; - } + error = payload->cb(payload->pb->nr_written, payload->pb->nr_objects, payload->last_bytes, payload->cb_payload); } } @@ -957,7 +954,14 @@ int git_smart__push(git_transport *transport, git_push *push) /* If progress is being reported write the final report */ if (push->transfer_progress_cb) { - push->transfer_progress_cb(push->pb->nr_written, push->pb->nr_objects, packbuilder_payload.last_bytes, push->transfer_progress_cb_payload); + error = push->transfer_progress_cb( + push->pb->nr_written, + push->pb->nr_objects, + packbuilder_payload.last_bytes, + push->transfer_progress_cb_payload); + + if (error < 0) + goto done; } if (push->status.length) { -- cgit v1.2.1 From 98020d3a73743d79c6acd380339b1d743205a86b Mon Sep 17 00:00:00 2001 From: Jacques Germishuys Date: Mon, 21 Apr 2014 10:55:37 +0200 Subject: Rename progress callback to sideband_progress --- include/git2/remote.h | 2 +- src/remote.c | 4 ++-- src/transports/smart_pkt.c | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/include/git2/remote.h b/include/git2/remote.h index d57321f03..06fc8e90d 100644 --- a/include/git2/remote.h +++ b/include/git2/remote.h @@ -457,7 +457,7 @@ struct git_remote_callbacks { * progress side-band will be passed to this function (this is * the 'counting objects' output. */ - int (*progress)(const char *str, int len, void *data); + int (*sideband_progress)(const char *str, int len, void *data); /** * Completion is called when different parts of the download diff --git a/src/remote.c b/src/remote.c index 243086bf9..17104836b 100644 --- a/src/remote.c +++ b/src/remote.c @@ -663,7 +663,7 @@ int git_remote_connect(git_remote *remote, git_direction direction) return error; if (t->set_callbacks && - (error = t->set_callbacks(t, remote->callbacks.progress, NULL, remote->callbacks.payload)) < 0) + (error = t->set_callbacks(t, remote->callbacks.sideband_progress, NULL, remote->callbacks.payload)) < 0) goto on_error; if (!remote->check_cert) @@ -1246,7 +1246,7 @@ int git_remote_set_callbacks(git_remote *remote, const git_remote_callbacks *cal if (remote->transport && remote->transport->set_callbacks) return remote->transport->set_callbacks(remote->transport, - remote->callbacks.progress, + remote->callbacks.sideband_progress, NULL, remote->callbacks.payload); diff --git a/src/transports/smart_pkt.c b/src/transports/smart_pkt.c index 2bb09c750..e9376ae6f 100644 --- a/src/transports/smart_pkt.c +++ b/src/transports/smart_pkt.c @@ -153,7 +153,7 @@ static int data_pkt(git_pkt **out, const char *line, size_t len) return 0; } -static int progress_pkt(git_pkt **out, const char *line, size_t len) +static int sideband_progress_pkt(git_pkt **out, const char *line, size_t len) { git_pkt_progress *pkt; @@ -403,7 +403,7 @@ int git_pkt_parse_line( if (*line == GIT_SIDE_BAND_DATA) ret = data_pkt(head, line, len); else if (*line == GIT_SIDE_BAND_PROGRESS) - ret = progress_pkt(head, line, len); + ret = sideband_progress_pkt(head, line, len); else if (*line == GIT_SIDE_BAND_ERROR) ret = sideband_error_pkt(head, line, len); else if (!git__prefixcmp(line, "ACK")) -- cgit v1.2.1 From 48e60ae75e78bc58aeb3c7ecf6be4653152182f4 Mon Sep 17 00:00:00 2001 From: Jacques Germishuys Date: Mon, 21 Apr 2014 11:23:29 +0200 Subject: Don't redefine the same callback types, their signatures may change --- examples/network/fetch.c | 2 +- include/git2/indexer.h | 2 +- include/git2/odb.h | 2 +- include/git2/pack.h | 2 +- include/git2/remote.h | 6 +++--- include/git2/sys/odb_backend.h | 2 +- include/git2/transport.h | 2 +- include/git2/types.h | 2 +- src/fetch.h | 2 +- src/indexer.c | 4 ++-- src/odb.c | 2 +- src/odb_pack.c | 2 +- src/pack-objects.c | 2 +- src/transports/local.c | 4 ++-- src/transports/smart.h | 2 +- src/transports/smart_protocol.c | 4 ++-- 16 files changed, 21 insertions(+), 21 deletions(-) diff --git a/examples/network/fetch.c b/examples/network/fetch.c index fdd82a1f7..03f1541a4 100644 --- a/examples/network/fetch.c +++ b/examples/network/fetch.c @@ -97,7 +97,7 @@ int fetch(git_repository *repo, int argc, char **argv) // Set up the callbacks (only update_tips for now) callbacks.update_tips = &update_cb; - callbacks.progress = &progress_cb; + callbacks.sideband_progress = &progress_cb; callbacks.credentials = cred_acquire_cb; git_remote_set_callbacks(remote, &callbacks); diff --git a/include/git2/indexer.h b/include/git2/indexer.h index e4c03ad06..d2d315e47 100644 --- a/include/git2/indexer.h +++ b/include/git2/indexer.h @@ -32,7 +32,7 @@ GIT_EXTERN(int) git_indexer_new( const char *path, unsigned int mode, git_odb *odb, - git_transfer_progress_callback progress_cb, + git_transfer_progress_cb progress_cb, void *progress_cb_payload); /** diff --git a/include/git2/odb.h b/include/git2/odb.h index c71e30648..114f6b317 100644 --- a/include/git2/odb.h +++ b/include/git2/odb.h @@ -338,7 +338,7 @@ GIT_EXTERN(int) git_odb_open_rstream(git_odb_stream **out, git_odb *db, const gi GIT_EXTERN(int) git_odb_write_pack( git_odb_writepack **out, git_odb *db, - git_transfer_progress_callback progress_cb, + git_transfer_progress_cb progress_cb, void *progress_payload); /** diff --git a/include/git2/pack.h b/include/git2/pack.h index 29c926c65..e7f060d12 100644 --- a/include/git2/pack.h +++ b/include/git2/pack.h @@ -140,7 +140,7 @@ GIT_EXTERN(int) git_packbuilder_write( git_packbuilder *pb, const char *path, unsigned int mode, - git_transfer_progress_callback progress_cb, + git_transfer_progress_cb progress_cb, void *progress_cb_payload); /** diff --git a/include/git2/remote.h b/include/git2/remote.h index 06fc8e90d..ebd83c05a 100644 --- a/include/git2/remote.h +++ b/include/git2/remote.h @@ -457,7 +457,7 @@ struct git_remote_callbacks { * progress side-band will be passed to this function (this is * the 'counting objects' output. */ - int (*sideband_progress)(const char *str, int len, void *data); + git_transport_message_cb sideband_progress; /** * Completion is called when different parts of the download @@ -469,14 +469,14 @@ struct git_remote_callbacks { * This will be called if the remote host requires * authentication in order to connect to it. */ - int (*credentials)(git_cred **cred, const char *url, const char *username_from_url, unsigned int allowed_types, void *data); + git_cred_acquire_cb credentials; /** * During the download of new data, this will be regularly * called with the current count of progress done by the * indexer. */ - int (*transfer_progress)(const git_transfer_progress *stats, void *data); + git_transfer_progress_cb transfer_progress; /** * Each time a reference is updated locally, this function diff --git a/include/git2/sys/odb_backend.h b/include/git2/sys/odb_backend.h index 81bb082e6..77fe0dd31 100644 --- a/include/git2/sys/odb_backend.h +++ b/include/git2/sys/odb_backend.h @@ -81,7 +81,7 @@ struct git_odb_backend { int (* writepack)( git_odb_writepack **, git_odb_backend *, git_odb *odb, - git_transfer_progress_callback progress_cb, void *progress_payload); + git_transfer_progress_cb progress_cb, void *progress_payload); void (* free)(git_odb_backend *); }; diff --git a/include/git2/transport.h b/include/git2/transport.h index 1665f97b3..a33146ca8 100644 --- a/include/git2/transport.h +++ b/include/git2/transport.h @@ -287,7 +287,7 @@ struct git_transport { git_transport *transport, git_repository *repo, git_transfer_progress *stats, - git_transfer_progress_callback progress_cb, + git_transfer_progress_cb progress_cb, void *progress_payload); /* Checks to see if the transport is connected */ diff --git a/include/git2/types.h b/include/git2/types.h index 9db59b16b..1b6f4cca1 100644 --- a/include/git2/types.h +++ b/include/git2/types.h @@ -241,7 +241,7 @@ typedef struct git_transfer_progress { * @param stats Structure containing information about the state of the transfer * @param payload Payload provided by caller */ -typedef int (*git_transfer_progress_callback)(const git_transfer_progress *stats, void *payload); +typedef int (*git_transfer_progress_cb)(const git_transfer_progress *stats, void *payload); /** * Opaque structure representing a submodule. diff --git a/src/fetch.h b/src/fetch.h index 9605da1b5..f66e44663 100644 --- a/src/fetch.h +++ b/src/fetch.h @@ -17,7 +17,7 @@ int git_fetch__download_pack( git_transport *t, git_repository *repo, git_transfer_progress *stats, - git_transfer_progress_callback progress_cb, + git_transfer_progress_cb progress_cb, void *progress_payload); int git_fetch_setup_walk(git_revwalk **out, git_repository *repo); diff --git a/src/indexer.c b/src/indexer.c index 346870faa..adf5ceaa7 100644 --- a/src/indexer.c +++ b/src/indexer.c @@ -45,7 +45,7 @@ struct git_indexer { unsigned int fanout[256]; git_hash_ctx hash_ctx; git_oid hash; - git_transfer_progress_callback progress_cb; + git_transfer_progress_cb progress_cb; void *progress_payload; char objbuf[8*1024]; @@ -120,7 +120,7 @@ int git_indexer_new( const char *prefix, unsigned int mode, git_odb *odb, - git_transfer_progress_callback progress_cb, + git_transfer_progress_cb progress_cb, void *progress_payload) { git_indexer *idx; diff --git a/src/odb.c b/src/odb.c index 72d150658..00740d2e2 100644 --- a/src/odb.c +++ b/src/odb.c @@ -1051,7 +1051,7 @@ int git_odb_open_rstream(git_odb_stream **stream, git_odb *db, const git_oid *oi return error; } -int git_odb_write_pack(struct git_odb_writepack **out, git_odb *db, git_transfer_progress_callback progress_cb, void *progress_payload) +int git_odb_write_pack(struct git_odb_writepack **out, git_odb *db, git_transfer_progress_cb progress_cb, void *progress_payload) { size_t i, writes = 0; int error = GIT_ERROR; diff --git a/src/odb_pack.c b/src/odb_pack.c index 9ab683882..3750da37f 100644 --- a/src/odb_pack.c +++ b/src/odb_pack.c @@ -563,7 +563,7 @@ static void pack_backend__writepack_free(struct git_odb_writepack *_writepack) static int pack_backend__writepack(struct git_odb_writepack **out, git_odb_backend *_backend, git_odb *odb, - git_transfer_progress_callback progress_cb, + git_transfer_progress_cb progress_cb, void *progress_payload) { struct pack_backend *backend; diff --git a/src/pack-objects.c b/src/pack-objects.c index c881e6d99..7e5f667f4 100644 --- a/src/pack-objects.c +++ b/src/pack-objects.c @@ -1288,7 +1288,7 @@ int git_packbuilder_write( git_packbuilder *pb, const char *path, unsigned int mode, - git_transfer_progress_callback progress_cb, + git_transfer_progress_cb progress_cb, void *progress_cb_payload) { git_indexer *indexer; diff --git a/src/transports/local.c b/src/transports/local.c index f8d511ed6..2c17e6271 100644 --- a/src/transports/local.c +++ b/src/transports/local.c @@ -472,7 +472,7 @@ on_error: typedef struct foreach_data { git_transfer_progress *stats; - git_transfer_progress_callback progress_cb; + git_transfer_progress_cb progress_cb; void *progress_payload; git_odb_writepack *writepack; } foreach_data; @@ -489,7 +489,7 @@ static int local_download_pack( git_transport *transport, git_repository *repo, git_transfer_progress *stats, - git_transfer_progress_callback progress_cb, + git_transfer_progress_cb progress_cb, void *progress_payload) { transport_local *t = (transport_local*)transport; diff --git a/src/transports/smart.h b/src/transports/smart.h index 32f0be7f2..a2b6b2a71 100644 --- a/src/transports/smart.h +++ b/src/transports/smart.h @@ -167,7 +167,7 @@ int git_smart__download_pack( git_transport *transport, git_repository *repo, git_transfer_progress *stats, - git_transfer_progress_callback progress_cb, + git_transfer_progress_cb progress_cb, void *progress_payload); /* smart.c */ diff --git a/src/transports/smart_protocol.c b/src/transports/smart_protocol.c index 6f935173a..cf67f9078 100644 --- a/src/transports/smart_protocol.c +++ b/src/transports/smart_protocol.c @@ -450,7 +450,7 @@ static int no_sideband(transport_smart *t, struct git_odb_writepack *writepack, struct network_packetsize_payload { - git_transfer_progress_callback callback; + git_transfer_progress_cb callback; void *payload; git_transfer_progress *stats; size_t last_fired_bytes; @@ -478,7 +478,7 @@ int git_smart__download_pack( git_transport *transport, git_repository *repo, git_transfer_progress *stats, - git_transfer_progress_callback transfer_progress_cb, + git_transfer_progress_cb transfer_progress_cb, void *progress_payload) { transport_smart *t = (transport_smart *)transport; -- cgit v1.2.1 From be6996b792cea7a7371e07fb4efc86e5216f4f40 Mon Sep 17 00:00:00 2001 From: Jacques Germishuys Date: Mon, 21 Apr 2014 15:25:02 +0200 Subject: It is safe to free() a NULL pointer --- src/push.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/push.c b/src/push.c index 5c8de3339..bd4d872c5 100644 --- a/src/push.c +++ b/src/push.c @@ -677,9 +677,7 @@ void git_push_status_free(push_status *status) if (status == NULL) return; - if (status->msg) - git__free(status->msg); - + git__free(status->msg); git__free(status->ref); git__free(status); } -- cgit v1.2.1 From 8b686b318b60e39ef36aae14311c07e5b72a5a5a Mon Sep 17 00:00:00 2001 From: Jacques Germishuys Date: Mon, 21 Apr 2014 15:25:19 +0200 Subject: Correct argument order of git__calloc() --- src/transports/smart_protocol.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/transports/smart_protocol.c b/src/transports/smart_protocol.c index cf67f9078..5dd6bab24 100644 --- a/src/transports/smart_protocol.c +++ b/src/transports/smart_protocol.c @@ -628,7 +628,7 @@ static int add_push_report_pkt(git_push *push, git_pkt *pkt) switch (pkt->type) { case GIT_PKT_OK: - status = git__calloc(1, sizeof(push_status)); + status = git__calloc(sizeof(push_status), 1); GITERR_CHECK_ALLOC(status); status->msg = NULL; status->ref = git__strdup(((git_pkt_ok *)pkt)->ref); -- cgit v1.2.1 From 321d377a6ad3528f38ab99dacf22a51f721fa57b Mon Sep 17 00:00:00 2001 From: Jacques Germishuys Date: Mon, 21 Apr 2014 17:02:05 +0200 Subject: Fire update_tips callback also for pushes. --- src/push.c | 46 +++++++++++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/src/push.c b/src/push.c index bd4d872c5..9943f215c 100644 --- a/src/push.c +++ b/src/push.c @@ -208,9 +208,7 @@ int git_push_update_tips( int error = 0; git_vector_foreach(&push->status, i, status) { - /* If this ref update was successful (ok, not ng), it will have an empty message */ - if (status->msg) - continue; + int fire_callback = 1; /* Find the corresponding remote ref */ fetch_spec = git_remote__matching_refspec(push->remote, status->ref); @@ -230,24 +228,38 @@ int git_push_update_tips( if (j == push->specs.length) continue; - /* Update the remote ref */ - if (git_oid_iszero(&push_spec->loid)) { - error = git_reference_lookup(&remote_ref, push->remote->repo, git_buf_cstr(&remote_ref_name)); + /* If this ref update was successful (ok, not ng), it will have an empty message */ + if (status->msg == NULL) { + /* Update the remote ref */ + if (git_oid_iszero(&push_spec->loid)) { + error = git_reference_lookup(&remote_ref, push->remote->repo, git_buf_cstr(&remote_ref_name)); - if (!error) { - if ((error = git_reference_delete(remote_ref)) < 0) { + if (error >= 0) { + error = git_reference_delete(remote_ref); git_reference_free(remote_ref); - goto on_error; } - git_reference_free(remote_ref); - } else if (error == GIT_ENOTFOUND) - giterr_clear(); - else + } else { + error = git_reference_create(NULL, push->remote->repo, + git_buf_cstr(&remote_ref_name), &push_spec->loid, 1, signature, + reflog_message ? reflog_message : "update by push"); + } + } + + if (error < 0) { + if (error != GIT_ENOTFOUND) goto on_error; - } else if ((error = git_reference_create(NULL, push->remote->repo, - git_buf_cstr(&remote_ref_name), &push_spec->loid, 1, signature, - reflog_message ? reflog_message : "update by push")) < 0) - goto on_error; + + giterr_clear(); + fire_callback = 0; + } + + if (fire_callback && push->remote->callbacks.update_tips) { + error = push->remote->callbacks.update_tips(git_buf_cstr(&remote_ref_name), + &push_spec->roid, &push_spec->loid, push->remote->callbacks.payload); + + if (error < 0) + goto on_error; + } } error = 0; -- cgit v1.2.1 From f70cfd34f5c20c447feb19c2e616315764ea7260 Mon Sep 17 00:00:00 2001 From: Jacques Germishuys Date: Mon, 21 Apr 2014 17:49:38 +0200 Subject: Verify update_tips callbacks in push test cases --- tests/online/push.c | 118 ++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 83 insertions(+), 35 deletions(-) diff --git a/tests/online/push.c b/tests/online/push.c index 716e2e993..6da27bb96 100644 --- a/tests/online/push.c +++ b/tests/online/push.c @@ -254,8 +254,7 @@ static void verify_tracking_branches(git_remote *remote, expected_ref expected_r } failed: - - if(failed) + if (failed) cl_fail(git_buf_cstr(&msg)); git_vector_foreach(&actual_refs, i, actual_ref) @@ -264,7 +263,52 @@ failed: git_vector_free(&actual_refs); git_buf_free(&msg); git_buf_free(&ref_name); - return; +} + +static void verify_update_tips_callback(git_remote *remote, expected_ref expected_refs[], size_t expected_refs_len) +{ + git_refspec *fetch_spec; + git_buf msg = GIT_BUF_INIT; + git_buf ref_name = GIT_BUF_INIT; + updated_tip *tip = NULL; + size_t i, j; + int failed = 0; + + for (i = 0; i < expected_refs_len; ++i) { + /* Convert remote reference name into tracking branch name. + * If the spec is not under refs/heads/, then skip. + */ + fetch_spec = git_remote__matching_refspec(remote, expected_refs[i].name); + if (!fetch_spec) + continue; + + cl_git_pass(git_refspec_transform(&ref_name, fetch_spec, expected_refs[i].name)); + + /* Find matching update_tip entry */ + git_vector_foreach(&_record_cbs_data.updated_tips, j, tip) { + if (!strcmp(git_buf_cstr(&ref_name), tip->name)) + break; + } + + if (j == _record_cbs_data.updated_tips.length) { + git_buf_printf(&msg, "Did not find expected updated tip entry for branch '%s'.", git_buf_cstr(&ref_name)); + failed = 1; + goto failed; + } + + if (git_oid_cmp(expected_refs[i].oid, tip->new_oid) != 0) { + git_buf_printf(&msg, "Updated tip ID does not match expected ID"); + failed = 1; + goto failed; + } + } + +failed: + if (failed) + cl_fail(git_buf_cstr(&msg)); + + git_buf_free(&ref_name); + git_buf_free(&msg); } void test_online_push__initialize(void) @@ -409,7 +453,7 @@ static void do_push( const char *refspecs[], size_t refspecs_len, push_status expected_statuses[], size_t expected_statuses_len, expected_ref expected_refs[], size_t expected_refs_len, - int expected_ret, int check_progress_cb) + int expected_ret, int check_progress_cb, int check_update_tips_cb) { git_push *push; git_push_options opts = GIT_PUSH_OPTIONS_INIT; @@ -461,6 +505,9 @@ static void do_push( cl_git_pass(git_push_update_tips(push, pusher, "test push")); verify_tracking_branches(_remote, expected_refs, expected_refs_len); + if (check_update_tips_cb) + verify_update_tips_callback(_remote, expected_refs, expected_refs_len); + git_push_free(push); git_remote_disconnect(_remote); @@ -472,7 +519,7 @@ static void do_push( /* Call push_finish() without ever calling git_push_add_refspec() */ void test_online_push__noop(void) { - do_push(NULL, 0, NULL, 0, NULL, 0, 0, 0); + do_push(NULL, 0, NULL, 0, NULL, 0, 0, 0, 1); } void test_online_push__b1(void) @@ -482,7 +529,7 @@ void test_online_push__b1(void) expected_ref exp_refs[] = { { "refs/heads/b1", &_oid_b1 } }; do_push(specs, ARRAY_SIZE(specs), exp_stats, ARRAY_SIZE(exp_stats), - exp_refs, ARRAY_SIZE(exp_refs), 0, 1); + exp_refs, ARRAY_SIZE(exp_refs), 0, 1, 1); } void test_online_push__b2(void) @@ -492,7 +539,7 @@ void test_online_push__b2(void) expected_ref exp_refs[] = { { "refs/heads/b2", &_oid_b2 } }; do_push(specs, ARRAY_SIZE(specs), exp_stats, ARRAY_SIZE(exp_stats), - exp_refs, ARRAY_SIZE(exp_refs), 0, 1); + exp_refs, ARRAY_SIZE(exp_refs), 0, 1, 1); } void test_online_push__b3(void) @@ -502,7 +549,7 @@ void test_online_push__b3(void) expected_ref exp_refs[] = { { "refs/heads/b3", &_oid_b3 } }; do_push(specs, ARRAY_SIZE(specs), exp_stats, ARRAY_SIZE(exp_stats), - exp_refs, ARRAY_SIZE(exp_refs), 0, 1); + exp_refs, ARRAY_SIZE(exp_refs), 0, 1, 1); } void test_online_push__b4(void) @@ -512,7 +559,7 @@ void test_online_push__b4(void) expected_ref exp_refs[] = { { "refs/heads/b4", &_oid_b4 } }; do_push(specs, ARRAY_SIZE(specs), exp_stats, ARRAY_SIZE(exp_stats), - exp_refs, ARRAY_SIZE(exp_refs), 0, 1); + exp_refs, ARRAY_SIZE(exp_refs), 0, 1, 1); } void test_online_push__b5(void) @@ -522,13 +569,13 @@ void test_online_push__b5(void) expected_ref exp_refs[] = { { "refs/heads/b5", &_oid_b5 } }; do_push(specs, ARRAY_SIZE(specs), exp_stats, ARRAY_SIZE(exp_stats), - exp_refs, ARRAY_SIZE(exp_refs), 0, 1); + exp_refs, ARRAY_SIZE(exp_refs), 0, 1, 1); } void test_online_push__b5_cancel(void) { const char *specs[] = { "refs/heads/b5:refs/heads/b5" }; - do_push(specs, ARRAY_SIZE(specs), NULL, 0, NULL, 0, GIT_EUSER, 1); + do_push(specs, ARRAY_SIZE(specs), NULL, 0, NULL, 0, GIT_EUSER, 1, 1); } void test_online_push__multi(void) @@ -559,7 +606,7 @@ void test_online_push__multi(void) }; do_push(specs, ARRAY_SIZE(specs), exp_stats, ARRAY_SIZE(exp_stats), - exp_refs, ARRAY_SIZE(exp_refs), 0, 1); + exp_refs, ARRAY_SIZE(exp_refs), 0, 1, 1); cl_git_pass(git_reflog_read(&log, _repo, "refs/remotes/test/b1")); entry = git_reflog_entry_byindex(log, 0); @@ -586,10 +633,10 @@ void test_online_push__implicit_tgt(void) do_push(specs1, ARRAY_SIZE(specs1), exp_stats1, ARRAY_SIZE(exp_stats1), - exp_refs1, ARRAY_SIZE(exp_refs1), 0, 1); + exp_refs1, ARRAY_SIZE(exp_refs1), 0, 1, 1); do_push(specs2, ARRAY_SIZE(specs2), exp_stats2, ARRAY_SIZE(exp_stats2), - exp_refs2, ARRAY_SIZE(exp_refs2), 0, 0); + exp_refs2, ARRAY_SIZE(exp_refs2), 0, 0, 0); } void test_online_push__fast_fwd(void) @@ -611,19 +658,19 @@ void test_online_push__fast_fwd(void) do_push(specs_init, ARRAY_SIZE(specs_init), exp_stats_init, ARRAY_SIZE(exp_stats_init), - exp_refs_init, ARRAY_SIZE(exp_refs_init), 0, 1); + exp_refs_init, ARRAY_SIZE(exp_refs_init), 0, 1, 1); do_push(specs_ff, ARRAY_SIZE(specs_ff), exp_stats_ff, ARRAY_SIZE(exp_stats_ff), - exp_refs_ff, ARRAY_SIZE(exp_refs_ff), 0, 0); + exp_refs_ff, ARRAY_SIZE(exp_refs_ff), 0, 0, 0); do_push(specs_reset, ARRAY_SIZE(specs_reset), exp_stats_init, ARRAY_SIZE(exp_stats_init), - exp_refs_init, ARRAY_SIZE(exp_refs_init), 0, 0); + exp_refs_init, ARRAY_SIZE(exp_refs_init), 0, 0, 0); do_push(specs_ff_force, ARRAY_SIZE(specs_ff_force), exp_stats_ff, ARRAY_SIZE(exp_stats_ff), - exp_refs_ff, ARRAY_SIZE(exp_refs_ff), 0, 0); + exp_refs_ff, ARRAY_SIZE(exp_refs_ff), 0, 0, 0); } void test_online_push__tag_commit(void) @@ -633,7 +680,7 @@ void test_online_push__tag_commit(void) expected_ref exp_refs[] = { { "refs/tags/tag-commit", &_tag_commit } }; do_push(specs, ARRAY_SIZE(specs), exp_stats, ARRAY_SIZE(exp_stats), - exp_refs, ARRAY_SIZE(exp_refs), 0, 1); + exp_refs, ARRAY_SIZE(exp_refs), 0, 1, 1); } void test_online_push__tag_tree(void) @@ -643,7 +690,7 @@ void test_online_push__tag_tree(void) expected_ref exp_refs[] = { { "refs/tags/tag-tree", &_tag_tree } }; do_push(specs, ARRAY_SIZE(specs), exp_stats, ARRAY_SIZE(exp_stats), - exp_refs, ARRAY_SIZE(exp_refs), 0, 1); + exp_refs, ARRAY_SIZE(exp_refs), 0, 1, 1); } void test_online_push__tag_blob(void) @@ -653,7 +700,7 @@ void test_online_push__tag_blob(void) expected_ref exp_refs[] = { { "refs/tags/tag-blob", &_tag_blob } }; do_push(specs, ARRAY_SIZE(specs), exp_stats, ARRAY_SIZE(exp_stats), - exp_refs, ARRAY_SIZE(exp_refs), 0, 1); + exp_refs, ARRAY_SIZE(exp_refs), 0, 1, 1); } void test_online_push__tag_lightweight(void) @@ -663,7 +710,7 @@ void test_online_push__tag_lightweight(void) expected_ref exp_refs[] = { { "refs/tags/tag-lightweight", &_tag_lightweight } }; do_push(specs, ARRAY_SIZE(specs), exp_stats, ARRAY_SIZE(exp_stats), - exp_refs, ARRAY_SIZE(exp_refs), 0, 1); + exp_refs, ARRAY_SIZE(exp_refs), 0, 1, 1); } void test_online_push__tag_to_tag(void) @@ -673,7 +720,7 @@ void test_online_push__tag_to_tag(void) expected_ref exp_refs[] = { { "refs/tags/tag-tag", &_tag_tag } }; do_push(specs, ARRAY_SIZE(specs), exp_stats, ARRAY_SIZE(exp_stats), - exp_refs, ARRAY_SIZE(exp_refs), 0, 0); + exp_refs, ARRAY_SIZE(exp_refs), 0, 0, 0); } void test_online_push__force(void) @@ -690,16 +737,17 @@ void test_online_push__force(void) do_push(specs1, ARRAY_SIZE(specs1), exp_stats1, ARRAY_SIZE(exp_stats1), - exp_refs1, ARRAY_SIZE(exp_refs1), 0, 1); + exp_refs1, ARRAY_SIZE(exp_refs1), 0, 1, 1); do_push(specs2, ARRAY_SIZE(specs2), NULL, 0, - exp_refs1, ARRAY_SIZE(exp_refs1), GIT_ENONFASTFORWARD, 0); + exp_refs1, ARRAY_SIZE(exp_refs1), GIT_ENONFASTFORWARD, 0, 0); /* Non-fast-forward update with force should pass. */ + record_callbacks_data_clear(&_record_cbs_data); do_push(specs2_force, ARRAY_SIZE(specs2_force), exp_stats2_force, ARRAY_SIZE(exp_stats2_force), - exp_refs2_force, ARRAY_SIZE(exp_refs2_force), 0, 1); + exp_refs2_force, ARRAY_SIZE(exp_refs2_force), 0, 1, 1); } void test_online_push__delete(void) @@ -730,7 +778,7 @@ void test_online_push__delete(void) do_push(specs1, ARRAY_SIZE(specs1), exp_stats1, ARRAY_SIZE(exp_stats1), - exp_refs1, ARRAY_SIZE(exp_refs1), 0, 1); + exp_refs1, ARRAY_SIZE(exp_refs1), 0, 1, 1); /* When deleting a non-existent branch, the git client sends zero for both * the old and new commit id. This should succeed on the server with the @@ -740,23 +788,23 @@ void test_online_push__delete(void) */ do_push(specs_del_fake, ARRAY_SIZE(specs_del_fake), exp_stats_fake, 1, - exp_refs1, ARRAY_SIZE(exp_refs1), 0, 0); + exp_refs1, ARRAY_SIZE(exp_refs1), 0, 0, 0); do_push(specs_del_fake_force, ARRAY_SIZE(specs_del_fake_force), exp_stats_fake, 1, - exp_refs1, ARRAY_SIZE(exp_refs1), 0, 0); + exp_refs1, ARRAY_SIZE(exp_refs1), 0, 0, 0); /* Delete one of the pushed branches. */ do_push(specs_delete, ARRAY_SIZE(specs_delete), exp_stats_delete, ARRAY_SIZE(exp_stats_delete), - exp_refs_delete, ARRAY_SIZE(exp_refs_delete), 0, 0); + exp_refs_delete, ARRAY_SIZE(exp_refs_delete), 0, 0, 0); /* Re-push branches and retry delete with force. */ do_push(specs1, ARRAY_SIZE(specs1), exp_stats1, ARRAY_SIZE(exp_stats1), - exp_refs1, ARRAY_SIZE(exp_refs1), 0, 0); + exp_refs1, ARRAY_SIZE(exp_refs1), 0, 0, 0); do_push(specs_delete_force, ARRAY_SIZE(specs_delete_force), exp_stats_delete, ARRAY_SIZE(exp_stats_delete), - exp_refs_delete, ARRAY_SIZE(exp_refs_delete), 0, 0); + exp_refs_delete, ARRAY_SIZE(exp_refs_delete), 0, 0, 0); } void test_online_push__bad_refspecs(void) @@ -790,11 +838,11 @@ void test_online_push__expressions(void) /* TODO: Find a more precise way of checking errors than a exit code of -1. */ do_push(specs_left_expr, ARRAY_SIZE(specs_left_expr), NULL, 0, - NULL, 0, -1, 0); + NULL, 0, -1, 0, 0); do_push(specs_right_expr, ARRAY_SIZE(specs_right_expr), exp_stats_right_expr, ARRAY_SIZE(exp_stats_right_expr), - NULL, 0, 0, 1); + NULL, 0, 0, 1, 1); } void test_online_push__notes(void) @@ -814,7 +862,7 @@ void test_online_push__notes(void) do_push(specs, ARRAY_SIZE(specs), exp_stats, ARRAY_SIZE(exp_stats), - exp_refs, ARRAY_SIZE(exp_refs), 0, 1); + exp_refs, ARRAY_SIZE(exp_refs), 0, 1, 1); git_signature_free(signature); } -- cgit v1.2.1