pack-objects: consider packs in multi-pack-index
When running 'git pack-objects --local', we want to avoid packing objects that are in an alternate. Currently, we check for these objects using the packed_git_mru list, which excludes the pack-files covered by a multi-pack-index. Add a new iteration over the multi-pack-indexes to find these copies and mark them as unwanted. Signed-off-by: Derrick Stolee <dstolee@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
e9ab2ed7de
commit
6a22d52126
@ -31,6 +31,7 @@
|
|||||||
#include "packfile.h"
|
#include "packfile.h"
|
||||||
#include "object-store.h"
|
#include "object-store.h"
|
||||||
#include "dir.h"
|
#include "dir.h"
|
||||||
|
#include "midx.h"
|
||||||
|
|
||||||
#define IN_PACK(obj) oe_in_pack(&to_pack, obj)
|
#define IN_PACK(obj) oe_in_pack(&to_pack, obj)
|
||||||
#define SIZE(obj) oe_size(&to_pack, obj)
|
#define SIZE(obj) oe_size(&to_pack, obj)
|
||||||
@ -1040,6 +1041,7 @@ static int want_object_in_pack(const struct object_id *oid,
|
|||||||
{
|
{
|
||||||
int want;
|
int want;
|
||||||
struct list_head *pos;
|
struct list_head *pos;
|
||||||
|
struct multi_pack_index *m;
|
||||||
|
|
||||||
if (!exclude && local && has_loose_object_nonlocal(oid))
|
if (!exclude && local && has_loose_object_nonlocal(oid))
|
||||||
return 0;
|
return 0;
|
||||||
@ -1054,6 +1056,32 @@ static int want_object_in_pack(const struct object_id *oid,
|
|||||||
if (want != -1)
|
if (want != -1)
|
||||||
return want;
|
return want;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (m = get_multi_pack_index(the_repository); m; m = m->next) {
|
||||||
|
struct pack_entry e;
|
||||||
|
if (fill_midx_entry(oid, &e, m)) {
|
||||||
|
struct packed_git *p = e.p;
|
||||||
|
off_t offset;
|
||||||
|
|
||||||
|
if (p == *found_pack)
|
||||||
|
offset = *found_offset;
|
||||||
|
else
|
||||||
|
offset = find_pack_entry_one(oid->hash, p);
|
||||||
|
|
||||||
|
if (offset) {
|
||||||
|
if (!*found_pack) {
|
||||||
|
if (!is_pack_valid(p))
|
||||||
|
continue;
|
||||||
|
*found_offset = offset;
|
||||||
|
*found_pack = p;
|
||||||
|
}
|
||||||
|
want = want_found_object(exclude, p);
|
||||||
|
if (want != -1)
|
||||||
|
return want;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
list_for_each(pos, get_packed_git_mru(the_repository)) {
|
list_for_each(pos, get_packed_git_mru(the_repository)) {
|
||||||
struct packed_git *p = list_entry(pos, struct packed_git, mru);
|
struct packed_git *p = list_entry(pos, struct packed_git, mru);
|
||||||
off_t offset;
|
off_t offset;
|
||||||
|
@ -176,7 +176,13 @@ test_expect_success 'multi-pack-index and alternates' '
|
|||||||
compare_results_with_midx "with alternate (local midx)"
|
compare_results_with_midx "with alternate (local midx)"
|
||||||
|
|
||||||
test_expect_success 'multi-pack-index in an alternate' '
|
test_expect_success 'multi-pack-index in an alternate' '
|
||||||
mv .git/objects/pack/* alt.git/objects/pack
|
mv .git/objects/pack/* alt.git/objects/pack &&
|
||||||
|
test_commit add_local_objects &&
|
||||||
|
git repack --local &&
|
||||||
|
git multi-pack-index write &&
|
||||||
|
midx_read_expect 1 3 4 $objdir &&
|
||||||
|
git reset --hard HEAD~1 &&
|
||||||
|
rm -f .git/objects/pack/*
|
||||||
'
|
'
|
||||||
|
|
||||||
compare_results_with_midx "with alternate (remote midx)"
|
compare_results_with_midx "with alternate (remote midx)"
|
||||||
|
Loading…
Reference in New Issue
Block a user