[PATCH 1/3] toposort: rename lifo field

2013-06-06 Thread Junio C Hamano
The primary invariant of sort_in_topological_order() is to emit all
children before their parent is emitted.  When traversing a forked
history like this with git log C E:

ABC
 \
  DE

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, which is the default
behaviour for --topo-order output.

The lifo parameter of the sort_in_topological_order() function is
used to implement this behaviour.  After inspecting C, we notice and
record that B needs to be inspected, and 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, that may have already been sitting in the work to
be done set.

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.

But the name lifo is too tied to the way how the function implements
its behaviour, and does not describe _what_ the desired semantics is.

Replace the lifo field with an enum rev_sort_order, with two
possible values: REV_SORT_IN_GRAPH_ORDER and REV_SORT_BY_COMMIT_DATE.

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 gits...@pobox.com
---
 builtin/log.c |  2 +-
 builtin/show-branch.c | 14 --
 commit.c  | 12 
 commit.h  | 14 +++---
 revision.c| 10 +-
 revision.h|  6 +-
 6 files changed, 38 insertions(+), 20 deletions(-)

diff --git a/builtin/log.c b/builtin/log.c
index 8f0b2e8..8d26042 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 d208fd6..7c57985 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[,base]),
N_(show n 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 66a6c00..fc1734b 100644
--- a/commit.c
+++ b/commit.c
@@ -507,7 +507,7 @@ define_commit_slab(indegree_slab, 

Re: [PATCH 1/3] toposort: rename lifo field

2013-06-06 Thread Eric Sunshine
On Fri, Jun 7, 2013 at 1:11 AM, Junio C Hamano gits...@pobox.com wrote:
 The primary invariant of sort_in_topological_order() is to emit all
 children before their parent is emitted.  When traversing a forked

s/parent is/parents are/

 history like this with git log C E:

 ABC
  \
   DE

 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, which is the default
 behaviour for --topo-order output.

 The lifo parameter of the sort_in_topological_order() function is
 used to implement this behaviour.  After inspecting C, we notice and
 record that B needs to be inspected, and 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, that may have already been sitting in the work to
 be done set.

 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.

 But the name lifo is too tied to the way how the function implements
 its behaviour, and does not describe _what_ the desired semantics is.

 Replace the lifo field with an enum rev_sort_order, with two
 possible values: REV_SORT_IN_GRAPH_ORDER and REV_SORT_BY_COMMIT_DATE.

 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 gits...@pobox.com
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 1/3] toposort: rename lifo field

2013-06-06 Thread Junio C Hamano
Eric Sunshine sunsh...@sunshineco.com writes:

 On Fri, Jun 7, 2013 at 1:11 AM, Junio C Hamano gits...@pobox.com wrote:
 The primary invariant of sort_in_topological_order() is to emit all
 children before their parent is emitted.  When traversing a forked

 s/parent is/parents are/

Hmm, not quite.  The above refers to:

  B
 /
A---C
 \
  D

where A is the parent, B, C and D are all its children.  We want to
emit all children (B, C and D) before their parent A _is_ emitted.
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html