threads / discuss / 24359

log -S with evil merges

Subject: log -S with evil merges

## tl;dr

3 messages between Jul 10, 2010 and Jul 12, 2010.

replies: 2people: 2as markdown or json

Jonathan Nieder· Jul 10, 2010, 19:48 UTC · lore
Hi,

I was interested to know the origin of the UE_ALWAYS et al flags in builtin/reflog.c, so I asked git:

 ; git log --oneline -S'UE_ALWAYS' --follow builtin/reflog.c
 81b50f3 Move 'builtin-*' into a 'builtin/' subdirectory
 4264dc1 git reflog expire

Ok, clearly it was not introduced in the builtin/ move. I guess the UE_ flags were part of the original ‘reflog’ implementation. Right?

 ; git show 4264dc1 | grep UE_ALWAYS
 ; git show 4264dc1:builtin-reflog.c | grep UE_ALWAYS
 ;

No, that’s not it. At this point I decided -S is broken and just did a grep through log -p, to find that apparently this symbol was introduced in builtin-reflog.c with v1.7.2-rc0~122^2 (reflog --expire-unreachable: special case entries in "HEAD" reflog, 2010-04-09).

So why is log confused? As far as log -S knows, because of the builtin/ move, commit v1.7.2-rc0~122 was an evil merge that produced the UE_ flags in builtin/reflog.c out of thin air. It should be blaming that commit, then. With a little coaxing, it does.

 ; git log --format=oneline \
	--first-parent -m -S'UE_ALWAYS' --follow builtin/reflog.c |
   git name-rev --tags --stdin |
   cut -d' ' -f2-
 (tags/v1.7.2-rc0~122) Merge branch 'jc/maint-no-reflog-expire-unreach-for-head'
 (tags/v1.7.1-rc0~76) Merge branch 'lt/deepen-builtin-source'
 (tags/v1.5.0-rc1~188) Merge branch 'jc/fsck-reflog'
 ;

The first is the culprit, the second and third the file’s renaming and introduction[1].

The more logical
 ; git log --oneline -c -S'UE_ALWAYS' --follow builtin/reflog.c
does not work --- it mentions _all_ merges.  Why?

[1] I don’t know why ‘log -S --follow’ should feel the need to point these out, but that’s a different story.

Junio C Hamano· Jul 12, 2010, 06:12 UTC · re: Jonathan Nieder · lore

Re: log -S with evil merges

Jonathan Nieder <jrnieder@gmail.com> writes:
Show 5 quoted lines
> The more logical
>
>  ; git log --oneline -c -S'UE_ALWAYS' --follow builtin/reflog.c
>
> does not work --- it mentions _all_ merges.  Why?

I don't think --follow, which is merely a checkbox item, is friendly to most other git features. Does it even show diff with the corresponding file at the commit where filename is changed?

Jonathan Nieder· Jul 12, 2010, 06:39 UTC · re: Junio C Hamano · lore

Re: log -S with evil merges

Junio C Hamano wrote:
> Jonathan Nieder <jrnieder@gmail.com> writes:
Show 6 quoted lines
>>  ; git log --oneline -c -S'UE_ALWAYS' --follow builtin/reflog.c
>>
>> does not work --- it mentions _all_ merges.  Why?
>
> I don't think --follow, which is merely a checkbox item, is friendly to
> most other git features.
Hmm, leaving out the --follow makes it behave again.  Thanks for the tip.
> Does it even show diff with the corresponding
> file at the commit where filename is changed?
 $ git tag lt/deepen-builtin-source 81b50f3
 $ git diff --raw --follow lt/deepen-builtin-source^! -- builtin/reflog.c
 :100644 100644 7498210... 7498210... R100	builtin-reflog.c	builtin/reflog.c
 $ git diff-tree --abbrev -c --follow v1.7.2-rc0~122 -- builtin/reflog.c
 a660534e06147f8867d6c9b6c41025427a7b5c6c
 ::100644 100644 100644 f732156... fafb740... ebf610e... MR      builtin/reflog.c
Looks good to me...

← back to recent threads