revisions API: add a TODO for diff_free(&revs->diffopt)

Add a TODO comment indicating that we should release "diffopt" in release_revisions(). In a preceding commit we started releasing the "pruning" member of the same type, but handling "diffopt" will require us to untangle the "no_free" conditions I added in e900d494dcf (diff: add an API for deferred freeing, 2021-02-11). Let's leave a TODO comment to that effect, and so that we don't forget refactor code that was changed to use release_revisions() in earlier commits to stop using the "diffopt" member after a call to release_revisions(). This works currently, but would become a logic error as soon as we started freeing "diffopt". Doing that change now doesn't harm anything, and future-proofs us against a later change to release_revisions(). 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 14, 2022 at 07:56 UTC 54c8a7c379fc37a847b8a5ec5c419eae171322e1
3 files changed +8 -3
diff-lib.c
+3 -1
@@ -651,6 +651,7 @@ int index_differs_from(struct repository *r,
651 {
652 struct rev_info rev;
653 struct setup_revision_opt opt;
654 + unsigned has_changes;
655
656 repo_init_revisions(r, &rev, NULL);
657 memset(&opt, 0, sizeof(opt));
@@ -662,8 +663,9 @@ int index_differs_from(struct repository *r,
663 diff_flags_or(&rev.diffopt.flags, flags);
664 rev.diffopt.ita_invisible_in_index = ita_invisible_in_index;
665 run_diff_index(&rev, 1);
666 + has_changes = rev.diffopt.flags.has_changes;
667 release_revisions(&rev);
666 - return (rev.diffopt.flags.has_changes != 0);
668 + return (has_changes != 0);
669 }
670
671 static struct strbuf *idiff_prefix_cb(struct diff_options *opt, void *data)
revision.c
+1
@@ -2956,6 +2956,7 @@ void release_revisions(struct rev_info *revs)
2956 date_mode_release(&revs->date_mode);
2957 release_revisions_mailmap(revs->mailmap);
2958 free_grep_patterns(&revs->grep_filter);
2959 + /* TODO (need to handle "no_free"): diff_free(&revs->diffopt) */
2960 diff_free(&revs->pruning);
2961 reflog_walk_info_release(revs->reflog_info);
2962 release_revisions_topo_walk_info(revs->topo_walk_info);
wt-status.c
+4 -2
@@ -2545,8 +2545,9 @@ int has_unstaged_changes(struct repository *r, int ignore_submodules)
2545 rev_info.diffopt.flags.quick = 1;
2546 diff_setup_done(&rev_info.diffopt);
2547 result = run_diff_files(&rev_info, 0);
2548 + result = diff_result_code(&rev_info.diffopt, result);
2549 release_revisions(&rev_info);
2549 - return diff_result_code(&rev_info.diffopt, result);
2550 + return result;
2551 }
2552
2553 /**
@@ -2578,8 +2579,9 @@ int has_uncommitted_changes(struct repository *r,
2579
2580 diff_setup_done(&rev_info.diffopt);
2581 result = run_diff_index(&rev_info, 1);
2582 + result = diff_result_code(&rev_info.diffopt, result);
2583 release_revisions(&rev_info);
2582 - return diff_result_code(&rev_info.diffopt, result);
2584 + return result;
2585 }
2586
2587 /**