send-pack: check ref->status before updating tracking refs
authorJeff King <peff@peff.net>
Sat, 17 Nov 2007 12:55:15 +0000 (07:55 -0500)
committerJunio C Hamano <gitster@pobox.com>
Sat, 17 Nov 2007 20:10:50 +0000 (12:10 -0800)
Previously, we manually checked the 'NONE' and 'UPTODATE'
conditions. Now that we have ref->status, we can easily
say "only update if we pushed successfully".

This adds a test for and fixes a regression introduced in
ed31df31 where deleted refs did not have their tracking
branches removed. This was due to a bogus per-ref error test
that is superseded by the more accurate ref->status flag.

Signed-off-by: Jeff King <peff@peff.net>
Completely-Acked-By: Alex "Sleepy" Riesen <raa.lkml@gmail.com>
Acked-by: Daniel Barkalow <barkalow@iabervon.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin-send-pack.c
t/t5404-tracking-branches.sh

index dafc02bcb070a1781d318c6af37adc5042fbb416..3f86acb315165c495f121c520c5367583db42d11 100644 (file)
@@ -180,24 +180,17 @@ static int receive_status(int in)
 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)
+       if (ref->status != REF_STATUS_OK)
                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;
+       rs.src = ref->name;
+       rs.dst = NULL;
 
        if (!remote_find_tracking(remote, &rs)) {
                if (args.verbose)
                        fprintf(stderr, "updating local tracking ref '%s'\n", rs.dst);
-               if (is_null_sha1(ref->peer_ref->new_sha1)) {
+               if (ref->deletion) {
                        if (delete_ref(rs.dst, NULL))
                                error("Failed to delete");
                } else
@@ -444,8 +437,7 @@ static int do_send_pack(int in, int out, struct remote *remote, const char *dest
 
        if (!args.dry_run && remote) {
                for (ref = remote_refs; ref; ref = ref->next)
-                       if (!is_null_sha1(ref->new_sha1))
-                               update_tracking_ref(remote, ref);
+                       update_tracking_ref(remote, ref);
        }
 
        if (!new_refs)
index 799e47e5ba9d3cb068528813113fbfb736107ce4..1493a92c06d041e502bcc08a1cee95e6758f1775 100755 (executable)
@@ -45,4 +45,9 @@ test_expect_success 'check tracking branches not updated for failed refs' '
        test "$(git rev-parse origin/b2)" = "$b2"
 '
 
+test_expect_success 'deleted branches have their tracking branches removed' '
+       git push origin :b1 &&
+       test "$(git rev-parse origin/b1)" = "origin/b1"
+'
+
 test_done