summaryrefslogtreecommitdiff
path: root/commit.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2013-06-06 16:07:14 -0700
committerJunio C Hamano <gitster@pobox.com>2013-06-11 15:15:21 -0700
commit08f704f294e4a3525b405c2cb1f4ee85e73fd92c (patch)
tree0c65b7271bf8695a010780fa44a9b8fe5e192f62 /commit.c
parenta84b794ad0622103cae98639d7176b2451dc6f92 (diff)
downloadgit-08f704f294e4a3525b405c2cb1f4ee85e73fd92c.tar.gz
toposort: rename "lifo" field
The primary invariant of sort_in_topological_order() is that a parent commit is not emitted until all children of it are. When traversing a forked history like this with "git log C E": A----B----C \ D----E we ensure that A is emitted after all of B, C, D, and E are done, B has to wait until C is done, and D has to wait until E is done. In some applications, however, we would further want to control how these child commits B, C, D and E on two parallel ancestry chains are shown. Most of the time, we would want to see C and B emitted together, and then E and D, and finally A (i.e. the --topo-order output). The "lifo" parameter of the sort_in_topological_order() function is used to control this behaviour. We start the traversal by knowing two commits, C and E. While keeping in mind that we also need to inspect E later, we pick C first to inspect, and we notice and record that B needs to be inspected. By structuring the "work to be done" set as a LIFO stack, we ensure that B is inspected next, before other in-flight commits we had known that we will need to inspect, e.g. E. When showing in --date-order, we would want to see commits ordered by timestamps, i.e. show C, E, B and D in this order before showing A, possibly mixing commits from two parallel histories together. When "lifo" parameter is set to false, the function keeps the "work to be done" set sorted in the date order to realize this semantics. After inspecting C, we add B to the "work to be done" set, but the next commit we inspect from the set is E which is newer than B. The name "lifo", however, is too strongly tied to the way how the function implements its behaviour, and does not describe what the behaviour _means_. Replace this field with an enum rev_sort_order, with two possible values: REV_SORT_IN_GRAPH_ORDER and REV_SORT_BY_COMMIT_DATE, and update the existing code. The mechanical replacement rule is: "lifo == 0" is equivalent to "sort_order == REV_SORT_BY_COMMIT_DATE" "lifo == 1" is equivalent to "sort_order == REV_SORT_IN_GRAPH_ORDER" Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'commit.c')
-rw-r--r--commit.c12
1 files changed, 8 insertions, 4 deletions
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;
+ }
}
}
/*