]> git.ipfire.org Git - thirdparty/git.git/blobdiff - revision.c
Merge branch 'ab/pager-exit-log'
[thirdparty/git.git] / revision.c
index 7ec9b634e36ca42d5275815739ea68d390e629a0..b78733f5089b0dcef8eed71c44243a3b9a6f86db 100644 (file)
@@ -5,6 +5,7 @@
 #include "tree.h"
 #include "commit.h"
 #include "diff.h"
+#include "diff-merges.h"
 #include "refs.h"
 #include "revision.h"
 #include "repository.h"
@@ -1808,7 +1809,6 @@ void repo_init_revisions(struct repository *r,
 
        revs->repo = r;
        revs->abbrev = DEFAULT_ABBREV;
-       revs->ignore_merges = -1;
        revs->simplify_history = 1;
        revs->pruning.repo = r;
        revs->pruning.flags.recursive = 1;
@@ -2343,34 +2343,8 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
                revs->diff = 1;
                revs->diffopt.flags.recursive = 1;
                revs->diffopt.flags.tree_in_recursive = 1;
-       } else if (!strcmp(arg, "-m")) {
-               /*
-                * To "diff-index", "-m" means "match missing", and to the "log"
-                * family of commands, it means "show full diff for merges". Set
-                * both fields appropriately.
-                */
-               revs->ignore_merges = 0;
-               revs->match_missing = 1;
-       } else if ((argcount = parse_long_opt("diff-merges", argv, &optarg))) {
-               if (!strcmp(optarg, "off")) {
-                       revs->ignore_merges = 1;
-               } else {
-                       die(_("unknown value for --diff-merges: %s"), optarg);
-               }
+       } else if ((argcount = diff_merges_parse_opts(revs, argv))) {
                return argcount;
-       } else if (!strcmp(arg, "--no-diff-merges")) {
-               revs->ignore_merges = 1;
-       } else if (!strcmp(arg, "-c")) {
-               revs->diff = 1;
-               revs->dense_combined_merges = 0;
-               revs->combine_merges = 1;
-       } else if (!strcmp(arg, "--combined-all-paths")) {
-               revs->diff = 1;
-               revs->combined_all_paths = 1;
-       } else if (!strcmp(arg, "--cc")) {
-               revs->diff = 1;
-               revs->dense_combined_merges = 1;
-               revs->combine_merges = 1;
        } else if (!strcmp(arg, "-v")) {
                revs->verbose_header = 1;
        } else if (!strcmp(arg, "--pretty")) {
@@ -2491,8 +2465,6 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
        } else if ((argcount = parse_long_opt("grep", argv, &optarg))) {
                add_message_grep(revs, optarg);
                return argcount;
-       } else if (!strcmp(arg, "--grep-debug")) {
-               revs->grep_filter.debug = 1;
        } else if (!strcmp(arg, "--basic-regexp")) {
                revs->grep_filter.pattern_type_option = GREP_PATTERN_TYPE_BRE;
        } else if (!strcmp(arg, "--extended-regexp") || !strcmp(arg, "-E")) {
@@ -2867,12 +2839,8 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct s
                        copy_pathspec(&revs->diffopt.pathspec,
                                      &revs->prune_data);
        }
-       if (revs->combine_merges && revs->ignore_merges < 0)
-               revs->ignore_merges = 0;
-       if (revs->ignore_merges < 0)
-               revs->ignore_merges = 1;
-       if (revs->combined_all_paths && !revs->combine_merges)
-               die("--combined-all-paths makes no sense without -c or --cc");
+
+       diff_merges_setup_revs(revs);
 
        revs->diffopt.abbrev = revs->abbrev;
 
