diff options
author | Junio C Hamano <gitster@pobox.com> | 2007-10-30 21:38:04 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2007-10-30 21:38:04 -0700 |
commit | 7ae4dd05725e1613375e03f206077959853d6b51 (patch) | |
tree | 3f22627155ce51b69fe6a99e3c9340490ec3e98e /send-pack.c | |
parent | 7e9a4645d1a113d4390f5198a4212721cc9bf3dd (diff) | |
parent | 09fba7a59d38d1cafaf33eadaf1d409c4113b30c (diff) | |
download | git-7ae4dd05725e1613375e03f206077959853d6b51.tar.gz git-7ae4dd05725e1613375e03f206077959853d6b51.tar.xz |
Merge branch 'jk/send-pack' into HEAD
* jk/send-pack:
t5516: test update of local refs on push
send-pack: don't update tracking refs on error
Diffstat (limited to 'send-pack.c')
-rw-r--r-- | send-pack.c | 50 |
1 files changed, 34 insertions, 16 deletions
diff --git a/send-pack.c b/send-pack.c index e9b9a39f4..25053d2c2 100644 --- a/send-pack.c +++ b/send-pack.c @@ -178,6 +178,35 @@ static int receive_status(int in) return ret; } +static void update_tracking_ref(struct remote *remote, struct ref *ref) +{ + struct refspec rs; + int will_delete_ref; + + rs.src = ref->name; + rs.dst = NULL; + + if (!ref->peer_ref) + return; + + will_delete_ref = is_null_sha1(ref->peer_ref->new_sha1); + + if (!will_delete_ref && + !hashcmp(ref->old_sha1, ref->peer_ref->new_sha1)) + return; + + if (!remote_find_tracking(remote, &rs)) { + fprintf(stderr, "updating local tracking ref '%s'\n", rs.dst); + if (is_null_sha1(ref->peer_ref->new_sha1)) { + if (delete_ref(rs.dst, NULL)) + error("Failed to delete"); + } else + update_ref("update by push", rs.dst, + ref->new_sha1, NULL, 0, 0); + free(rs.dst); + } +} + static int send_pack(int in, int out, struct remote *remote, int nr_refspec, char **refspec) { struct ref *ref; @@ -306,22 +335,6 @@ static int send_pack(int in, int out, struct remote *remote, int nr_refspec, cha fprintf(stderr, "\n from %s\n to %s\n", old_hex, new_hex); } - if (remote && !dry_run) { - struct refspec rs; - rs.src = ref->name; - rs.dst = NULL; - if (!remote_find_tracking(remote, &rs)) { - fprintf(stderr, " Also local %s\n", rs.dst); - if (will_delete_ref) { - if (delete_ref(rs.dst, NULL)) { - error("Failed to delete"); - } - } else - update_ref("update by push", rs.dst, - ref->new_sha1, NULL, 0, 0); - free(rs.dst); - } - } } packet_flush(out); @@ -334,6 +347,11 @@ static int send_pack(int in, int out, struct remote *remote, int nr_refspec, cha ret = -4; } + if (!dry_run && remote && ret == 0) { + for (ref = remote_refs; ref; ref = ref->next) + update_tracking_ref(remote, ref); + } + if (!new_refs && ret == 0) fprintf(stderr, "Everything up-to-date\n"); return ret; |