mirror of
https://github.com/git/git.git
synced 2024-10-30 05:47:53 +01:00
Merge branch 'mb/fast-import-delete-root'
An attempt to remove the entire tree in the "git fast-import" input stream caused it to misbehave. * mb/fast-import-delete-root: fast-import: fix segfault in store_tree() t9300: test filedelete command
This commit is contained in:
commit
73da5a1e85
2 changed files with 109 additions and 1 deletions
|
@ -1422,7 +1422,7 @@ static void mktree(struct tree_content *t, int v, struct strbuf *b)
|
||||||
|
|
||||||
static void store_tree(struct tree_entry *root)
|
static void store_tree(struct tree_entry *root)
|
||||||
{
|
{
|
||||||
struct tree_content *t = root->tree;
|
struct tree_content *t;
|
||||||
unsigned int i, j, del;
|
unsigned int i, j, del;
|
||||||
struct last_object lo = { STRBUF_INIT, 0, 0, /* no_swap */ 1 };
|
struct last_object lo = { STRBUF_INIT, 0, 0, /* no_swap */ 1 };
|
||||||
struct object_entry *le = NULL;
|
struct object_entry *le = NULL;
|
||||||
|
@ -1430,6 +1430,10 @@ static void store_tree(struct tree_entry *root)
|
||||||
if (!is_null_sha1(root->versions[1].sha1))
|
if (!is_null_sha1(root->versions[1].sha1))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (!root->tree)
|
||||||
|
load_tree(root);
|
||||||
|
t = root->tree;
|
||||||
|
|
||||||
for (i = 0; i < t->entry_count; i++) {
|
for (i = 0; i < t->entry_count; i++) {
|
||||||
if (t->entries[i]->tree)
|
if (t->entries[i]->tree)
|
||||||
store_tree(t->entries[i]);
|
store_tree(t->entries[i]);
|
||||||
|
|
|
@ -3017,4 +3017,108 @@ test_expect_success 'T: empty reset doesnt delete branch' '
|
||||||
git rev-parse --verify refs/heads/not-to-delete
|
git rev-parse --verify refs/heads/not-to-delete
|
||||||
'
|
'
|
||||||
|
|
||||||
|
###
|
||||||
|
### series U (filedelete)
|
||||||
|
###
|
||||||
|
|
||||||
|
cat >input <<INPUT_END
|
||||||
|
commit refs/heads/U
|
||||||
|
committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
|
||||||
|
data <<COMMIT
|
||||||
|
test setup
|
||||||
|
COMMIT
|
||||||
|
M 100644 inline hello.c
|
||||||
|
data <<BLOB
|
||||||
|
blob 1
|
||||||
|
BLOB
|
||||||
|
M 100644 inline good/night.txt
|
||||||
|
data <<BLOB
|
||||||
|
sleep well
|
||||||
|
BLOB
|
||||||
|
M 100644 inline good/bye.txt
|
||||||
|
data <<BLOB
|
||||||
|
au revoir
|
||||||
|
BLOB
|
||||||
|
|
||||||
|
INPUT_END
|
||||||
|
|
||||||
|
test_expect_success 'U: initialize for U tests' '
|
||||||
|
git fast-import <input
|
||||||
|
'
|
||||||
|
|
||||||
|
cat >input <<INPUT_END
|
||||||
|
commit refs/heads/U
|
||||||
|
committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
|
||||||
|
data <<COMMIT
|
||||||
|
delete good/night.txt
|
||||||
|
COMMIT
|
||||||
|
from refs/heads/U^0
|
||||||
|
D good/night.txt
|
||||||
|
|
||||||
|
INPUT_END
|
||||||
|
|
||||||
|
test_expect_success 'U: filedelete file succeeds' '
|
||||||
|
git fast-import <input
|
||||||
|
'
|
||||||
|
|
||||||
|
cat >expect <<EOF
|
||||||
|
:100644 000000 2907ebb4bf85d91bf0716bb3bd8a68ef48d6da76 0000000000000000000000000000000000000000 D good/night.txt
|
||||||
|
EOF
|
||||||
|
|
||||||
|
git diff-tree -M -r U^1 U >actual
|
||||||
|
|
||||||
|
test_expect_success 'U: validate file delete result' '
|
||||||
|
compare_diff_raw expect actual
|
||||||
|
'
|
||||||
|
|
||||||
|
cat >input <<INPUT_END
|
||||||
|
commit refs/heads/U
|
||||||
|
committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
|
||||||
|
data <<COMMIT
|
||||||
|
delete good dir
|
||||||
|
COMMIT
|
||||||
|
from refs/heads/U^0
|
||||||
|
D good
|
||||||
|
|
||||||
|
INPUT_END
|
||||||
|
|
||||||
|
test_expect_success 'U: filedelete directory succeeds' '
|
||||||
|
git fast-import <input
|
||||||
|
'
|
||||||
|
|
||||||
|
cat >expect <<EOF
|
||||||
|
:100644 000000 69cb75792f55123d8389c156b0b41c2ff00ed507 0000000000000000000000000000000000000000 D good/bye.txt
|
||||||
|
EOF
|
||||||
|
|
||||||
|
git diff-tree -M -r U^1 U >actual
|
||||||
|
|
||||||
|
test_expect_success 'U: validate directory delete result' '
|
||||||
|
compare_diff_raw expect actual
|
||||||
|
'
|
||||||
|
|
||||||
|
cat >input <<INPUT_END
|
||||||
|
commit refs/heads/U
|
||||||
|
committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
|
||||||
|
data <<COMMIT
|
||||||
|
must succeed
|
||||||
|
COMMIT
|
||||||
|
from refs/heads/U^0
|
||||||
|
D ""
|
||||||
|
|
||||||
|
INPUT_END
|
||||||
|
|
||||||
|
test_expect_success 'U: filedelete root succeeds' '
|
||||||
|
git fast-import <input
|
||||||
|
'
|
||||||
|
|
||||||
|
cat >expect <<EOF
|
||||||
|
:100644 000000 c18147dc648481eeb65dc5e66628429a64843327 0000000000000000000000000000000000000000 D hello.c
|
||||||
|
EOF
|
||||||
|
|
||||||
|
git diff-tree -M -r U^1 U >actual
|
||||||
|
|
||||||
|
test_expect_success 'U: validate root delete result' '
|
||||||
|
compare_diff_raw expect actual
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
|
Loading…
Reference in a new issue