From: Linus Torvalds Date: Mon, 12 Sep 2005 23:46:53 +0000 (-0700) Subject: Improve "git grep" flags handling X-Git-Tag: v0.99.7~62 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=5d9d831a51dc7847ad40fac77f9a072aa2d1c0bd;p=git.git 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 Signed-off-by: Junio C Hamano --- diff --git a/git-grep.sh b/git-grep.sh index c77a2d006..51924fd7c 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"