#!/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
done
shift
git-ls-files -z "$@" | xargs -0 grep $flags -e "$pattern"

#!/bin/sh
#
# 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
git-ls-files -z "${git_flags[@]}" "$@" |
	xargs -0 grep "${flags[@]}" "$pattern"

Improve "git grep" flags handling
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 <69652caca27c8b940640ad396ab71f93cacec34f@osdl.org>
Signed-off-by: Junio C Hamano <dc50d1021234060e53ec42a77d526afa2fe07479@cox.net>
