diff --git a/builtin/log.c b/builtin/log.c index 8f0b2e84fe..8d26042b01 100644 --- a/builtin/log.c +++ b/builtin/log.c @@ -205,7 +205,7 @@ static void log_show_early(struct rev_info *revs, struct commit_list *list) int i = revs->early_output; int show_header = 1; - sort_in_topological_order(&list, revs->lifo); + sort_in_topological_order(&list, revs->sort_order); while (list && i) { struct commit *commit = list->item; switch (simplify_commit(revs, commit)) { diff --git a/builtin/show-branch.c b/builtin/show-branch.c index d208fd6c68..7c57985c40 100644 --- a/builtin/show-branch.c +++ b/builtin/show-branch.c @@ -631,7 +631,7 @@ int cmd_show_branch(int ac, const char **av, const char *prefix) int num_rev, i, extra = 0; int all_heads = 0, all_remotes = 0; int all_mask, all_revs; - int lifo = 1; + enum rev_sort_order sort_order = REV_SORT_IN_GRAPH_ORDER; char head[128]; const char *head_p; int head_len; @@ -666,15 +666,17 @@ int cmd_show_branch(int ac, const char **av, const char *prefix) N_("show possible merge bases")), OPT_BOOLEAN(0, "independent", &independent, N_("show refs unreachable from any other ref")), - OPT_BOOLEAN(0, "topo-order", &lifo, - N_("show commits in topological order")), + OPT_SET_INT(0, "topo-order", &sort_order, + N_("show commits in topological order"), + REV_SORT_IN_GRAPH_ORDER), OPT_BOOLEAN(0, "topics", &topics, N_("show only commits not on the first branch")), OPT_SET_INT(0, "sparse", &dense, N_("show merges reachable from only one tip"), 0), - OPT_SET_INT(0, "date-order", &lifo, + OPT_SET_INT(0, "date-order", &sort_order, N_("show commits where no parent comes before its " - "children"), 0), + "children"), + REV_SORT_BY_COMMIT_DATE), { OPTION_CALLBACK, 'g', "reflog", &reflog_base, N_("[,]"), N_("show most recent ref-log entries starting at " "base"), @@ -901,7 +903,7 @@ int cmd_show_branch(int ac, const char **av, const char *prefix) exit(0); /* Sort topologically */ - sort_in_topological_order(&seen, lifo); + sort_in_topological_order(&seen, sort_order); /* Give names to commits */ if (!sha1_name && !no_name) diff --git a/commit.c b/commit.c index f97456ddfa..11b9635df2 100644 --- a/commit.c +++ b/commit.c @@ -512,7 +512,7 @@ define_commit_slab(indegree_slab, int); /* * Performs an in-place topological sort on the list supplied. */ -void sort_in_topological_order(struct commit_list ** list, int lifo) +void sort_in_topological_order(struct commit_list ** list, enum rev_sort_order sort_order) { struct commit_list *next, *orig = *list; struct commit_list *work, **insert; @@ -561,7 +561,7 @@ void sort_in_topological_order(struct commit_list ** list, int lifo) } /* process the list in topological order */ - if (!lifo) + if (sort_order != REV_SORT_IN_GRAPH_ORDER) commit_list_sort_by_date(&work); pptr = list; @@ -588,10 +588,14 @@ void sort_in_topological_order(struct commit_list ** list, int lifo) * guaranteeing topological order. */ if (--(*pi) == 1) { - if (!lifo) + switch (sort_order) { + case REV_SORT_BY_COMMIT_DATE: commit_list_insert_by_date(parent, &work); - else + break; + default: /* REV_SORT_IN_GRAPH_ORDER */ commit_list_insert(parent, &work); + break; + } } } /* diff --git a/commit.h b/commit.h index 70e749d69f..247e474e44 100644 --- a/commit.h +++ b/commit.h @@ -139,15 +139,23 @@ struct commit *pop_commit(struct commit_list **stack); void clear_commit_marks(struct commit *commit, unsigned int mark); void clear_commit_marks_for_object_array(struct object_array *a, unsigned mark); + +enum rev_sort_order { + REV_SORT_IN_GRAPH_ORDER = 0, + REV_SORT_BY_COMMIT_DATE +}; + /* * Performs an in-place topological sort of list supplied. * * invariant of resulting list is: * a reachable from b => ord(b) < ord(a) - * in addition, when lifo == 0, commits on parallel tracks are - * sorted in the dates order. + * sort_order further specifies: + * REV_SORT_IN_GRAPH_ORDER: try to show a commit on a single-parent + * chain together. + * REV_SORT_BY_COMMIT_DATE: show eligible commits in committer-date order. */ -void sort_in_topological_order(struct commit_list ** list, int lifo); +void sort_in_topological_order(struct commit_list **, enum rev_sort_order); struct commit_graft { unsigned char sha1[20]; diff --git a/revision.c b/revision.c index cf620c6b36..966ebbc542 100644 --- a/revision.c +++ b/revision.c @@ -1038,7 +1038,7 @@ void init_revisions(struct rev_info *revs, const char *prefix) DIFF_OPT_SET(&revs->pruning, QUICK); revs->pruning.add_remove = file_add_remove; revs->pruning.change = file_change; - revs->lifo = 1; + revs->sort_order = REV_SORT_IN_GRAPH_ORDER; revs->dense = 1; revs->prefix = prefix; revs->max_age = -1; @@ -1373,7 +1373,7 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg } else if (!strcmp(arg, "--merge")) { revs->show_merge = 1; } else if (!strcmp(arg, "--topo-order")) { - revs->lifo = 1; + revs->sort_order = REV_SORT_IN_GRAPH_ORDER; revs->topo_order = 1; } else if (!strcmp(arg, "--simplify-merges")) { revs->simplify_merges = 1; @@ -1391,7 +1391,7 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg revs->prune = 1; load_ref_decorations(DECORATE_SHORT_REFS); } else if (!strcmp(arg, "--date-order")) { - revs->lifo = 0; + revs->sort_order = REV_SORT_BY_COMMIT_DATE; revs->topo_order = 1; } else if (!prefixcmp(arg, "--early-output")) { int count = 100; @@ -2165,7 +2165,7 @@ int prepare_revision_walk(struct rev_info *revs) if (limit_list(revs) < 0) return -1; if (revs->topo_order) - sort_in_topological_order(&revs->commits, revs->lifo); + sort_in_topological_order(&revs->commits, revs->sort_order); if (revs->simplify_merges) simplify_merges(revs); if (revs->children.name) @@ -2480,7 +2480,7 @@ static void create_boundary_commit_list(struct rev_info *revs) * If revs->topo_order is set, sort the boundary commits * in topological order */ - sort_in_topological_order(&revs->commits, revs->lifo); + sort_in_topological_order(&revs->commits, revs->sort_order); } static struct commit *get_revision_internal(struct rev_info *revs) diff --git a/revision.h b/revision.h index 5da09ee3ef..2a5e325a36 100644 --- a/revision.h +++ b/revision.h @@ -4,6 +4,7 @@ #include "parse-options.h" #include "grep.h" #include "notes.h" +#include "commit.h" #define SEEN (1u<<0) #define UNINTERESTING (1u<<1) @@ -60,6 +61,10 @@ struct rev_info { const char *prefix; const char *def; struct pathspec prune_data; + + /* topo-sort */ + enum rev_sort_order sort_order; + unsigned int early_output:1, ignore_missing:1; @@ -70,7 +75,6 @@ struct rev_info { show_all:1, remove_empty_trees:1, simplify_history:1, - lifo:1, topo_order:1, simplify_merges:1, simplify_by_decoration:1,