]> git.ipfire.org Git - thirdparty/git.git/commitdiff
remerge-diff: lazily prepare temporary objdir on demand
authorJunio C Hamano <gitster@pobox.com>
Fri, 9 Aug 2024 22:30:51 +0000 (15:30 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 9 Aug 2024 22:42:35 +0000 (15:42 -0700)
It is error prone for each caller that sets revs.remerge_diff bit
to be responsible for preparing a temporary object directory and
rotate it into the list of alternate object stores, making it the
primary object store.

Instead, remove the code to set up and arrange the temporary object
directory from the current callers and implement it in the code that
runs remerge-diff logic.  The code to undo the futzing of the list
of alternate object store is still spread across the callers, but we
will deal with it in future steps.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/diff-tree.c
builtin/log.c
log-tree.c

index 12012ea0939fd5a2b52f6885df904d5d2944e780..af51cd29c6f8eca2a82a613de0cbf89a7e5a437b 100644 (file)
@@ -168,13 +168,6 @@ int cmd_diff_tree(int argc, const char **argv, const char *prefix)
 
        opt->diffopt.rotate_to_strict = 1;
 
-       if (opt->remerge_diff) {
-               opt->remerge_objdir = tmp_objdir_create("remerge-diff");
-               if (!opt->remerge_objdir)
-                       die(_("unable to create temporary object directory"));
-               tmp_objdir_replace_primary_odb(opt->remerge_objdir, 1);
-       }
-
        /*
         * NOTE!  We expect "a..b" to expand to "^a b" but it is
         * perfectly valid for revision range parser to yield "b ^a",
index af6403cb71a6b87af1b95399b809720c4e38a367..227823a16e3abde8f592f232b5c62060b2dd5e7c 100644 (file)
@@ -494,13 +494,6 @@ static int cmd_log_walk_no_free(struct rev_info *rev)
        int saved_nrl = 0;
        int saved_dcctc = 0;
 
-       if (rev->remerge_diff) {
-               rev->remerge_objdir = tmp_objdir_create("remerge-diff");
-               if (!rev->remerge_objdir)
-                       die(_("unable to create temporary object directory"));
-               tmp_objdir_replace_primary_odb(rev->remerge_objdir, 1);
-       }
-
        if (rev->early_output)
                setup_early_output();
 
index 337b9334cdbafe0d3ffd2bf2fd36898f6d112410..83e648b7cd661dd5f66ad43674b3b28c9586290d 100644 (file)
@@ -1019,6 +1019,17 @@ static int do_remerge_diff(struct rev_info *opt,
        struct strbuf parent1_desc = STRBUF_INIT;
        struct strbuf parent2_desc = STRBUF_INIT;
 
+       /*
+        * Lazily prepare a temporary object directory and rotate it
+        * into the alternative object store list as the primary.
+        */
+       if (opt->remerge_diff && !opt->remerge_objdir) {
+               opt->remerge_objdir = tmp_objdir_create("remerge-diff");
+               if (!opt->remerge_objdir)
+                       return error(_("unable to create temporary object directory"));
+               tmp_objdir_replace_primary_odb(opt->remerge_objdir, 1);
+       }
+
        /* Setup merge options */
        init_merge_options(&o, the_repository);
        o.show_rename_progress = 0;
@@ -1053,10 +1064,7 @@ static int do_remerge_diff(struct rev_info *opt,
        merge_finalize(&o, &res);
 
        /* Clean up the contents of the temporary object directory */
-       if (opt->remerge_objdir)
-               tmp_objdir_discard_objects(opt->remerge_objdir);
-       else
-               BUG("did a remerge diff without remerge_objdir?!?");
+       tmp_objdir_discard_objects(opt->remerge_objdir);
 
        return !opt->loginfo;
 }