Skip to content

Commit 7b90ab4

Browse files
newrengitster
authored andcommitted
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 <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent db757e8 commit 7b90ab4

File tree

5 files changed

+28
-7
lines changed

5 files changed

+28
-7
lines changed

builtin/log.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -422,13 +422,12 @@ static int cmd_log_walk(struct rev_info *rev)
422422
struct commit *commit;
423423
int saved_nrl = 0;
424424
int saved_dcctc = 0;
425-
struct tmp_objdir *remerge_objdir = NULL;
426425

427426
if (rev->remerge_diff) {
428-
remerge_objdir = tmp_objdir_create("remerge-diff");
429-
if (!remerge_objdir)
427+
rev->remerge_objdir = tmp_objdir_create("remerge-diff");
428+
if (!rev->remerge_objdir)
430429
die(_("unable to create temporary object directory"));
431-
tmp_objdir_replace_primary_odb(remerge_objdir, 1);
430+
tmp_objdir_replace_primary_odb(rev->remerge_objdir, 1);
432431
}
433432

434433
if (rev->early_output)
@@ -473,8 +472,10 @@ static int cmd_log_walk(struct rev_info *rev)
473472
rev->diffopt.no_free = 0;
474473
diff_free(&rev->diffopt);
475474

476-
if (rev->remerge_diff)
477-
tmp_objdir_destroy(remerge_objdir);
475+
if (rev->remerge_diff) {
476+
tmp_objdir_destroy(rev->remerge_objdir);
477+
rev->remerge_objdir = NULL;
478+
}
478479

479480
if (rev->diffopt.output_format & DIFF_FORMAT_CHECKDIFF &&
480481
rev->diffopt.flags.check_failed) {

log-tree.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include "diff.h"
55
#include "object-store.h"
66
#include "repository.h"
7+
#include "tmp-objdir.h"
78
#include "commit.h"
89
#include "tag.h"
910
#include "graph.h"
@@ -946,7 +947,12 @@ static int do_remerge_diff(struct rev_info *opt,
946947
strbuf_release(&parent1_desc);
947948
strbuf_release(&parent2_desc);
948949
merge_finalize(&o, &res);
949-
/* TODO: clean up the temporary object directory */
950+
951+
/* Clean up the contents of the temporary object directory */
952+
if (opt->remerge_objdir)
953+
tmp_objdir_discard_objects(opt->remerge_objdir);
954+
else
955+
BUG("did a remerge diff without remerge_objdir?!?");
950956

951957
return !opt->loginfo;
952958
}

revision.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,9 @@ struct rev_info {
318318

319319
/* misc. flags related to '--no-kept-objects' */
320320
unsigned keep_pack_cache_flags;
321+
322+
/* Location where temporary objects for remerge-diff are written. */
323+
struct tmp_objdir *remerge_objdir;
321324
};
322325

323326
int ref_excluded(struct string_list *, const char *path);

tmp-objdir.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,11 @@ static void remove_tmp_objdir_on_signal(int signo)
7979
raise(signo);
8080
}
8181

82+
void tmp_objdir_discard_objects(struct tmp_objdir *t)
83+
{
84+
remove_dir_recursively(&t->path, REMOVE_DIR_KEEP_TOPLEVEL);
85+
}
86+
8287
/*
8388
* These env_* functions are for setting up the child environment; the
8489
* "replace" variant overrides the value of any existing variable with that

tmp-objdir.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,12 @@ int tmp_objdir_migrate(struct tmp_objdir *);
4646
*/
4747
int tmp_objdir_destroy(struct tmp_objdir *);
4848

49+
/*
50+
* Remove all objects from the temporary object directory, while leaving it
51+
* around so more objects can be added.
52+
*/
53+
void tmp_objdir_discard_objects(struct tmp_objdir *);
54+
4955
/*
5056
* Add the temporary object directory as an alternate object store in the
5157
* current process.

0 commit comments

Comments
 (0)