]> git.ipfire.org Git - thirdparty/git.git/blobdiff - builtin/log.c
Merge branch 'ah/commit-graph-leakplug'
[thirdparty/git.git] / builtin / log.c
index f23ccdbec3263dffe87666baed28c7f0cdb76047..f67b67d80ed1e8d7cd95982a8da96b435b8a452b 100644 (file)
@@ -12,6 +12,7 @@
 #include "color.h"
 #include "commit.h"
 #include "diff.h"
+#include "diff-merges.h"
 #include "revision.h"
 #include "log-tree.h"
 #include "builtin.h"
@@ -230,7 +231,7 @@ static void cmd_log_init_finish(int argc, const char **argv, const char *prefix,
 
        if (mailmap) {
                rev->mailmap = xcalloc(1, sizeof(struct string_list));
-               read_mailmap(rev->mailmap, NULL);
+               read_mailmap(rev->mailmap);
        }
 
        if (rev->pretty_given && rev->commit_format == CMIT_FMT_RAW) {
@@ -306,10 +307,11 @@ static struct itimerval early_output_timer;
 
 static void log_show_early(struct rev_info *revs, struct commit_list *list)
 {
-       int i = revs->early_output, close_file = revs->diffopt.close_file;
+       int i = revs->early_output;
        int show_header = 1;
+       int no_free = revs->diffopt.no_free;
 
-       revs->diffopt.close_file = 0;
+       revs->diffopt.no_free = 0;
        sort_in_topological_order(&list, revs->sort_order);
        while (list && i) {
                struct commit *commit = list->item;
@@ -326,8 +328,8 @@ static void log_show_early(struct rev_info *revs, struct commit_list *list)
                case commit_ignore:
                        break;
                case commit_error:
-                       if (close_file)
-                               fclose(revs->diffopt.file);
+                       revs->diffopt.no_free = no_free;
+                       diff_free(&revs->diffopt);
                        return;
                }
                list = list->next;
@@ -335,8 +337,8 @@ static void log_show_early(struct rev_info *revs, struct commit_list *list)
 
        /* Did we already get enough commits for the early output? */
        if (!i) {
-               if (close_file)
-                       fclose(revs->diffopt.file);
+               revs->diffopt.no_free = 0;
+               diff_free(&revs->diffopt);
                return;
        }
 
@@ -400,7 +402,7 @@ static int cmd_log_walk(struct rev_info *rev)
 {
        struct commit *commit;
        int saved_nrl = 0;
-       int saved_dcctc = 0, close_file = rev->diffopt.close_file;
+       int saved_dcctc = 0;
 
        if (rev->early_output)
                setup_early_output();
@@ -416,7 +418,7 @@ static int cmd_log_walk(struct rev_info *rev)
         * and HAS_CHANGES being accumulated in rev->diffopt, so be careful to
         * retain that state information if replacing rev->diffopt in this loop
         */
-       rev->diffopt.close_file = 0;
+       rev->diffopt.no_free = 1;
        while ((commit = get_revision(rev)) != NULL) {
                if (!log_tree_commit(rev, commit) && rev->max_count >= 0)
                        /*
@@ -441,8 +443,8 @@ static int cmd_log_walk(struct rev_info *rev)
        }
        rev->diffopt.degraded_cc_to_c = saved_dcctc;
        rev->diffopt.needed_rename_limit = saved_nrl;
-       if (close_file)
-               fclose(rev->diffopt.file);
+       rev->diffopt.no_free = 0;
+       diff_free(&rev->diffopt);
 
        if (rev->diffopt.output_format & DIFF_FORMAT_CHECKDIFF &&
            rev->diffopt.flags.check_failed) {
@@ -607,15 +609,10 @@ static int show_tree_object(const struct object_id *oid,
 static void show_setup_revisions_tweak(struct rev_info *rev,
                                       struct setup_revision_opt *opt)
 {
-       if (rev->ignore_merges < 0) {
-               /* There was no "-m" variant on the command line */
-               rev->ignore_merges = 0;
-               if (!rev->first_parent_only && !rev->combine_merges) {
-                       /* No "--first-parent", "-c", or "--cc" */
-                       rev->combine_merges = 1;
-                       rev->dense_combined_merges = 1;
-               }
-       }
+       if (rev->first_parent_only)
+               diff_merges_default_to_first_parent(rev);
+       else
+               diff_merges_default_to_dense_combined(rev);
        if (!rev->diffopt.output_format)
                rev->diffopt.output_format = DIFF_FORMAT_PATCH;
 }
@@ -736,12 +733,8 @@ static void log_setup_revisions_tweak(struct rev_info *rev,
            rev->prune_data.nr == 1)
                rev->diffopt.flags.follow_renames = 1;
 
-       /* Turn --cc/-c into -p --cc/-c when -p was not given */
-       if (!rev->diffopt.output_format && rev->combine_merges)
-               rev->diffopt.output_format = DIFF_FORMAT_PATCH;
-
-       if (rev->first_parent_only && rev->ignore_merges < 0)
-               rev->ignore_merges = 0;
+       if (rev->first_parent_only)
+               diff_merges_default_to_first_parent(rev);
 }
 
 int cmd_log(int argc, const char **argv, const char *prefix)
@@ -1231,14 +1224,20 @@ static void make_cover_letter(struct rev_info *rev, int use_separate_file,
                 */
                struct diff_options opts;
                struct strvec other_arg = STRVEC_INIT;
+               struct range_diff_options range_diff_opts = {
+                       .creation_factor = rev->creation_factor,
+                       .dual_color = 1,
+                       .diffopt = &opts,
+                       .other_arg = &other_arg
+               };
+
                diff_setup(&opts);
                opts.file = rev->diffopt.file;
                opts.use_color = rev->diffopt.use_color;
                diff_setup_done(&opts);
                fprintf_ln(rev->diffopt.file, "%s", rev->rdiff_title);
                get_notes_args(&other_arg, rev);
-               show_range_diff(rev->rdiff1, rev->rdiff2,
-                               rev->creation_factor, 1, &opts, &other_arg);
+               show_range_diff(rev->rdiff1, rev->rdiff2, &range_diff_opts);
                strvec_clear(&other_arg);
        }
 }
@@ -1680,7 +1679,7 @@ static void infer_range_diff_ranges(struct strbuf *r1,
                                    struct commit *head)
 {
        const char *head_oid = oid_to_hex(&head->object.oid);
-       int prev_is_range = !!strstr(prev, "..");
+       int prev_is_range = is_range_diff_range(prev);
 
        if (prev_is_range)
                strbuf_addstr(r1, prev);
@@ -1963,7 +1962,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
                 * file, but but we must instruct it not to close after each
                 * diff.
                 */
-               rev.diffopt.close_file = 0;
+               rev.diffopt.no_free = 1;
        } else {
                int saved;