Format tweaks for asciidoc.
[gitweb.git] / commit.c
index 67e11d7a4f211c1d2cf62635029f60597ff618de..eb42d517a4959d83593b7ba9e8fcbc650fea7a5e 100644 (file)
--- a/commit.c
+++ b/commit.c
@@ -212,7 +212,8 @@ int parse_commit_buffer(struct commit *item, void *buffer, unsigned long size)
        if (memcmp(bufptr, "tree ", 5))
                return error("bogus commit object %s", sha1_to_hex(item->object.sha1));
        if (get_sha1_hex(bufptr + 5, parent) < 0)
-               return error("bad tree pointer in commit %s\n", sha1_to_hex(item->object.sha1));
+               return error("bad tree pointer in commit %s",
+                            sha1_to_hex(item->object.sha1));
        item->tree = lookup_tree(parent);
        if (item->tree)
                n_refs++;
@@ -568,10 +569,28 @@ int count_parents(struct commit * commit)
         return count;
 }
 
+void topo_sort_default_setter(struct commit *c, void *data)
+{
+       c->object.util = data;
+}
+
+void *topo_sort_default_getter(struct commit *c)
+{
+       return c->object.util;
+}
+
 /*
  * 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)
+{
+       sort_in_topological_order_fn(list, lifo, topo_sort_default_setter,
+                                    topo_sort_default_getter);
+}
+
+void sort_in_topological_order_fn(struct commit_list ** list, int lifo,
+                                 topo_sort_set_fn_t setter,
+                                 topo_sort_get_fn_t getter)
 {
        struct commit_list * next = *list;
        struct commit_list * work = NULL, **insert;
@@ -595,7 +614,7 @@ void sort_in_topological_order(struct commit_list ** list)
        next=*list;
        while (next) {
                next_nodes->list_item = next;
-               next->item->object.util = next_nodes;
+               setter(next->item, next_nodes);
                next_nodes++;
                next = next->next;
        }
@@ -605,8 +624,8 @@ void sort_in_topological_order(struct commit_list ** list)
                struct commit_list * parents = next->item->parents;
                while (parents) {
                        struct commit * parent=parents->item;
-                       struct sort_node * pn = (struct sort_node *)parent->object.util;
-                       
+                       struct sort_node * pn = (struct sort_node *) getter(parent);
+
                        if (pn)
                                pn->indegree++;
                        parents=parents->next;
@@ -623,32 +642,39 @@ void sort_in_topological_order(struct commit_list ** list)
        next=*list;
        insert = &work;
        while (next) {
-               struct sort_node * node = (struct sort_node *)next->item->object.util;
+               struct sort_node * node = (struct sort_node *) getter(next->item);
 
                if (node->indegree == 0) {
                        insert = &commit_list_insert(next->item, insert)->next;
                }
                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;
+               struct sort_node * work_node = (struct sort_node *) getter(work_item);
                struct commit_list * parents = work_item->parents;
 
                while (parents) {
                        struct commit * parent=parents->item;
-                       struct sort_node * pn = (struct sort_node *)parent->object.util;
-                       
+                       struct sort_node * pn = (struct sort_node *) getter(parent);
+
                        if (pn) {
-                               /* 
+                               /*
                                 * parents are only enqueued for emission 
                                  * when all their children have been emitted thereby
                                  * 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;
                }
@@ -659,7 +685,7 @@ void sort_in_topological_order(struct commit_list ** list)
                *pptr = work_node->list_item;
                pptr = &(*pptr)->next;
                *pptr = NULL;
-               work_item->object.util = NULL;
+               setter(work_item, NULL);
        }
        free(nodes);
 }