summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@osdl.org>2005-09-12 23:46:53 (GMT)
committerJunio C Hamano <junkio@cox.net>2005-09-13 02:15:02 (GMT)
commit5d9d831a51dc7847ad40fac77f9a072aa2d1c0bd (patch)
treef40840571e7188f736e4e724a0e0b49f7e51a2af
parent4e48fe3f1c42519f1aad92176489eeb174a319c0 (diff)
downloadgit-5d9d831a51dc7847ad40fac77f9a072aa2d1c0bd.zip
git-5d9d831a51dc7847ad40fac77f9a072aa2d1c0bd.tar.gz
git-5d9d831a51dc7847ad40fac77f9a072aa2d1c0bd.tar.bz2
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-xgit-grep.sh64
1 files changed, 41 insertions, 23 deletions
diff --git a/git-grep.sh b/git-grep.sh
index c77a2d0..51924fd 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"