#!/bin/sh
-flags=
-while :; do
- pattern="$1"
- case "$pattern" in
- -i|-I|-a|-E|-H|-h|-l)
- flags="$flags $pattern"
- shift
- ;;
- -*)
- echo "unknown flag $pattern" >&2
- exit 1
- ;;
- *)
- break
- ;;
- esac
+#
+# Copyright (c) Linus Torvalds, 2005
+#
+
+USAGE='[<option>...] [-e] <pattern> [<path>...]'
+SUBDIRECTORY_OK='Yes'
+. git-sh-setup
+
+got_pattern () {
+ if [ -z "$no_more_patterns" ]
+ then
+ pattern="$1" no_more_patterns=yes
+ else
+ die "git-grep: do not specify more than one pattern"
+ fi
+}
+
+no_more_patterns=
+pattern=
+flags=()
+git_flags=()
+while : ; do
+ case "$1" in
+ -o|--cached|--deleted|--others|--killed|\
+ --ignored|--modified|--exclude=*|\
+ --exclude-from=*|\--exclude-per-directory=*)
+ git_flags=("${git_flags[@]}" "$1")
+ ;;
+ -e)
+ got_pattern "$2"
+ shift
+ ;;
+ -A|-B|-C|-D|-d|-f|-m)
+ flags=("${flags[@]}" "$1" "$2")
+ shift
+ ;;
+ --)
+ # The rest are git-ls-files paths
+ shift
+ break
+ ;;
+ -*)
+ flags=("${flags[@]}" "$1")
+ ;;
+ *)
+ if [ -z "$no_more_patterns" ]
+ then
+ got_pattern "$1"
+ shift
+ fi
+ [ "$1" = -- ] && shift
+ break
+ ;;
+ esac
+ shift
done
-shift
-git-ls-files -z "$@" | xargs -0 grep $flags "$pattern"
+[ "$pattern" ] || {
+ usage
+}
+git-ls-files -z "${git_flags[@]}" -- "$@" |
+ xargs -0 grep "${flags[@]}" -e "$pattern" --