diff options
author | Johannes Schindelin <Johannes.Schindelin@gmx.de> | 2007-01-20 23:04:02 +0100 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2007-01-20 23:46:53 -0800 |
commit | 9c5e66e97da8cadcc45a278c4e39a7d25674d4ff (patch) | |
tree | 1f14d50a5398779c8738645fadd4b325086bfc0b /revision.c | |
parent | eaf6459e4d482af51429f9464125621b805eb5fd (diff) | |
download | git-9c5e66e97da8cadcc45a278c4e39a7d25674d4ff.tar.gz git-9c5e66e97da8cadcc45a278c4e39a7d25674d4ff.tar.xz |
Teach revision machinery about --reverse
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>
Diffstat (limited to 'revision.c')
-rw-r--r-- | revision.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/revision.c b/revision.c index ebd025064..6726f736e 100644 --- a/revision.c +++ b/revision.c @@ -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) { @@ -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) |