Linus Torvalds [off-list ref] writes:
Very convenient shorthand for
git-ls-files [file-patterns] | xargs grep <pattern>
which I tend to do all the time.
Great minds think alike. I stopped using 'grep-find' in Emacs
and use "git-ls-fiels -z | xargs -0 grep" instead these days.
Thanks for the patch; applied.
I do not much care about other grep flags but I think you forgot
to special case '-e', so what is in the "master" branch has one
extra commit on top of it for that (it does not seem to have
percolated down yet).
On Mon, 12 Sep 2005, Junio C Hamano wrote:
I do not much care about other grep flags but I think you forgot
to special case '-e', so what is in the "master" branch has one
extra commit on top of it for that (it does not seem to have
percolated down yet).
Actually, the more I think about it, the more I think Morten was right,
and the git-grep case statement should just put all flags in "$flags", and
any git-ls-files flags can be handled specially before.
We also need special casing for grep flags that take an argument. So the
end result might be something like the following..
...
case "$pattern" in
# git-ls-file specific flags
--others|--exclude=*|--exclude-from=*|--exclude-per-directory=*)
git_flags="$git_flags $pattern"
shift
;;
# grep flags with an argument
-B|-C|-m)
flags="$flags $pattern $2"
shift
shift
;;
# grep 'pattern' argument
-e)
pattern="$2"
shift
break
;;
# We assume everything else is a regular grep pattern
-*)
flags="$flags $pattern"
shift
;;
...
instead. And it's entirely possible that we'd never want to even bother
with things like --others and --exclude* at all.
Linus
This allows any arbitrary flags to "grep", and knows about the few special
grep flags that take an argument too.
It also allows some flags for git-ls-files, although their usefulness is
questionable.
With this, something line
git grep -w -1 pattern
works, without the script enumerating every possible flag.
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
---
On Mon, 12 Sep 2005, Linus Torvalds wrote:
We also need special casing for grep flags that take an argument. So the
end result might be something like the following..
diff --git a/git-grep.sh b/git-grep.sh
--- a/git-grep.sh
+++ b/git-grep.sh
@@ -1,25 +1,38 @@
#!/bin/sh
flags=
+git_flags=
while :; do
pattern="$1"
case "$pattern" in
- -i|-I|-a|-E|-H|-h|-l)
- flags="$flags $pattern"
- shift
- ;;
+ # git-ls-file specific flags
+ --others|--exclude=*|--exclude-from=*|--exclude-per-directory=*)
+ git_flags="$git_flags $pattern"
+ shift
+ ;;
+
+ # grep flags with an argument
+ -B|-C|-m)
+ flags="$flags $pattern $2"
+ shift
+ shift
+ ;;
+
+ # grep 'pattern' argument
-e)
- pattern="$2"
- shift
- break
- ;;
+ pattern="$2"
+ shift
+ break
+ ;;
+
+ # We assume everything else is a regular grep pattern
-*)
- echo "unknown flag $pattern" >&2
- exit 1
- ;;
+ flags="$flags $pattern"
+ shift
+ ;;
*)
break
;;
esac
done
shift
-git-ls-files -z "$@" | xargs -0 grep $flags -e "$pattern"
+git-ls-files -z $git_flags "$@" | xargs -0 grep $flags -e "$pattern"