diff --git a/commit.c b/commit.c index 67e11d7a4f..c550a00d82 100644 --- a/commit.c +++ b/commit.c @@ -571,7 +571,7 @@ int count_parents(struct commit * commit) /* * Performs an in-place topological sort on the list supplied. */ -void sort_in_topological_order(struct commit_list ** list) +void sort_in_topological_order(struct commit_list ** list, int lifo) { struct commit_list * next = *list; struct commit_list * work = NULL, **insert; @@ -630,7 +630,10 @@ void sort_in_topological_order(struct commit_list ** list) } next=next->next; } + /* process the list in topological order */ + if (!lifo) + sort_by_date(&work); while (work) { struct commit * work_item = pop_commit(&work); struct sort_node * work_node = (struct sort_node *)work_item->object.util; @@ -647,8 +650,12 @@ void sort_in_topological_order(struct commit_list ** list) * guaranteeing topological order. */ pn->indegree--; - if (!pn->indegree) - commit_list_insert(parent, &work); + if (!pn->indegree) { + if (!lifo) + insert_by_date(parent, &work); + else + commit_list_insert(parent, &work); + } } parents=parents->next; } diff --git a/commit.h b/commit.h index 986b22de8a..70a7c75e65 100644 --- a/commit.h +++ b/commit.h @@ -72,6 +72,8 @@ int count_parents(struct commit * commit); * Post-conditions: * 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. */ -void sort_in_topological_order(struct commit_list ** list); +void sort_in_topological_order(struct commit_list ** list, int lifo); #endif /* COMMIT_H */ diff --git a/rev-list.c b/rev-list.c index 63391fc113..f2d1105cae 100644 --- a/rev-list.c +++ b/rev-list.c @@ -27,6 +27,7 @@ static const char rev_list_usage[] = " ordering output:\n" " --merge-order [ --show-breaks ]\n" " --topo-order\n" +" --date-order\n" " formatting output:\n" " --parents\n" " --objects\n" @@ -56,6 +57,7 @@ static int merge_order = 0; static int show_breaks = 0; static int stop_traversal = 0; static int topo_order = 0; +static int lifo = 1; static int no_merges = 0; static const char **paths = NULL; static int remove_empty_trees = 0; @@ -856,6 +858,13 @@ int main(int argc, const char **argv) } if (!strcmp(arg, "--topo-order")) { topo_order = 1; + lifo = 1; + limited = 1; + continue; + } + if (!strcmp(arg, "--date-order")) { + topo_order = 1; + lifo = 0; limited = 1; continue; } @@ -940,7 +949,7 @@ int main(int argc, const char **argv) if (limited) list = limit_list(list); if (topo_order) - sort_in_topological_order(&list); + sort_in_topological_order(&list, lifo); show_commit_list(list); } else { #ifndef NO_OPENSSL diff --git a/rev-parse.c b/rev-parse.c index b82f294a78..9161faed1e 100644 --- a/rev-parse.c +++ b/rev-parse.c @@ -48,6 +48,7 @@ static int is_rev_argument(const char *arg) "--show-breaks", "--sparse", "--topo-order", + "--date-order", "--unpacked", NULL }; diff --git a/show-branch.c b/show-branch.c index 511fd3b656..5a86ae2f9e 100644 --- a/show-branch.c +++ b/show-branch.c @@ -535,6 +535,7 @@ int main(int ac, char **av) int num_rev, i, extra = 0; int all_heads = 0, all_tags = 0; int all_mask, all_revs; + int lifo = 1; char head_path[128]; const char *head_path_p; int head_path_len; @@ -544,7 +545,6 @@ int main(int ac, char **av) int no_name = 0; int sha1_name = 0; int shown_merge_point = 0; - int topo_order = 0; int with_current_branch = 0; int head_at = -1; @@ -586,7 +586,9 @@ int main(int ac, char **av) else if (!strcmp(arg, "--independent")) independent = 1; else if (!strcmp(arg, "--topo-order")) - topo_order = 1; + lifo = 1; + else if (!strcmp(arg, "--date-order")) + lifo = 0; else usage(show_branch_usage); ac--; av++; @@ -710,8 +712,7 @@ int main(int ac, char **av) exit(0); /* Sort topologically */ - if (topo_order) - sort_in_topological_order(&seen); + sort_in_topological_order(&seen, lifo); /* Give names to commits */ if (!sha1_name && !no_name)