@@ -3302,7 +3270,7 @@ define_commit_slab(indegree_slab, int);
 define_commit_slab(author_date_slab, timestamp_t);
 
 struct topo_walk_info {
-       uint32_t min_generation;
+       timestamp_t min_generation;
        struct prio_queue explore_queue;
        struct prio_queue indegree_queue;
        struct prio_queue topo_queue;
@@ -3310,6 +3278,26 @@ struct topo_walk_info {
        struct author_date_slab author_date;
 };
 
+static int topo_walk_atexit_registered;
+static unsigned int count_explore_walked;
+static unsigned int count_indegree_walked;
+static unsigned int count_topo_walked;
+
+static void trace2_topo_walk_statistics_atexit(void)
+{
+       struct json_writer jw = JSON_WRITER_INIT;
+
+       jw_object_begin(&jw, 0);
+       jw_object_intmax(&jw, "count_explore_walked", count_explore_walked);
+       jw_object_intmax(&jw, "count_indegree_walked", count_indegree_walked);
+       jw_object_intmax(&jw, "count_topo_walked", count_topo_walked);
+       jw_end(&jw);
+
+       trace2_data_json("topo_walk", the_repository, "statistics", &jw);
+
+       jw_release(&jw);
+}
+
 static inline void test_flag_and_insert(struct prio_queue *q, struct commit *c, int flag)
 {
        if (c->object.flags & flag)
@@ -3331,6 +3319,8 @@ static void explore_walk_step(struct rev_info *revs)
        if (repo_parse_commit_gently(revs->repo, c, 1) < 0)
                return;
 
+       count_explore_walked++;
+
        if (revs->sort_order == REV_SORT_BY_AUTHOR_DATE)
                record_author_date(&info->author_date, c);
 
@@ -3348,7 +3338,7 @@ static void explore_walk_step(struct rev_info *revs)
 }
 
 static void explore_to_depth(struct rev_info *revs,
-                            uint32_t gen_cutoff)
+                            timestamp_t gen_cutoff)
 {
        struct topo_walk_info *info = revs->topo_walk_info;
        struct commit *c;
@@ -3369,12 +3359,17 @@ static void indegree_walk_step(struct rev_info *revs)
        if (repo_parse_commit_gently(revs->repo, c, 1) < 0)
                return;
 
+       count_indegree_walked++;
+
        explore_to_depth(revs, commit_graph_generation(c));
 
        for (p = c->parents; p; p = p->next) {
                struct commit *parent = p->item;
                int *pi = indegree_slab_at(&info->indegree, parent);
 
+               if (repo_parse_commit_gently(revs->repo, parent, 1) < 0)
+                       return;
+
                if (*pi)
                        (*pi)++;
                else
@@ -3388,7 +3383,7 @@ static void indegree_walk_step(struct rev_info *revs)
 }
 
 static void compute_indegrees_to_depth(struct rev_info *revs,
-                                      uint32_t gen_cutoff)
+                                      timestamp_t gen_cutoff)
 {
        struct topo_walk_info *info = revs->topo_walk_info;
        struct commit *c;
@@ -3446,7 +3441,7 @@ static void init_topo_walk(struct rev_info *revs)
        info->min_generation = GENERATION_NUMBER_INFINITY;
        for (list = revs->commits; list; list = list->next) {
                struct commit *c = list->item;
-               uint32_t generation;
+               timestamp_t generation;
 
                if (repo_parse_commit_gently(revs->repo, c, 1))
                        continue;
@@ -3478,6 +3473,11 @@ static void init_topo_walk(struct rev_info *revs)
         */
        if (revs->sort_order == REV_SORT_IN_GRAPH_ORDER)
                prio_queue_reverse(&info->topo_queue);
+
+       if (trace2_is_enabled() && !topo_walk_atexit_registered) {
+               atexit(trace2_topo_walk_statistics_atexit);
+               topo_walk_atexit_registered = 1;
+       }
 }
 
 static struct commit *next_topo_commit(struct rev_info *revs)
@@ -3504,10 +3504,12 @@ static void expand_topo_walk(struct rev_info *revs, struct commit *commit)
                            oid_to_hex(&commit->object.oid));
        }
 
+       count_topo_walked++;
+
        for (p = commit->parents; p; p = p->next) {
                struct commit *parent = p->item;
                int *pi;
-               uint32_t generation;
+               timestamp_t generation;
 
                if (parent->object.flags & UNINTERESTING)
                        continue;