Skip to content

Commit

Permalink
fast-import: add support to delete refs
Browse files Browse the repository at this point in the history
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Felipe Contreras authored and Junio C Hamano committed Apr 21, 2014
1 parent 9193f74 commit 4ee1b22
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 3 deletions.
3 changes: 3 additions & 0 deletions Documentation/git-fast-import.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
``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
current branch value should be written as:
----
Expand Down
13 changes: 10 additions & 3 deletions fast-import.c
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,7 @@ struct branch {
uintmax_t last_commit;
uintmax_t num_notes;
unsigned active : 1;
unsigned delete : 1;
unsigned pack_id : PACK_ID_BITS;
unsigned char sha1[20];
};
Expand Down Expand Up @@ -1681,10 +1682,13 @@ static int update_branch(struct branch *b)
struct ref_lock *lock;
unsigned char old_sha1[20];

if (is_null_sha1(b->sha1))
return 0;
if (read_ref(b->name, 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);
if (!lock)
return error("Unable to lock %s", b->name);
Expand Down Expand Up @@ -2611,8 +2615,11 @@ static int parse_from(struct branch *b)
free(buf);
} else
parse_from_existing(b);
} else if (!get_sha1(from, b->sha1))
} else if (!get_sha1(from, b->sha1)) {
parse_from_existing(b);
if (is_null_sha1(b->sha1))
b->delete = 1;
}
else
die("Invalid ref name or SHA1 expression: %s", from);

Expand Down
18 changes: 18 additions & 0 deletions t/t9300-fast-import.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2999,4 +2999,22 @@ test_expect_success 'T: ls root tree' '
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

0 comments on commit 4ee1b22

Please sign in to comment.