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
This commit is contained in:
commit
7ae4dd0572
50
send-pack.c
50
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;
|
||||
|
@ -254,4 +254,32 @@ test_expect_success 'push with dry-run' '
|
||||
check_push_result $old_commit heads/master
|
||||
'
|
||||
|
||||
test_expect_success 'push updates local refs' '
|
||||
|
||||
rm -rf parent child &&
|
||||
mkdir parent && cd parent && git init &&
|
||||
echo one >foo && git add foo && git commit -m one &&
|
||||
cd .. &&
|
||||
git clone parent child && cd child &&
|
||||
echo two >foo && git commit -a -m two &&
|
||||
git push &&
|
||||
test $(git rev-parse master) = $(git rev-parse remotes/origin/master)
|
||||
|
||||
'
|
||||
|
||||
test_expect_success 'push does not update local refs on failure' '
|
||||
|
||||
rm -rf parent child &&
|
||||
mkdir parent && cd parent && git init &&
|
||||
echo one >foo && git add foo && git commit -m one &&
|
||||
echo exit 1 >.git/hooks/pre-receive &&
|
||||
chmod +x .git/hooks/pre-receive &&
|
||||
cd .. &&
|
||||
git clone parent child && cd child &&
|
||||
echo two >foo && git commit -a -m two || exit 1
|
||||
git push && exit 1
|
||||
test $(git rev-parse master) != $(git rev-parse remotes/origin/master)
|
||||
|
||||
'
|
||||
|
||||
test_done
|
||||
|
Loading…
Reference in New Issue
Block a user