fast-import: add support to delete refs

Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Felipe Contreras 2014-04-20 13:59:27 -05:00 committed by Junio C Hamano
parent 9193f74235
commit 4ee1b225b9
3 changed files with 31 additions and 3 deletions

View File

@ -483,6 +483,9 @@ Marks must be declared (via `mark`) before they can be used.
* Any valid Git SHA-1 expression that resolves to a commit. See * Any valid Git SHA-1 expression that resolves to a commit. See
``SPECIFYING REVISIONS'' in linkgit:gitrevisions[7] for details. ``SPECIFYING REVISIONS'' in linkgit:gitrevisions[7] for details.
* The special null SHA-1 (40 zeros) specifies that the branch is to be
removed.
The special case of restarting an incremental import from the The special case of restarting an incremental import from the
current branch value should be written as: current branch value should be written as:
---- ----

View File

@ -248,6 +248,7 @@ struct branch {
uintmax_t last_commit; uintmax_t last_commit;
uintmax_t num_notes; uintmax_t num_notes;
unsigned active : 1; unsigned active : 1;
unsigned delete : 1;
unsigned pack_id : PACK_ID_BITS; unsigned pack_id : PACK_ID_BITS;
unsigned char sha1[20]; unsigned char sha1[20];
}; };
@ -1681,10 +1682,13 @@ static int update_branch(struct branch *b)
struct ref_lock *lock; struct ref_lock *lock;
unsigned char old_sha1[20]; unsigned char old_sha1[20];
if (is_null_sha1(b->sha1))
return 0;
if (read_ref(b->name, old_sha1)) if (read_ref(b->name, old_sha1))
hashclr(old_sha1); hashclr(old_sha1);
if (is_null_sha1(b->sha1)) {
if (b->delete)
delete_ref(b->name, old_sha1, 0);
return 0;
}
lock = lock_any_ref_for_update(b->name, old_sha1, 0, NULL); lock = lock_any_ref_for_update(b->name, old_sha1, 0, NULL);
if (!lock) if (!lock)
return error("Unable to lock %s", b->name); return error("Unable to lock %s", b->name);
@ -2611,8 +2615,11 @@ static int parse_from(struct branch *b)
free(buf); free(buf);
} else } else
parse_from_existing(b); parse_from_existing(b);
} else if (!get_sha1(from, b->sha1)) } else if (!get_sha1(from, b->sha1)) {
parse_from_existing(b); parse_from_existing(b);
if (is_null_sha1(b->sha1))
b->delete = 1;
}
else else
die("Invalid ref name or SHA1 expression: %s", from); die("Invalid ref name or SHA1 expression: %s", from);

View File

@ -2999,4 +2999,22 @@ test_expect_success 'T: ls root tree' '
test_cmp expect actual test_cmp expect actual
' '
test_expect_success 'T: delete branch' '
git branch to-delete &&
git fast-import <<-EOF &&
reset refs/heads/to-delete
from 0000000000000000000000000000000000000000
EOF
test_must_fail git rev-parse --verify refs/heads/to-delete
'
test_expect_success 'T: empty reset doesnt delete branch' '
git branch not-to-delete &&
git fast-import <<-EOF &&
reset refs/heads/not-to-delete
EOF
git show-ref &&
git rev-parse --verify refs/heads/not-to-delete
'
test_done test_done