Add "--early-output" log flag for interactive GUI use
[gitweb.git] / revision.c
index e76da0d448f81d8b6b496990bc2568fef3662671..26610bb42d1c2359ac27af3e8ad4b92c888f3b16 100644 (file)
@@ -10,6 +10,8 @@
 #include "reflog-walk.h"
 #include "patch-ids.h"
 
+volatile show_early_output_fn_t show_early_output;
+
 static char *path_name(struct name_path *path, const char *name)
 {
        struct name_path *p;
@@ -533,6 +535,7 @@ static int limit_list(struct rev_info *revs)
                struct commit_list *entry = list;
                struct commit *commit = list->item;
                struct object *obj = &commit->object;
+               show_early_output_fn_t show;
 
                list = list->next;
                free(entry);
@@ -550,6 +553,13 @@ static int limit_list(struct rev_info *revs)
                if (revs->min_age != -1 && (commit->date > revs->min_age))
                        continue;
                p = &commit_list_insert(commit, p)->next;
+
+               show = show_early_output;
+               if (!show)
+                       continue;
+
+               show(revs, newlist);
+               show_early_output = NULL;
        }
        if (revs->cherry_pick)
                cherry_pick_list(newlist, revs);
@@ -677,9 +687,6 @@ void init_revisions(struct rev_info *revs, const char *prefix)
        revs->prune_fn = NULL;
        revs->prune_data = NULL;
 
-       revs->topo_setter = topo_sort_default_setter;
-       revs->topo_getter = topo_sort_default_getter;
-
        revs->commit_format = CMIT_FMT_DEFAULT;
 
        diff_setup(&revs->diffopt);
@@ -994,6 +1001,18 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch
                                revs->topo_order = 1;
                                continue;
                        }
+                       if (!prefixcmp(arg, "--early-output")) {
+                               int count = 100;
+                               switch (arg[14]) {
+                               case '=':
+                                       count = atoi(arg+15);
+                                       /* Fallthrough */
+                               case 0:
+                                       revs->topo_order = 1;
+                                       revs->early_output = count;
+                                       continue;
+                               }
+                       }
                        if (!strcmp(arg, "--parents")) {
                                revs->parents = 1;
                                continue;
@@ -1303,9 +1322,7 @@ int prepare_revision_walk(struct rev_info *revs)
                if (limit_list(revs) < 0)
                        return -1;
        if (revs->topo_order)
-               sort_in_topological_order_fn(&revs->commits, revs->lifo,
-                                            revs->topo_setter,
-                                            revs->topo_getter);
+               sort_in_topological_order(&revs->commits, revs->lifo);
        return 0;
 }