зеркало из https://github.com/microsoft/git.git
send-pack: check ref->status before updating tracking refs
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>
This commit is contained in:
Родитель
8736a84890
Коммит
1f0e2a1a65
|
@ -180,24 +180,17 @@ static int receive_status(int in)
|
||||||
static void update_tracking_ref(struct remote *remote, struct ref *ref)
|
static void update_tracking_ref(struct remote *remote, struct ref *ref)
|
||||||
{
|
{
|
||||||
struct refspec rs;
|
struct refspec rs;
|
||||||
int will_delete_ref;
|
|
||||||
|
if (ref->status != REF_STATUS_OK)
|
||||||
|
return;
|
||||||
|
|
||||||
rs.src = ref->name;
|
rs.src = ref->name;
|
||||||
rs.dst = NULL;
|
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)) {
|
if (!remote_find_tracking(remote, &rs)) {
|
||||||
if (args.verbose)
|
if (args.verbose)
|
||||||
fprintf(stderr, "updating local tracking ref '%s'\n", rs.dst);
|
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))
|
if (delete_ref(rs.dst, NULL))
|
||||||
error("Failed to delete");
|
error("Failed to delete");
|
||||||
} else
|
} else
|
||||||
|
@ -444,7 +437,6 @@ static int do_send_pack(int in, int out, struct remote *remote, const char *dest
|
||||||
|
|
||||||
if (!args.dry_run && remote) {
|
if (!args.dry_run && remote) {
|
||||||
for (ref = remote_refs; ref; ref = ref->next)
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,4 +45,9 @@ test_expect_success 'check tracking branches not updated for failed refs' '
|
||||||
test "$(git rev-parse origin/b2)" = "$b2"
|
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
|
test_done
|
||||||
|
|
Загрузка…
Ссылка в новой задаче