зеркало из https://github.com/microsoft/git.git
pack-redundant: fix crash when one packfile in repo
Command `git pack-redundant --all` will crash if there is only one packfile in the repository. This is because, if there is only one packfile in local_packs, `cmp_local_packs` will do nothing and will leave `pl->unique_objects` as uninitialized. Also add testcases for repository with no packfile and one packfile in t5323. Reported-by: Daniel C. Klauer <daniel.c.klauer@web.de> Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
898f80736c
Коммит
0696232390
|
@ -473,6 +473,12 @@ static void cmp_local_packs(void)
|
|||
{
|
||||
struct pack_list *subset, *pl = local_packs;
|
||||
|
||||
/* only one packfile */
|
||||
if (!pl->next) {
|
||||
llist_init(&pl->unique_objects);
|
||||
return;
|
||||
}
|
||||
|
||||
while ((subset = pl)) {
|
||||
while ((subset = subset->next))
|
||||
cmp_two_packs(pl, subset);
|
||||
|
|
|
@ -112,6 +112,45 @@ test_expect_success 'setup master repo' '
|
|||
create_commits_in "$master_repo" A B C D E F G H I J K L M N O P Q R
|
||||
'
|
||||
|
||||
test_expect_success 'master: pack-redundant works with no packfile' '
|
||||
(
|
||||
cd "$master_repo" &&
|
||||
cat >expect <<-EOF &&
|
||||
fatal: Zero packs found!
|
||||
EOF
|
||||
test_must_fail git pack-redundant --all >actual 2>&1 &&
|
||||
test_cmp expect actual
|
||||
)
|
||||
'
|
||||
|
||||
#############################################################################
|
||||
# Chart of packs and objects for this test case
|
||||
#
|
||||
# | T A B C D E F G H I J K L M N O P Q R
|
||||
# ----+--------------------------------------
|
||||
# P1 | x x x x x x x x
|
||||
# ----+--------------------------------------
|
||||
# ALL | x x x x x x x x
|
||||
#
|
||||
#############################################################################
|
||||
test_expect_success 'master: pack-redundant works with one packfile' '
|
||||
create_pack_in "$master_repo" P1 <<-EOF &&
|
||||
$T
|
||||
$A
|
||||
$B
|
||||
$C
|
||||
$D
|
||||
$E
|
||||
$F
|
||||
$R
|
||||
EOF
|
||||
(
|
||||
cd "$master_repo" &&
|
||||
git pack-redundant --all >out &&
|
||||
test_must_be_empty out
|
||||
)
|
||||
'
|
||||
|
||||
#############################################################################
|
||||
# Chart of packs and objects for this test case
|
||||
#
|
||||
|
@ -125,16 +164,6 @@ test_expect_success 'setup master repo' '
|
|||
#
|
||||
#############################################################################
|
||||
test_expect_success 'master: no redundant for pack 1, 2, 3' '
|
||||
create_pack_in "$master_repo" P1 <<-EOF &&
|
||||
$T
|
||||
$A
|
||||
$B
|
||||
$C
|
||||
$D
|
||||
$E
|
||||
$F
|
||||
$R
|
||||
EOF
|
||||
create_pack_in "$master_repo" P2 <<-EOF &&
|
||||
$B
|
||||
$C
|
||||
|
|
Загрузка…
Ссылка в новой задаче