* 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: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 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
* 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 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
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).