* git-log to go forward instead of reverse?
@ 2006-07-10 18:42 Randal L. Schwartz
2006-07-10 19:01 ` Linus Torvalds
0 siblings, 1 reply; 11+ messages in thread
From: Randal L. Schwartz @ 2006-07-10 18:42 UTC (permalink / raw)
To: git
Am I missing an option to have git-log go forward in time rather than
backward? I'd really like "git-log --pretty=short ORIG_HEAD..HEAD" to show me
a story I can read. :)
--
Randal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095
<merlyn@stonehenge.com> <URL:http://www.stonehenge.com/merlyn/>
Perl/Unix/security consulting, Technical writing, Comedy, etc. etc.
See PerlTraining.Stonehenge.com for onsite and open-enrollment Perl training!
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: git-log to go forward instead of reverse?
2006-07-10 18:42 git-log to go forward instead of reverse? Randal L. Schwartz
@ 2006-07-10 19:01 ` Linus Torvalds
2006-07-10 19:06 ` Randal L. Schwartz
0 siblings, 1 reply; 11+ messages in thread
From: Linus Torvalds @ 2006-07-10 19:01 UTC (permalink / raw)
To: Randal L. Schwartz; +Cc: git
On Mon, 10 Jul 2006, Randal L. Schwartz wrote:
>
> Am I missing an option to have git-log go forward in time rather than
> backward? I'd really like "git-log --pretty=short ORIG_HEAD..HEAD" to show me
> a story I can read. :)
Well, as long as you realize that that automatically means that you have
to walk the whole commit list, and you won't be able to get the
incremental output that git-log and friends normally are able to give?
But this patch should do it. With it,
git log --reverse --pretty=short ORIG_HEAD..
should do what you want.
It is _not_ possible to reverse the "gitk" view with this patch, though,
as this does _not_ reverse parenthood information.
The "--reverse" flag could possibly be renamed.
Linus
---
diff --git a/revision.c b/revision.c
index 7df9089..13a3e40 100644
--- a/revision.c
+++ b/revision.c
@@ -698,6 +698,10 @@ int setup_revisions(int argc, const char
revs->topo_order = 1;
continue;
}
+ if (!strcmp(arg, "--reverse")) {
+ revs->reverse ^= 1;
+ continue;
+ }
if (!strcmp(arg, "--parents")) {
revs->parents = 1;
continue;
@@ -921,7 +925,7 @@ int setup_revisions(int argc, const char
add_pending_object(revs, object, def);
}
- if (revs->topo_order || revs->unpacked)
+ if (revs->topo_order || revs->unpacked || revs->reverse)
revs->limited = 1;
if (revs->prune_data) {
@@ -941,6 +945,19 @@ int setup_revisions(int argc, const char
return left;
}
+static struct commit_list *reverse_commit_list(struct commit_list *p)
+{
+ struct commit_list *result = NULL;
+
+ while (p) {
+ struct commit_list *next = p->next;
+ p->next = result;
+ result = p;
+ p = next;
+ }
+ return result;
+}
+
void prepare_revision_walk(struct rev_info *revs)
{
int nr = revs->pending.nr;
@@ -968,6 +985,8 @@ void prepare_revision_walk(struct rev_in
sort_in_topological_order_fn(&revs->commits, revs->lifo,
revs->topo_setter,
revs->topo_getter);
+ if (revs->reverse)
+ revs->commits = reverse_commit_list(revs->commits);
}
static int rewrite_one(struct rev_info *revs, struct commit **pp)
diff --git a/revision.h b/revision.h
index c010a08..ff6ce44 100644
--- a/revision.h
+++ b/revision.h
@@ -32,6 +32,7 @@ struct rev_info {
remove_empty_trees:1,
simplify_history:1,
lifo:1,
+ reverse:1,
topo_order:1,
tag_objects:1,
tree_objects:1,
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: git-log to go forward instead of reverse?
2006-07-10 19:01 ` Linus Torvalds
@ 2006-07-10 19:06 ` Randal L. Schwartz
2006-07-10 19:20 ` Linus Torvalds
0 siblings, 1 reply; 11+ messages in thread
From: Randal L. Schwartz @ 2006-07-10 19:06 UTC (permalink / raw)
To: Linus Torvalds; +Cc: git
>>>>> "Linus" == Linus Torvalds <torvalds@osdl.org> writes:
Linus> Well, as long as you realize that that automatically means that you
Linus> have to walk the whole commit list, and you won't be able to get the
Linus> incremental output that git-log and friends normally are able to give?
Wow. Yes, I think I can live with that for the application.
Linus> But this patch should do it.
Thanks!
--
Randal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095
<merlyn@stonehenge.com> <URL:http://www.stonehenge.com/merlyn/>
Perl/Unix/security consulting, Technical writing, Comedy, etc. etc.
See PerlTraining.Stonehenge.com for onsite and open-enrollment Perl training!
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: git-log to go forward instead of reverse?
2006-07-10 19:06 ` Randal L. Schwartz
@ 2006-07-10 19:20 ` Linus Torvalds
2006-07-10 19:25 ` Randal L. Schwartz
2006-07-10 19:26 ` Linus Torvalds
0 siblings, 2 replies; 11+ messages in thread
From: Linus Torvalds @ 2006-07-10 19:20 UTC (permalink / raw)
To: Randal L. Schwartz; +Cc: git
On Mon, 10 Jul 2006, Randal L. Schwartz wrote:
>
> Linus> Well, as long as you realize that that automatically means that you
> Linus> have to walk the whole commit list, and you won't be able to get the
> Linus> incremental output that git-log and friends normally are able to give?
>
> Wow. Yes, I think I can live with that for the application.
It's a big deal for me, I often end up doing things like
git log -p some-random-file
to see what has happened, and getting the most recent changes basically
instantaneously (rather than waiting for the thing to traverse all of the
history) is a big deal.
If you have a fairly small archive, or you don't use pathname limiting,
the history generation is so fast that you'll never even notice. But with
the kernel, doing something like
git log drivers/serial
takes just over two seconds for me, and if I had to wait for two seconds
before the first data starts arriving, I'd go nuts.
To see this in cold hard numbers:
// Full log
[torvalds@g5 linux]$ time git log drivers/serial > /dev/null
real 0m2.267s
user 0m2.204s
sys 0m0.020s
// Simulate "get the first screenful"
[torvalds@g5 linux]$ time git log drivers/serial | head -25 > /dev/null
real 0m0.054s
user 0m0.048s
sys 0m0.008s
// Simulate "get the first screenful of reverse output"
[torvalds@g5 linux]$ time git log --reverse drivers/serial | head > /dev/null
real 0m2.218s
user 0m2.176s
sys 0m0.044s
and it's the difference between the second and the third case I wanted to
point out.
The difference between getting the first screenful in 0.054 seconds versus
it taking 2.218 seconds is quite noticeable, and one of the things I've
actually spent a fair amount of time on is to make sure that the
incremental output case is the _common_ one for all the normal operations
like "git log -p".
Linus
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: git-log to go forward instead of reverse?
2006-07-10 19:20 ` Linus Torvalds
@ 2006-07-10 19:25 ` Randal L. Schwartz
2006-07-10 20:09 ` Linus Torvalds
2006-07-10 20:26 ` Junio C Hamano
2006-07-10 19:26 ` Linus Torvalds
1 sibling, 2 replies; 11+ messages in thread
From: Randal L. Schwartz @ 2006-07-10 19:25 UTC (permalink / raw)
To: Linus Torvalds; +Cc: git
>>>>> "Linus" == Linus Torvalds <torvalds@osdl.org> writes:
>> Wow. Yes, I think I can live with that for the application.
Linus> It's a big deal for me, I often end up doing things like
Linus> git log -p some-random-file
Linus> to see what has happened, and getting the most recent changes basically
Linus> instantaneously (rather than waiting for the thing to traverse all of the
Linus> history) is a big deal.
Well, this is for a "I'm connected to the net right now: please
refresh all of my git mirrors" script:
## (code here to cd to the right dir omitted)
git-fetch
if git-status | grep -v 'nothing to commit'
then echo UPDATE SKIPPED
else
if git-pull . origin | egrep -v 'up-to-date'
then git-log --pretty=short ORIG_HEAD..HEAD | cat
fi
fi
The log is just so I can quickly eyeball the interesting changes. The "cat"
is to keep git-log from starting a pager. (If there's a switch that does
*that* that I've overlooked, that'd be good too.)
--
Randal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095
<merlyn@stonehenge.com> <URL:http://www.stonehenge.com/merlyn/>
Perl/Unix/security consulting, Technical writing, Comedy, etc. etc.
See PerlTraining.Stonehenge.com for onsite and open-enrollment Perl training!
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: git-log to go forward instead of reverse?
2006-07-10 19:20 ` Linus Torvalds
2006-07-10 19:25 ` Randal L. Schwartz
@ 2006-07-10 19:26 ` Linus Torvalds
1 sibling, 0 replies; 11+ messages in thread
From: Linus Torvalds @ 2006-07-10 19:26 UTC (permalink / raw)
To: Randal L. Schwartz; +Cc: git
On Mon, 10 Jul 2006, Linus Torvalds wrote:
>
> The difference between getting the first screenful in 0.054 seconds versus
> it taking 2.218 seconds is quite noticeable, and one of the things I've
> actually spent a fair amount of time on is to make sure that the
> incremental output case is the _common_ one for all the normal operations
> like "git log -p".
Side note: the good news is that even with the reverse generation, if you
also generate _diffs_, the diffs will be generated incrementally, so:
// Full "git log" with diffs
[torvalds@g5 linux]$ time git log -p drivers/serial > /dev/null
real 0m3.409s
user 0m3.360s
sys 0m0.052s
// First screenful of reverse git log with diffs
[torvalds@g5 linux]$ time git log -p --reverse drivers/serial | head -25 > /dev/null
real 0m2.228s
user 0m2.216s
sys 0m0.012s
// First screenful of regular git log with diffs
[torvalds@g5 linux]$ time git log -p drivers/serial | head -25 > /dev/null
real 0m0.038s
user 0m0.036s
sys 0m0.004s
here you can see how the full "git log -p" is obviously more expensive
than the full "git log" was (the diff generation adds about a second to
the full time), but because the diffs are generated incrementally as they
are shown even with "--reverse", the first screenful of the "--reverse"
case didn't get any more expensive, because we didn't generate all the
diffs up-front, just the ones we needed.
And the first screenfull of the normal case obviously stays really fast,
because both history generation _and_ diff generation is all on-the-fly.
Linus
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: git-log to go forward instead of reverse?
2006-07-10 19:25 ` Randal L. Schwartz
@ 2006-07-10 20:09 ` Linus Torvalds
2006-07-10 20:16 ` Randal L. Schwartz
2006-07-10 21:45 ` Junio C Hamano
2006-07-10 20:26 ` Junio C Hamano
1 sibling, 2 replies; 11+ messages in thread
From: Linus Torvalds @ 2006-07-10 20:09 UTC (permalink / raw)
To: Randal L. Schwartz; +Cc: git
On Mon, 10 Jul 2006, Randal L. Schwartz wrote:
>
> then git-log --pretty=short ORIG_HEAD..HEAD | cat
> The log is just so I can quickly eyeball the interesting changes. The "cat"
> is to keep git-log from starting a pager. (If there's a switch that does
> *that* that I've overlooked, that'd be good too.)
Just do
PAGER= git log --pretty=short ORIG_HEAD..HEAD
instead.
And if you didn't know about "git shortlog" already, I personally actually
find it easier to read
git log --no-merges ORIG_HEAD.. | git shortlog
which orders things by author instead. It also reverses the log messages
as it does so, so each author will have the one-liners sorted oldest to
newest the way you wanted to (so you do _not_ want to pass --reverse to
that git-shortlog invocation).
Linus
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: git-log to go forward instead of reverse?
2006-07-10 20:09 ` Linus Torvalds
@ 2006-07-10 20:16 ` Randal L. Schwartz
2006-07-10 21:45 ` Junio C Hamano
1 sibling, 0 replies; 11+ messages in thread
From: Randal L. Schwartz @ 2006-07-10 20:16 UTC (permalink / raw)
To: Linus Torvalds; +Cc: git
>>>>> "Linus" == Linus Torvalds <torvalds@osdl.org> writes:
Linus> And if you didn't know about "git shortlog" already, I personally actually
Linus> find it easier to read
Linus> git log --no-merges ORIG_HEAD.. | git shortlog
Linus> which orders things by author instead. It also reverses the log
Linus> messages as it does so, so each author will have the one-liners sorted
Linus> oldest to newest the way you wanted to (so you do _not_ want to pass
Linus> --reverse to that git-shortlog invocation).
See -- I *knew* there was a shorter way.
Looks like I owe you lunch. (Again? :)
--
Randal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095
<merlyn@stonehenge.com> <URL:http://www.stonehenge.com/merlyn/>
Perl/Unix/security consulting, Technical writing, Comedy, etc. etc.
See PerlTraining.Stonehenge.com for onsite and open-enrollment Perl training!
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: git-log to go forward instead of reverse?
2006-07-10 19:25 ` Randal L. Schwartz
2006-07-10 20:09 ` Linus Torvalds
@ 2006-07-10 20:26 ` Junio C Hamano
2006-07-10 20:31 ` Randal L. Schwartz
1 sibling, 1 reply; 11+ messages in thread
From: Junio C Hamano @ 2006-07-10 20:26 UTC (permalink / raw)
To: Randal L. Schwartz; +Cc: git
merlyn@stonehenge.com (Randal L. Schwartz) writes:
> Well, this is for a "I'm connected to the net right now: please
> refresh all of my git mirrors" script:
>
> ## (code here to cd to the right dir omitted)
> git-fetch
> if git-status | grep -v 'nothing to commit'
git-status exits non-zero for "nothing to commit" case, so do
not grep its output, but check the status of the command, to see
if your tree is in a good shape to do a pull.
> then echo UPDATE SKIPPED
> else
> if git-pull . origin | egrep -v 'up-to-date'
> then git-log --pretty=short ORIG_HEAD..HEAD | cat
> fi
> fi
>
> The log is just so I can quickly eyeball the interesting changes.
Do we not leave ORIG_HEAD when we are already up-to-date? If so
that would be confusing... No, we do leave ORIG_HEAD no matter
what, so you do not have to have this inner if to grep
up-to-date (on the other hand, you might want to do intelligent
things when git-pull fails). So just drop the if and say
something like:
else
PAGER= ; export PAGER
git pull . origin &&
git log --pretty ORIG_HEAD..HEAD |
git shortlog
fi
> The "cat"
> is to keep git-log from starting a pager. (If there's a switch that does
> *that* that I've overlooked, that'd be good too.)
BTW,
PAGER=cat
export PAGER
This should work as more efficiently -- see pager.c ;-)
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: git-log to go forward instead of reverse?
2006-07-10 20:26 ` Junio C Hamano
@ 2006-07-10 20:31 ` Randal L. Schwartz
0 siblings, 0 replies; 11+ messages in thread
From: Randal L. Schwartz @ 2006-07-10 20:31 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git
>>>>> "Junio" == Junio C Hamano <junkio@cox.net> writes:
>> ## (code here to cd to the right dir omitted)
>> git-fetch
>> if git-status | grep -v 'nothing to commit'
Junio> git-status exits non-zero for "nothing to commit" case, so do
Junio> not grep its output, but check the status of the command, to see
Junio> if your tree is in a good shape to do a pull.
No, this is deliberate. I want to see nothing if we're up to date, but if
not, I want to see *everything else* that git-status said. This nice "grep
-v" does precisely the right thing.
Junio> Do we not leave ORIG_HEAD when we are already up-to-date? If so
Junio> that would be confusing... No, we do leave ORIG_HEAD no matter
Junio> what, so you do not have to have this inner if to grep
Junio> up-to-date (on the other hand, you might want to do intelligent
Junio> things when git-pull fails). So just drop the if and say
Junio> something like:
Junio> else
Junio> PAGER= ; export PAGER
Junio> git pull . origin &&
Junio> git log --pretty ORIG_HEAD..HEAD |
Junio> git shortlog
Junio> fi
However, this is good to know.
--
Randal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095
<merlyn@stonehenge.com> <URL:http://www.stonehenge.com/merlyn/>
Perl/Unix/security consulting, Technical writing, Comedy, etc. etc.
See PerlTraining.Stonehenge.com for onsite and open-enrollment Perl training!
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: git-log to go forward instead of reverse?
2006-07-10 20:09 ` Linus Torvalds
2006-07-10 20:16 ` Randal L. Schwartz
@ 2006-07-10 21:45 ` Junio C Hamano
1 sibling, 0 replies; 11+ messages in thread
From: Junio C Hamano @ 2006-07-10 21:45 UTC (permalink / raw)
To: Linus Torvalds; +Cc: git, Randal L. Schwartz
Linus Torvalds <torvalds@osdl.org> writes:
> And if you didn't know about "git shortlog" already, I personally actually
> find it easier to read
>
> git log --no-merges ORIG_HEAD.. | git shortlog
>
> which orders things by author instead.
Yes, and you can even have '-p' between git and shortlog in the
latter command if you do want the pager ;-).
BTW, when I prepare the "What's in" messages, I often find it
more useful to have a brother of short-log command that does not
group by author but group by topic branch the commits came from.
Currently I prepare the categorized list by hand, reviewing each
commit in "master..next" shortlog output. While I do not mind
it too much since that is a good way to remind myself what are
still cooking, it would be nice to have to a command that takes:
- which branch the output is relative to (defaults
to "master");
- list of branches that are "topics";
- which branch the parts of topics have been merged to
(optional -- I'd use "next" for my use).
and for each topic:
- see if the topic branches off from another topic (for
example, the merge-tree topic branches off from the
xdiff-common topic like [*1*]); if so, state that and
use that branch point instead of "master" in the next
step;
- list commits that have not made "master" yet;
optionally, when "next" is given, limit the output
only to the ones that have made "next" already.
[Footnote]
*1*
$ git show-branch --topics master lt/xdiff-common lt/merge-tree
* [master] git-rev-list: add documentation for --parents, --no-merges
! [lt/xdiff-common] xdiff: generate "anti-diffs" aka what is common...
! [lt/merge-tree] Improved three-way blob merging code
---
+ [lt/merge-tree] Improved three-way blob merging code
+ [lt/merge-tree^] Prepare "git-merge-tree" for future work
++ [lt/xdiff-common] xdiff: generate "anti-diffs" aka what is common...
*++ [master~67] checkout -m: fix read-tree invocation
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2006-07-10 21:45 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-07-10 18:42 git-log to go forward instead of reverse? Randal L. Schwartz
2006-07-10 19:01 ` Linus Torvalds
2006-07-10 19:06 ` Randal L. Schwartz
2006-07-10 19:20 ` Linus Torvalds
2006-07-10 19:25 ` Randal L. Schwartz
2006-07-10 20:09 ` Linus Torvalds
2006-07-10 20:16 ` Randal L. Schwartz
2006-07-10 21:45 ` Junio C Hamano
2006-07-10 20:26 ` Junio C Hamano
2006-07-10 20:31 ` Randal L. Schwartz
2006-07-10 19:26 ` Linus Torvalds
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).