Skip to content

Commit

Permalink
Teach revision machinery about --reverse
Browse files Browse the repository at this point in the history
The option --reverse reverses the order of the commits.

[jc: with comments on rev_info.reverse from Simon 'corecode' Schubert.]

Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
dscho authored and Junio C Hamano committed Jan 21, 2007
1 parent eaf6459 commit 9c5e66e
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 1 deletion.
5 changes: 5 additions & 0 deletions Documentation/git-rev-list.txt
Expand Up @@ -27,6 +27,7 @@ SYNOPSIS
[ \--pretty | \--header ]
[ \--bisect ]
[ \--merge ]
[ \--reverse ]
[ \--walk-reflogs ]
<commit>... [ \-- <paths>... ]

Expand Down Expand Up @@ -266,6 +267,10 @@ By default, the commits are shown in reverse chronological order.
parent comes before all of its children, but otherwise things
are still ordered in the commit timestamp order.

--reverse::

Output the commits in reverse order.

Object Traversal
~~~~~~~~~~~~~~~~

Expand Down
38 changes: 38 additions & 0 deletions revision.c
Expand Up @@ -1057,6 +1057,10 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch
git_log_output_encoding = "";
continue;
}
if (!strcmp(arg, "--reverse")) {
revs->reverse ^= 1;
continue;
}

opts = diff_opt_parse(&revs->diffopt, argv+i, argc-i);
if (opts > 0) {
Expand Down Expand Up @@ -1285,6 +1289,40 @@ struct commit *get_revision(struct rev_info *revs)
{
struct commit *c = NULL;

if (revs->reverse) {
struct commit_list *list;

/*
* rev_info.reverse is used to note the fact that we
* want to output the list of revisions in reverse
* order. To accomplish this goal, reverse can have
* different values:
*
* 0 do nothing
* 1 reverse the list
* 2 internal use: we have already obtained and
* reversed the list, now we only need to yield
* its items.
*/

if (revs->reverse == 1) {
revs->reverse = 0;
list = NULL;
while ((c = get_revision(revs)))
commit_list_insert(c, &list);
revs->commits = list;
revs->reverse = 2;
}

if (!revs->commits)
return NULL;
c = revs->commits->item;
list = revs->commits->next;
free(revs->commits);
revs->commits = list;
return c;
}

if (0 < revs->skip_count) {
while ((c = get_revision_1(revs)) != NULL) {
if (revs->skip_count-- <= 0)
Expand Down
3 changes: 2 additions & 1 deletion revision.h
Expand Up @@ -42,7 +42,8 @@ struct rev_info {
unpacked:1, /* see also ignore_packed below */
boundary:1,
left_right:1,
parents:1;
parents:1,
reverse:2;

/* Diff flags */
unsigned int diff:1,
Expand Down

0 comments on commit 9c5e66e

Please sign in to comment.