Merge branch 'rs/repack-without-loosening-promised-objects'

"git repack -A -d" in a partial clone unnecessarily loosened
objects in promisor pack.

* rs/repack-without-loosening-promised-objects:
  repack: avoid loosening promisor objects in partial clones
This commit is contained in:
Junio C Hamano 2021-05-10 16:59:47 +09:00
commit a0f521b56c
4 changed files with 26 additions and 3 deletions

View file

@ -3479,6 +3479,7 @@ static void loosen_unused_packed_objects(void)
{
struct packed_git *p;
uint32_t i;
uint32_t loosened_objects_nr = 0;
struct object_id oid;
for (p = get_all_packs(the_repository); p; p = p->next) {
@ -3492,11 +3493,16 @@ static void loosen_unused_packed_objects(void)
nth_packed_object_id(&oid, p, i);
if (!packlist_find(&to_pack, &oid) &&
!has_sha1_pack_kept_or_nonlocal(&oid) &&
!loosened_object_can_be_discarded(&oid, p->mtime))
!loosened_object_can_be_discarded(&oid, p->mtime)) {
if (force_object_loose(&oid, p->mtime))
die(_("unable to force loose object"));
loosened_objects_nr++;
}
}
}
trace2_data_intmax("pack-objects", the_repository,
"loosen_unused_packed_objects/loosened", loosened_objects_nr);
}
/*

View file

@ -20,7 +20,7 @@ static int delta_base_offset = 1;
static int pack_kept_objects = -1;
static int write_bitmaps = -1;
static int use_delta_islands;
static char *packdir, *packtmp;
static char *packdir, *packtmp_name, *packtmp;
static const char *const git_repack_usage[] = {
N_("git repack [<options>]"),
@ -530,7 +530,8 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
}
packdir = mkpathdup("%s/pack", get_object_directory());
packtmp = mkpathdup("%s/.tmp-%d-pack", packdir, (int)getpid());
packtmp_name = xstrfmt(".tmp-%d-pack", (int)getpid());
packtmp = mkpathdup("%s/%s", packdir, packtmp_name);
sigchain_push_common(remove_pack_on_signal);
@ -573,6 +574,10 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
repack_promisor_objects(&po_args, &names);
if (existing_packs.nr && delete_redundant) {
for_each_string_list_item(item, &names) {
strvec_pushf(&cmd.args, "--keep-pack=%s-%s.pack",
packtmp_name, item->string);
}
if (unpack_unreachable) {
strvec_pushf(&cmd.args,
"--unpack-unreachable=%s",

View file

@ -35,4 +35,8 @@ test_perf 'count non-promisor commits' '
git -C bare.git rev-list --all --count --exclude-promisor-objects
'
test_perf 'gc' '
git -C bare.git gc
'
test_done

View file

@ -548,6 +548,14 @@ test_expect_success 'fetch from a partial clone, protocol v2' '
grep "version 2" trace
'
test_expect_success 'repack does not loosen promisor objects' '
rm -rf client trace &&
git clone --bare --filter=blob:none "file://$(pwd)/srv.bare" client &&
test_when_finished "rm -rf client trace" &&
GIT_TRACE2_PERF="$(pwd)/trace" git -C client repack -A -d &&
grep "loosen_unused_packed_objects/loosened:0" trace
'
. "$TEST_DIRECTORY"/lib-httpd.sh
start_httpd