aboutsummaryrefslogtreecommitdiff
path: root/git-grep.sh
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@osdl.org>2005-09-12 16:46:53 -0700
committerJunio C Hamano <junkio@cox.net>2005-09-12 19:15:02 -0700
commit5d9d831a51dc7847ad40fac77f9a072aa2d1c0bd (patch)
treef40840571e7188f736e4e724a0e0b49f7e51a2af /git-grep.sh
parent4e48fe3f1c42519f1aad92176489eeb174a319c0 (diff)
downloadgit-5d9d831a51dc7847ad40fac77f9a072aa2d1c0bd.tar.gz
git-5d9d831a51dc7847ad40fac77f9a072aa2d1c0bd.tar.xz
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>
Diffstat (limited to 'git-grep.sh')
-rwxr-xr-xgit-grep.sh64
1 files changed, 41 insertions, 23 deletions
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"