Skip to contentSkip to conversation

teach git diff -v/--invert-match?

DISCUSSION Brian Ericson 4 participants 7 messages Jun 15, 2016

lore
Share & tools
lore
#0 lore raw

I'm wondering what it would take to teach git diff to invert the -S string (like git grep).

I'm finding git diff -S<string> [--pickaxe-regex] to be really useful, but find I have cases where I want to ignore differences. For example, I might not care if the only changes to a Java file, for example, are related to import statements. I'd like to be able to do something like "git diff -S'^import' --pickaxe-regex -v". I'll admit I can get by with something like "git diff -S'^[^i]' --pickaxe-regex", but am pining for -v/--invert-match.

#1 lore raw
Quoted 2 lines · Brian Ericson

I'm wondering what it would take to teach git diff to invert the -S string (like git grep).

I think you would have to figure out the desired semantics first.

Quoted 7 lines

I'm finding git diff -S<string> [--pickaxe-regex] to be really useful, but find I have cases where I want to ignore differences. For example, I might not care if the only changes to a Java file, for example, are related to import statements. I'd like to be able to do something like "git diff -S'^import' --pickaxe-regex -v". I'll admit I can get by with something like "git diff -S'^[^i]' --pickaxe-regex", but am pining for -v/--invert-match.

I would have thought "-v" meant "match any changes which do not have this pattern". But you want "match any changes that have any line which does not have this pattern."

IOW, mine would not match any changes which used an import statement, whereas yours would not match any changes which are _only_ import statements.

-Peff

#2 lore raw

I was just working on a reply to my own email as I realized it was only dumb-luck that converted 1200 noisy changes into a couple of dozen. "-S" matches only the string itself, not the line the string resides on. So, -Sxyz will match if "xyz" itself was added or deleted in the diff (if "xyz" is on a line that's changed but did not itself change, it won't match). Funny that I actually knew this -- I use it to look for System.out.println additions among other things.

Interestingly, if I wanted to know if an import changed (on top of knowing if imports were added or deleted), eg:
-import foo;
+import bar;

I couldn't tell you how to do it. The string "import" didn't change. I'd've guessed that "-S'import.*;' --pickaxe-regex" would have been sufficient, but that doesn't work.

Quoted 8 lines · Jeff King
Quoted 2 lines · Brian Ericson

I'm wondering what it would take to teach git diff to invert the -S string (like git grep).

I think you would have to figure out the desired semantics first.

I think mostly what I want is a happy marriage between git diff & git grep so that if the changed lines matched (or didn't match) the file would show up (or not). I'd like to grep added and removed lines (the diff itself) for a pattern and either include or exclude the file based on matches.

Quoted 9 lines
Quoted 4 lines

I'm finding git diff -S<string> [--pickaxe-regex] to be really useful, but find I have cases where I want to ignore differences. For example, I might not care if the only changes to a Java file, for example, are related to import statements. I'd like to be able to do something like "git diff -S'^import' --pickaxe-regex -v". I'll admit I can get by with something like "git diff -S'^[^i]' --pickaxe-regex", but am pining for -v/--invert-match.

I would have thought "-v" meant "match any changes which do not have this pattern". But you want "match any changes that have any line which does not have this pattern."

Right. Good summary! It's probably not accurate to use "-S" for my interpretation unless --pickaxe-regex behaved more as I outlined above. It's probably a subtle enough difference

Quoted 4 lines

IOW, mine would not match any changes which used an import statement, whereas yours would not match any changes which are _only_ import statements.

The current behavior seems to work well to answer questions like "has somebody added a System.out.println", I'd like it to be able to ignore or consider files based on line changes that contain a string where the string itself did not change.

Quoted 8 lines

-Peff
--
To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

#3 lore raw
Quoted 7 lines · Brian Ericson

I was just working on a reply to my own email as I realized it was only dumb-luck that converted 1200 noisy changes into a couple of dozen. "-S" matches only the string itself, not the line the string resides on. So, -Sxyz will match if "xyz" itself was added or deleted in the diff (if "xyz" is on a line that's changed but did not itself change, it won't match). Funny that I actually knew this -- I use it to look for System.out.println additions among other things.

Yes (though I couldn't have told you that without experimenting -- I always assumed it checked whole lines).

Quoted 3 lines

Interestingly, if I wanted to know if an import changed (on top of knowing if imports were added or deleted), eg: -import foo; +import bar;

That is a bit harder, and AFAIK not possible with -S. You could always post process the log output. E.g.,:

git log -p | perl -ne '
BEGIN { $/ = "commit " }
chomp; print if /^\+import /
'

which lets you get quite fancy with the matching.

Quoted 2 lines

The current behavior seems to work well to answer questions like "has somebody added a System.out.println",

The usual question (for me, anyway) is "when did X get introduced?" when looking for a token.

-Peff

#4 lore raw
Quoted 10 lines · Jeff King
Quoted 7 lines · Brian Ericson

I was just working on a reply to my own email as I realized it was only dumb-luck that converted 1200 noisy changes into a couple of dozen. "-S" matches only the string itself, not the line the string resides on. So, -Sxyz will match if "xyz" itself was added or deleted in the diff (if "xyz" is on a line that's changed but did not itself change, it won't match). Funny that I actually knew this -- I use it to look for System.out.println additions among other things.

Quoted 2 lines

Yes (though I couldn't have told you that without experimenting -- I always assumed it checked whole lines).

The -Sstring counts the number of 'string' in preimage and postimage and skips the commit if they are the same. Nothing more.

#5 lore raw
In reply to Jeff King
Quoted 4 lines

I would have thought "-v" meant "match any changes which do not have this pattern". But you want "match any changes that have any line which does not have this pattern."

Yours could be "-L/--without-match" (in grep, -L/--files-without-match only prints the names of files containing no match).

Paolo

#6 lore raw
Quoted 6 lines · Paolo Bonzini
Quoted 3 lines

I would have thought "-v" meant "match any changes which do not have this pattern". But you want "match any changes that have any line which does not have this pattern."

Yours could be "-L/--without-match" (in grep, -L/--files-without-match only prints the names of files containing no match).

Ah, yes, that would be better. I think we decided that Brian's original problem didn't really work with -S, and I don't actually need this behavior enough to implement it. But your suggestion is a good one if somebody cares to do so.

-Peff