Merge pull request #2955 from git-up/update_tips_fixes Update tips fixes
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
diff --git a/src/push.c b/src/push.c
index c6a93ba..d4171bb 100644
--- a/src/push.c
+++ b/src/push.c
@@ -180,6 +180,10 @@ int git_push_update_tips(git_push *push)
git_vector_foreach(&push->status, i, status) {
int fire_callback = 1;
+ /* Skip unsuccessful updates which have non-empty messages */
+ if (status->msg)
+ continue;
+
/* Find the corresponding remote ref */
fetch_spec = git_remote__matching_refspec(push->remote, status->ref);
if (!fetch_spec)
@@ -198,21 +202,18 @@ int git_push_update_tips(git_push *push)
if (j == push->specs.length)
continue;
- /* 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));
+ /* 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 >= 0) {
- error = git_reference_delete(remote_ref);
- git_reference_free(remote_ref);
- }
- } else {
- error = git_reference_create(NULL, push->remote->repo,
- git_buf_cstr(&remote_ref_name), &push_spec->loid, 1,
- "update by push");
+ if (error >= 0) {
+ error = git_reference_delete(remote_ref);
+ git_reference_free(remote_ref);
}
+ } else {
+ error = git_reference_create(NULL, push->remote->repo,
+ git_buf_cstr(&remote_ref_name), &push_spec->loid, 1,
+ "update by push");
}
if (error < 0) {
diff --git a/src/remote.c b/src/remote.c
index bdb4b31..ac7c43c 100644
--- a/src/remote.c
+++ b/src/remote.c
@@ -2329,6 +2329,10 @@ int git_remote_upload(git_remote *remote, const git_strarray *refspecs, const gi
(error = git_remote_connect(remote, GIT_DIRECTION_PUSH)) < 0)
goto cleanup;
+ free_refspecs(&remote->active_refspecs);
+ if (dwim_refspecs(&remote->active_refspecs, &remote->refspecs, &remote->refs) < 0)
+ goto cleanup;
+
if (remote->push) {
git_push_free(remote->push);
remote->push = NULL;