Merge branch 'tb/repack-clearing-midx'
When a packfile is removed by "git repack", multi-pack-index gets cleared; the code was taught to do so less aggressively by first checking if the midx actually refers to a pack that no longer exists. * tb/repack-clearing-midx: midx: traverse the local MIDX first builtin/repack.c: invalidate MIDX only when necessary
This commit is contained in:
commit
a31677dde3
@ -133,7 +133,11 @@ static void get_non_kept_pack_filenames(struct string_list *fname_list,
|
|||||||
static void remove_redundant_pack(const char *dir_name, const char *base_name)
|
static void remove_redundant_pack(const char *dir_name, const char *base_name)
|
||||||
{
|
{
|
||||||
struct strbuf buf = STRBUF_INIT;
|
struct strbuf buf = STRBUF_INIT;
|
||||||
strbuf_addf(&buf, "%s/%s.pack", dir_name, base_name);
|
struct multi_pack_index *m = get_local_multi_pack_index(the_repository);
|
||||||
|
strbuf_addf(&buf, "%s.pack", base_name);
|
||||||
|
if (m && midx_contains_pack(m, buf.buf))
|
||||||
|
clear_midx_file(the_repository);
|
||||||
|
strbuf_insertf(&buf, 0, "%s/", dir_name);
|
||||||
unlink_pack_path(buf.buf, 1);
|
unlink_pack_path(buf.buf, 1);
|
||||||
strbuf_release(&buf);
|
strbuf_release(&buf);
|
||||||
}
|
}
|
||||||
@ -286,7 +290,6 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
|
|||||||
int keep_unreachable = 0;
|
int keep_unreachable = 0;
|
||||||
struct string_list keep_pack_list = STRING_LIST_INIT_NODUP;
|
struct string_list keep_pack_list = STRING_LIST_INIT_NODUP;
|
||||||
int no_update_server_info = 0;
|
int no_update_server_info = 0;
|
||||||
int midx_cleared = 0;
|
|
||||||
struct pack_objects_args po_args = {NULL};
|
struct pack_objects_args po_args = {NULL};
|
||||||
|
|
||||||
struct option builtin_repack_options[] = {
|
struct option builtin_repack_options[] = {
|
||||||
@ -439,11 +442,6 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
|
|||||||
for (ext = 0; ext < ARRAY_SIZE(exts); ext++) {
|
for (ext = 0; ext < ARRAY_SIZE(exts); ext++) {
|
||||||
char *fname, *fname_old;
|
char *fname, *fname_old;
|
||||||
|
|
||||||
if (!midx_cleared) {
|
|
||||||
clear_midx_file(the_repository);
|
|
||||||
midx_cleared = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
fname = mkpathdup("%s/pack-%s%s", packdir,
|
fname = mkpathdup("%s/pack-%s%s", packdir,
|
||||||
item->string, exts[ext].name);
|
item->string, exts[ext].name);
|
||||||
if (!file_exists(fname)) {
|
if (!file_exists(fname)) {
|
||||||
|
8
midx.c
8
midx.c
@ -416,8 +416,12 @@ int prepare_multi_pack_index_one(struct repository *r, const char *object_dir, i
|
|||||||
m = load_multi_pack_index(object_dir, local);
|
m = load_multi_pack_index(object_dir, local);
|
||||||
|
|
||||||
if (m) {
|
if (m) {
|
||||||
m->next = r->objects->multi_pack_index;
|
struct multi_pack_index *mp = r->objects->multi_pack_index;
|
||||||
r->objects->multi_pack_index = m;
|
if (mp) {
|
||||||
|
m->next = mp->next;
|
||||||
|
mp->next = m;
|
||||||
|
} else
|
||||||
|
r->objects->multi_pack_index = m;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
11
packfile.c
11
packfile.c
@ -1027,6 +1027,17 @@ struct multi_pack_index *get_multi_pack_index(struct repository *r)
|
|||||||
return r->objects->multi_pack_index;
|
return r->objects->multi_pack_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct multi_pack_index *get_local_multi_pack_index(struct repository *r)
|
||||||
|
{
|
||||||
|
struct multi_pack_index *m = get_multi_pack_index(r);
|
||||||
|
|
||||||
|
/* no need to iterate; we always put the local one first (if any) */
|
||||||
|
if (m && m->local)
|
||||||
|
return m;
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
struct packed_git *get_all_packs(struct repository *r)
|
struct packed_git *get_all_packs(struct repository *r)
|
||||||
{
|
{
|
||||||
struct multi_pack_index *m;
|
struct multi_pack_index *m;
|
||||||
|
@ -57,6 +57,7 @@ void install_packed_git(struct repository *r, struct packed_git *pack);
|
|||||||
struct packed_git *get_packed_git(struct repository *r);
|
struct packed_git *get_packed_git(struct repository *r);
|
||||||
struct list_head *get_packed_git_mru(struct repository *r);
|
struct list_head *get_packed_git_mru(struct repository *r);
|
||||||
struct multi_pack_index *get_multi_pack_index(struct repository *r);
|
struct multi_pack_index *get_multi_pack_index(struct repository *r);
|
||||||
|
struct multi_pack_index *get_local_multi_pack_index(struct repository *r);
|
||||||
struct packed_git *get_all_packs(struct repository *r);
|
struct packed_git *get_all_packs(struct repository *r);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -382,12 +382,52 @@ test_expect_success 'repack with the --no-progress option' '
|
|||||||
test_line_count = 0 err
|
test_line_count = 0 err
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success 'repack removes multi-pack-index' '
|
test_expect_success 'repack removes multi-pack-index when deleting packs' '
|
||||||
test_path_is_file $objdir/pack/multi-pack-index &&
|
test_path_is_file $objdir/pack/multi-pack-index &&
|
||||||
GIT_TEST_MULTI_PACK_INDEX=0 git repack -adf &&
|
# Set GIT_TEST_MULTI_PACK_INDEX to 0 to avoid writing a new
|
||||||
|
# multi-pack-index after repacking, but set "core.multiPackIndex" to
|
||||||
|
# true so that "git repack" can read the existing MIDX.
|
||||||
|
GIT_TEST_MULTI_PACK_INDEX=0 git -c core.multiPackIndex repack -adf &&
|
||||||
test_path_is_missing $objdir/pack/multi-pack-index
|
test_path_is_missing $objdir/pack/multi-pack-index
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'repack preserves multi-pack-index when creating packs' '
|
||||||
|
git init preserve &&
|
||||||
|
test_when_finished "rm -fr preserve" &&
|
||||||
|
(
|
||||||
|
cd preserve &&
|
||||||
|
packdir=.git/objects/pack &&
|
||||||
|
midx=$packdir/multi-pack-index &&
|
||||||
|
|
||||||
|
test_commit 1 &&
|
||||||
|
pack1=$(git pack-objects --all $packdir/pack) &&
|
||||||
|
touch $packdir/pack-$pack1.keep &&
|
||||||
|
test_commit 2 &&
|
||||||
|
pack2=$(git pack-objects --revs $packdir/pack) &&
|
||||||
|
touch $packdir/pack-$pack2.keep &&
|
||||||
|
|
||||||
|
git multi-pack-index write &&
|
||||||
|
cp $midx $midx.bak &&
|
||||||
|
|
||||||
|
cat >pack-input <<-EOF &&
|
||||||
|
HEAD
|
||||||
|
^HEAD~1
|
||||||
|
EOF
|
||||||
|
test_commit 3 &&
|
||||||
|
pack3=$(git pack-objects --revs $packdir/pack <pack-input) &&
|
||||||
|
test_commit 4 &&
|
||||||
|
pack4=$(git pack-objects --revs $packdir/pack <pack-input) &&
|
||||||
|
|
||||||
|
GIT_TEST_MULTI_PACK_INDEX=0 git -c core.multiPackIndex repack -ad &&
|
||||||
|
ls -la $packdir &&
|
||||||
|
test_path_is_file $packdir/pack-$pack1.pack &&
|
||||||
|
test_path_is_file $packdir/pack-$pack2.pack &&
|
||||||
|
test_path_is_missing $packdir/pack-$pack3.pack &&
|
||||||
|
test_path_is_missing $packdir/pack-$pack4.pack &&
|
||||||
|
test_cmp_bin $midx.bak $midx
|
||||||
|
)
|
||||||
|
'
|
||||||
|
|
||||||
compare_results_with_midx "after repack"
|
compare_results_with_midx "after repack"
|
||||||
|
|
||||||
test_expect_success 'multi-pack-index and pack-bitmap' '
|
test_expect_success 'multi-pack-index and pack-bitmap' '
|
||||||
|
Loading…
Reference in New Issue
Block a user