Code

Improve "git grep" flags handling
authorLinus Torvalds <torvalds@osdl.org>
Mon, 12 Sep 2005 23:46:53 +0000 (16:46 -0700)
committerJunio C Hamano <junkio@cox.net>
Tue, 13 Sep 2005 02:15:02 +0000 (19:15 -0700)
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>
git-grep.sh

index c77a2d0067246092aa0ab38f74b885ed8b51d116..51924fd7c38a4fd70f59069a3eecbfe787626375 100755 (executable)
@@ -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"