diff options
author | Linus Torvalds <torvalds@osdl.org> | 2005-09-13 03:46:53 +0400 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2005-09-13 06:15:02 +0400 |
commit | 5d9d831a51dc7847ad40fac77f9a072aa2d1c0bd (patch) | |
tree | f40840571e7188f736e4e724a0e0b49f7e51a2af | |
parent | 4e48fe3f1c42519f1aad92176489eeb174a319c0 (diff) |
Improve "git grep" flags handling
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.
[jc: this is the version Linus sent out after I showed him a
barf-o-meter test version that avoids shell arrays. He must
have typed this version blindly, since he said:
I'm not barfing, but that's probably because my brain just shut
down and is desperately trying to gouge my eyes out with a spoon.
I slightly fixed it to catch the remaining arguments meant to be
given git-ls-files.]
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
-rwxr-xr-x | git-grep.sh | 64 |
1 files changed, 41 insertions, 23 deletions
diff --git a/git-grep.sh b/git-grep.sh index c77a2d0067..51924fd7c3 100755 --- a/git-grep.sh +++ b/git-grep.sh @@ -1,25 +1,43 @@ #!/bin/sh -flags= -while :; do - pattern="$1" - case "$pattern" in - -i|-I|-a|-E|-H|-h|-l) - flags="$flags $pattern" - shift - ;; - -e) - pattern="$2" - shift - break - ;; - -*) - echo "unknown flag $pattern" >&2 - exit 1 - ;; - *) - break - ;; - esac +# +# Copyright (c) Linus Torvalds, 2005 +# + +pattern= +flags=() +git_flags=() +while : ; do + case "$1" in + --cached|--deleted|--others|--killed|\ + --ignored|--exclude=*|\ + --exclude-from=*|\--exclude-per-directory=*) + git_flags=("${git_flags[@]}" "$1") + ;; + -e) + pattern="$2" + shift + ;; + -A|-B|-C|-D|-d|-f|-m) + flags=("${flags[@]}" "$1" "$2") + shift + ;; + --) + # The rest are git-ls-files paths (or flags) + shift + break + ;; + -*) + flags=("${flags[@]}" "$1") + ;; + *) + if [ -z "$pattern" ]; then + pattern="$1" + shift + fi + break + ;; + esac + shift done -shift -git-ls-files -z "$@" | xargs -0 grep $flags -e "$pattern" +git-ls-files -z "${git_flags[@]}" "$@" | + xargs -0 grep "${flags[@]}" "$pattern" |