log: clean unneeded objects during log --remerge-diff

The --remerge-diff option will need to create new blobs and trees
representing the "automatic merge" state.  If one is traversing a
long project history, one can easily get hundreds of thousands of
loose objects generated during `log --remerge-diff`.  However, none of
those loose objects are needed after we have completed our diff
operation; they can be summarily deleted.

Add a new helper function to tmp_objdir to discard all the contained
objects, and call it after each merge is handled.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Elijah Newren
2022-02-02 02:37:29 +00:00
committed by Junio C Hamano
parent db757e8b8d
commit 7b90ab467a
5 changed files with 28 additions and 7 deletions

View File

@ -422,13 +422,12 @@ static int cmd_log_walk(struct rev_info *rev)
struct commit *commit;
int saved_nrl = 0;
int saved_dcctc = 0;
struct tmp_objdir *remerge_objdir = NULL;
if (rev->remerge_diff) {
remerge_objdir = tmp_objdir_create("remerge-diff");
if (!remerge_objdir)
rev->remerge_objdir = tmp_objdir_create("remerge-diff");
if (!rev->remerge_objdir)
die(_("unable to create temporary object directory"));
tmp_objdir_replace_primary_odb(remerge_objdir, 1);
tmp_objdir_replace_primary_odb(rev->remerge_objdir, 1);
}
if (rev->early_output)
@ -473,8 +472,10 @@ static int cmd_log_walk(struct rev_info *rev)
rev->diffopt.no_free = 0;
diff_free(&rev->diffopt);
if (rev->remerge_diff)
tmp_objdir_destroy(remerge_objdir);
if (rev->remerge_diff) {
tmp_objdir_destroy(rev->remerge_objdir);
rev->remerge_objdir = NULL;
}
if (rev->diffopt.output_format & DIFF_FORMAT_CHECKDIFF &&
rev->diffopt.flags.check_failed) {