revisions API users: use release_revisions() in builtin/log.c

In preparation for having the "log" family of functions make wider use of release_revisions() let's have them call it just before exiting. This changes the "log", "whatchanged", "show", "format-patch", etc. commands, all of which live in this file. The release_revisions() API still only frees the "pending" member, but will learn to release more members of "struct rev_info" in subsequent commits. In the case of "format-patch" revert the addition of UNLEAK() in dee839a2633 (format-patch: mark rev_info with UNLEAK, 2021-12-16), which will cause several tests that previously passed under "TEST_PASSES_SANITIZE_LEAK=true" to start failing. In subsequent commits we'll now be able to use those tests to check whether that part of the API is really leaking memory, and will fix all of those memory leaks. Removing the UNLEAK() allows us to make incremental progress in that direction. See [1] for further details about this approach. Note that the release_revisions() will not be sufficient to deal with the code in cmd_show() added in 5d7eeee2ac6 (git-show: grok blobs, trees and tags, too, 2006-12-14) which clobbers the "pending" array in the case of "OBJ_COMMIT". That will need to be dealt with by some future follow-up work. 1. https://lore.kernel.org/git/220218.861r00ib86.gmgdl@evledraar.gmail.com/ Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Ævar Arnfjörð Bjarmason committed Apr 13, 2022 at 22:01 UTC f6bfea0ad0151a941686b2ed1875ec7038623ac0
2 files changed +12 -10
builtin/log.c
+12 -8
@@ -295,6 +295,12 @@ static void cmd_log_init(int argc, const char **argv, const char *prefix,
295 cmd_log_init_finish(argc, argv, prefix, rev, opt);
296 }
297
298 +static int cmd_log_deinit(int ret, struct rev_info *rev)
299 +{
300 + release_revisions(rev);
301 + return ret;
302 +}
303 +
304 /*
305 * This gives a rough estimate for how many commits we
306 * will print out in the list.
@@ -558,7 +564,7 @@ int cmd_whatchanged(int argc, const char **argv, const char *prefix)
564 cmd_log_init(argc, argv, prefix, &rev, &opt);
565 if (!rev.diffopt.output_format)
566 rev.diffopt.output_format = DIFF_FORMAT_RAW;
561 - return cmd_log_walk(&rev);
567 + return cmd_log_deinit(cmd_log_walk(&rev), &rev);
568 }
569
570 static void show_tagger(const char *buf, struct rev_info *rev)
@@ -677,7 +683,7 @@ int cmd_show(int argc, const char **argv, const char *prefix)
683 cmd_log_init(argc, argv, prefix, &rev, &opt);
684
685 if (!rev.no_walk)
680 - return cmd_log_walk(&rev);
686 + return cmd_log_deinit(cmd_log_walk(&rev), &rev);
687
688 count = rev.pending.nr;
689 objects = rev.pending.objects;
@@ -732,8 +738,7 @@ int cmd_show(int argc, const char **argv, const char *prefix)
738 ret = error(_("unknown type: %d"), o->type);
739 }
740 }
735 - free(objects);
736 - return ret;
741 + return cmd_log_deinit(ret, &rev);
742 }
743
744 /*
@@ -761,7 +766,7 @@ int cmd_log_reflog(int argc, const char **argv, const char *prefix)
766 rev.always_show_header = 1;
767 cmd_log_init_finish(argc, argv, prefix, &rev, &opt);
768
764 - return cmd_log_walk(&rev);
769 + return cmd_log_deinit(cmd_log_walk(&rev), &rev);
770 }
771
772 static void log_setup_revisions_tweak(struct rev_info *rev,
@@ -792,7 +797,7 @@ int cmd_log(int argc, const char **argv, const char *prefix)
797 opt.revarg_opt = REVARG_COMMITTISH;
798 opt.tweak = log_setup_revisions_tweak;
799 cmd_log_init(argc, argv, prefix, &rev, &opt);
795 - return cmd_log_walk(&rev);
800 + return cmd_log_deinit(cmd_log_walk(&rev), &rev);
801 }
802
803 /* format-patch */
@@ -2289,8 +2294,7 @@ done:
2294 if (rev.ref_message_ids)
2295 string_list_clear(rev.ref_message_ids, 0);
2296 free(rev.ref_message_ids);
2292 - UNLEAK(rev);
2293 - return 0;
2297 + return cmd_log_deinit(0, &rev);
2298 }
2299
2300 static int add_pending_commit(const char *arg, struct rev_info *revs, int flags)
t/t4126-apply-empty.sh
-2
@@ -2,8 +2,6 @@
2
3 test_description='apply empty'
4
5 -
6 -TEST_PASSES_SANITIZE_LEAK=true
5 . ./test-lib.sh
6
7 test_expect_success setup '