topo-order: make --date-order optional.
authorJunio C Hamano <junkio@cox.net>
Thu, 16 Feb 2006 06:05:33 +0000 (22:05 -0800)
committerJunio C Hamano <junkio@cox.net>
Thu, 16 Feb 2006 06:12:06 +0000 (22:12 -0800)
This adds --date-order to rev-list; it is similar to topo order
in the sense that no parent comes before all of its children,
but otherwise things are still ordered in the commit timestamp
order.

The same flag is also added to show-branch.

Signed-off-by: Junio C Hamano <junkio@cox.net>
commit.c
commit.h
rev-list.c
rev-parse.c
show-branch.c

index 67e11d7a4f211c1d2cf62635029f60597ff618de..c550a00d8242f9a57e0bd008d952f24e1b91ad35 100644 (file)
--- 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;
                }
index 986b22de8abd01e7404bc4f195be0d11baefb13a..70a7c75e6590ae7f8eef50f91a495fc6138fda4a 100644 (file)
--- 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 */
index 63391fc1136d4d4045db6406face4c53915cd5bf..f2d1105cae19fbda9643846834a8c3633ff77447 100644 (file)
@@ -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
index b82f294a78994e512c4f30da5bb4ba3eca3f95b4..9161faed1e916c0a3d53c0df4905a2261e626131 100644 (file)
@@ -48,6 +48,7 @@ static int is_rev_argument(const char *arg)
                "--show-breaks",
                "--sparse",
                "--topo-order",
+               "--date-order",
                "--unpacked",
                NULL
        };
index 511fd3b656ec0f66492994c21bb024a52f482a78..5a86ae2f9ed3159d082158c04bea51c39cb4477f 100644 (file)
@@ -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)