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>
This commit is contained in:
Linus Torvalds 2005-09-12 16:46:53 -07:00 коммит произвёл Junio C Hamano
Родитель 4e48fe3f1c
Коммит 5d9d831a51
1 изменённых файлов: 41 добавлений и 23 удалений

Просмотреть файл

@ -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"