Browse Source

checkout,clone: check return value of create_symref

It's unlikely that we would fail to create or update a
symbolic ref (especially HEAD), but if we do, we should
notice and complain. Note that there's no need to give more
details in our error message; create_symref will already
have done so.

While we're here, let's also fix a minor memory leak in
clone.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Jeff King 9 years ago committed by Junio C Hamano
parent
commit
4be49d7568
  1. 3
      builtin/checkout.c
  2. 11
      builtin/clone.c
  3. 6
      t/t2011-checkout-invalid-head.sh

3
builtin/checkout.c

@ -661,7 +661,8 @@ static void update_refs_for_switch(const struct checkout_opts *opts, @@ -661,7 +661,8 @@ static void update_refs_for_switch(const struct checkout_opts *opts,
describe_detached_head(_("HEAD is now at"), new->commit);
}
} else if (new->path) { /* Switch branches. */
create_symref("HEAD", new->path, msg.buf);
if (create_symref("HEAD", new->path, msg.buf) < 0)
die("unable to update HEAD");
if (!opts->quiet) {
if (old->path && !strcmp(new->path, old->path)) {
if (opts->new_branch_force)

11
builtin/clone.c

@ -636,9 +636,11 @@ static void update_remote_refs(const struct ref *refs, @@ -636,9 +636,11 @@ static void update_remote_refs(const struct ref *refs,
struct strbuf head_ref = STRBUF_INIT;
strbuf_addstr(&head_ref, branch_top);
strbuf_addstr(&head_ref, "HEAD");
create_symref(head_ref.buf,
remote_head_points_at->peer_ref->name,
msg);
if (create_symref(head_ref.buf,
remote_head_points_at->peer_ref->name,
msg) < 0)
die("unable to update %s", head_ref.buf);
strbuf_release(&head_ref);
}
}

@ -648,7 +650,8 @@ static void update_head(const struct ref *our, const struct ref *remote, @@ -648,7 +650,8 @@ static void update_head(const struct ref *our, const struct ref *remote,
const char *head;
if (our && skip_prefix(our->name, "refs/heads/", &head)) {
/* Local default branch link */
create_symref("HEAD", our->name, NULL);
if (create_symref("HEAD", our->name, NULL) < 0)
die("unable to update HEAD");
if (!option_bare) {
update_ref(msg, "HEAD", our->old_oid.hash, NULL, 0,
UPDATE_REFS_DIE_ON_ERR);

6
t/t2011-checkout-invalid-head.sh

@ -19,4 +19,10 @@ test_expect_success 'checkout master from invalid HEAD' ' @@ -19,4 +19,10 @@ test_expect_success 'checkout master from invalid HEAD' '
git checkout master --
'

test_expect_success 'checkout notices failure to lock HEAD' '
test_when_finished "rm -f .git/HEAD.lock" &&
>.git/HEAD.lock &&
test_must_fail git checkout -b other
'

test_done

Loading…
Cancel
Save