Re: RFC: Adding an option to log-like commands to call an external command for each revision
`On Mon, Aug 30, 2010 at 03:08, Jeff King <peff@peff.net> wrote:
Sorry for not replying to this earlier.
Show 14 quoted lines
> On Sun, Aug 29, 2010 at 08:30:15PM +0000, Ævar Arnfjörð Bjarmason wrote:
>
>> I have this alias in my .gitconfig:
>>
>> review = "!f() { for rev in $(git rev-list --reverse \"$@\"); do
>> git show $rev; done; }; f"
>>
>> I use it after I "git pull" to see what changed, e.g.:
>>
>> git review 49ea7b8..e1ef3c1
>
> It took me a minute of reading this to see why you would want to call
> "git show" in a loop when you could have the same data from "git log"
> all at once (and much faster, too).I just like the UI of having each commit "pop up" where I can either page up/down within the commit, or dismiss it with "q" and go to the next one.
You can't do both of those in a pager, up/down goes across commits, and "q" quits the whole pager.
> But I guess you like having an individual less invocation for each
> commit. Have you tried "tig", which might suit your purpose even
> better?
I haven't tried tig, but "git review" as I implement it (below) is sufficient for my needs.
Show 20 quoted lines
>> But sometimes I find that I want to do that for other things too, so I
>> have these hacks:
>>
>> review-grep = "!f() { for rev in $(git log --reverse
>> --pretty=format:%H --grep=\"$@\"); do git show $rev; done; }; f"
>> review-file = "!f() { for rev in $(git log --reverse
>> --pretty=format:%H \"$@\"); do git show $rev; done; }; f"
>>
>> But just now I wanted to use -S instead of grep, but adding aliases
>> like this is a bit silly.
>
> I don't understand why you have these at all. Just use "git log
> --format=%H" in your git review above (instead of rev-list), and then
> you can just do:
>
> git review --grep=whatever
> git review -Sfoo
> git review file
>
> Or am I missing something subtle?You're not missing something, my alias was silly because I brainfarted and didn't realize I could do $@, not "$@", so now it's:
review = "!f() { for rev in $(git log --reverse --format=%H $@);
do git show $rev; done; }; f"Which means I can do all of the commands you suggested above, thanks!
Show 28 quoted lines
> You wouldn't even need to switch to log over rev-list, except that
> rev-list misses log's useful "default to HEAD if no revisions given"
> behavior.
>
>> Maybe we should have something like:
>>
>> git log --for-each=less a..b
>>
>> To call "less" for each commit, what do you think?
>
> I think it is not very Unix-y. We already have many ways to to call a
> command once per commit, including:
>
> - for i in `git rev-list "$@"`; do git show $i; done
>
> - git rev-list "$@" | xargs -n 1 git show
>
> - git log -z "$@" | perl -0ne 'open(LESS, "|less"); print LESS'
>
> What does your solution offer that the other do not? Because you are
> actually reinvoking git for each commit, it is more efficient than the
> first two (as you seem to assume that the --for-each command will
> receive the entire log output). But the third one should be more or less
> equivalent to what you want (though note: if you want tty-ish things
> like color on, you should set GIT_PAGER_IN_USE=1 so git knows output is
> eventually going to a pager). Sure, yours is slightly less typing, but
> it's _way_ less flexible, and that typing should probably be hidden
> behind an alias anyway.
Yeah, it's not very Unixy, I just find it so useful that I thought there might be interest in adding it to Git. It's easily in the list of top 5 git commands that I use.
But just using the pipe is more flexible I guess.