mirror of
https://github.com/git/git
synced 2024-08-28 12:09:19 +00:00
Merge branch 'tb/collect-pack-filenames-fix'
Avoid breakage of "git pack-objects --cruft" due to inconsistency between the way the code enumerates packfiles in the repository. * tb/collect-pack-filenames-fix: builtin/repack.c: only collect fully-formed packs
This commit is contained in:
commit
e224f26892
|
@ -95,8 +95,8 @@ static int repack_config(const char *var, const char *value, void *cb)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Adds all packs hex strings to either fname_nonkept_list or
|
* Adds all packs hex strings (pack-$HASH) to either fname_nonkept_list
|
||||||
* fname_kept_list based on whether each pack has a corresponding
|
* or fname_kept_list based on whether each pack has a corresponding
|
||||||
* .keep file or not. Packs without a .keep file are not to be kept
|
* .keep file or not. Packs without a .keep file are not to be kept
|
||||||
* if we are going to pack everything into one file.
|
* if we are going to pack everything into one file.
|
||||||
*/
|
*/
|
||||||
|
@ -107,6 +107,7 @@ static void collect_pack_filenames(struct string_list *fname_nonkept_list,
|
||||||
DIR *dir;
|
DIR *dir;
|
||||||
struct dirent *e;
|
struct dirent *e;
|
||||||
char *fname;
|
char *fname;
|
||||||
|
struct strbuf buf = STRBUF_INIT;
|
||||||
|
|
||||||
if (!(dir = opendir(packdir)))
|
if (!(dir = opendir(packdir)))
|
||||||
return;
|
return;
|
||||||
|
@ -115,11 +116,15 @@ static void collect_pack_filenames(struct string_list *fname_nonkept_list,
|
||||||
size_t len;
|
size_t len;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (!strip_suffix(e->d_name, ".pack", &len))
|
if (!strip_suffix(e->d_name, ".idx", &len))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
strbuf_reset(&buf);
|
||||||
|
strbuf_add(&buf, e->d_name, len);
|
||||||
|
strbuf_addstr(&buf, ".pack");
|
||||||
|
|
||||||
for (i = 0; i < extra_keep->nr; i++)
|
for (i = 0; i < extra_keep->nr; i++)
|
||||||
if (!fspathcmp(e->d_name, extra_keep->items[i].string))
|
if (!fspathcmp(buf.buf, extra_keep->items[i].string))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
fname = xmemdupz(e->d_name, len);
|
fname = xmemdupz(e->d_name, len);
|
||||||
|
@ -136,6 +141,7 @@ static void collect_pack_filenames(struct string_list *fname_nonkept_list,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
closedir(dir);
|
closedir(dir);
|
||||||
|
strbuf_release(&buf);
|
||||||
|
|
||||||
string_list_sort(fname_kept_list);
|
string_list_sort(fname_kept_list);
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,10 @@ test_description='git repack works correctly'
|
||||||
commit_and_pack () {
|
commit_and_pack () {
|
||||||
test_commit "$@" 1>&2 &&
|
test_commit "$@" 1>&2 &&
|
||||||
incrpackid=$(git pack-objects --all --unpacked --incremental .git/objects/pack/pack </dev/null) &&
|
incrpackid=$(git pack-objects --all --unpacked --incremental .git/objects/pack/pack </dev/null) &&
|
||||||
|
# Remove any loose object(s) created by test_commit, since they have
|
||||||
|
# already been packed. Leaving these around can create subtly different
|
||||||
|
# packs with `pack-objects`'s `--unpacked` option.
|
||||||
|
git prune-packed 1>&2 &&
|
||||||
echo pack-${incrpackid}.pack
|
echo pack-${incrpackid}.pack
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -209,6 +213,8 @@ test_expect_success 'repack --keep-pack' '
|
||||||
test_create_repo keep-pack &&
|
test_create_repo keep-pack &&
|
||||||
(
|
(
|
||||||
cd keep-pack &&
|
cd keep-pack &&
|
||||||
|
# avoid producing difference packs to delta/base choices
|
||||||
|
git config pack.window 0 &&
|
||||||
P1=$(commit_and_pack 1) &&
|
P1=$(commit_and_pack 1) &&
|
||||||
P2=$(commit_and_pack 2) &&
|
P2=$(commit_and_pack 2) &&
|
||||||
P3=$(commit_and_pack 3) &&
|
P3=$(commit_and_pack 3) &&
|
||||||
|
@ -220,6 +226,23 @@ test_expect_success 'repack --keep-pack' '
|
||||||
grep -q $P1 new-counts &&
|
grep -q $P1 new-counts &&
|
||||||
grep -q $P4 new-counts &&
|
grep -q $P4 new-counts &&
|
||||||
test_line_count = 3 new-counts &&
|
test_line_count = 3 new-counts &&
|
||||||
|
git fsck &&
|
||||||
|
|
||||||
|
P5=$(commit_and_pack --no-tag 5) &&
|
||||||
|
git reset --hard HEAD^ &&
|
||||||
|
git reflog expire --all --expire=all &&
|
||||||
|
rm -f ".git/objects/pack/${P5%.pack}.idx" &&
|
||||||
|
rm -f ".git/objects/info/commit-graph" &&
|
||||||
|
for from in $(find .git/objects/pack -type f -name "${P5%.pack}.*")
|
||||||
|
do
|
||||||
|
to="$(dirname "$from")/.tmp-1234-$(basename "$from")" &&
|
||||||
|
mv "$from" "$to" || return 1
|
||||||
|
done &&
|
||||||
|
|
||||||
|
git repack --cruft -d --keep-pack $P1 --keep-pack $P4 &&
|
||||||
|
|
||||||
|
ls .git/objects/pack/*.pack >newer-counts &&
|
||||||
|
test_cmp new-counts newer-counts &&
|
||||||
git fsck
|
git fsck
|
||||||
)
|
)
|
||||||
'
|
'
|
||||||
|
|
Loading…
Reference in a new issue