Re: Improve "git grep" flags handling
- From
Junio C Hamano <junkio@cox.net>
- Date
- Sep 12, 2005, 23:26 UTC
- Message-ID
- <7vslw96f6j.fsf@assigned-by-dhcp.cox.net>
- In-Reply-To
- <Pine.LNX.4.58.0509121542050.3266@g5.osdl.org>
Linus Torvalds <torvalds@osdl.org> writes:
> Good point. However, since it's unlikely that anybody will use it, maybe > it's not important - more of a "this is how you could do it if you fixed > the globbing problem" ;)
Yeah, let's see how tolerant your barf-o-meter is today. This would make even *me* barf ;-), but it sometimes may be useful to be able to say:
git grep --others --exclude='*.[oa]' '@@GIT_'
------------ #!/bin/sh
# git grep <flags>... <pattern> <path>...
{
# Pick ls-files arguments only.
first=yes skip=no pattern_found=no
for x
do
case "$skip" in yes) skip=no; continue ;; esac
case "$x" in
--cached|--deleted|--others|--killed|--ignored|--exclude=*|\
--exclude-from=*|\--exclude-per-directory=*)
test 'yes' = "$first" && set x
set "$@" "$x"
first=no
;;
-A|-B|-C|-D|-d|-f|-m)
skip=yes
;;
-e)
skip=yes
pattern_found=yes
;;
-*)
;;
*)
case "$pattern_found" in
yes)
test 'yes' = "$first" && set x
set "$@" "$x"
;;
no)
;; # not for us, but for grep
esac
;;
esac
done
case "$first" in
yes) # we did not get *any* ls-files parameter.
set x ;;
esac
shift
git-ls-files -z "$@"
} | {
first=yes eat=no pattern_found=no
for x
do
case "$eat" in
yes)
eat=no;
set "$@" "$x"
continue
;;
esac
case "$x" in
--cached|--deleted|--others|--killed|--ignored|--exclude=*|\
--exclude-from=*|\--exclude-per-directory=*)
;;
-A|-B|-C|-D|-d|-f|-m)
test 'yes' = "$first" && set x
set "$@" "$x"
first=no
eat=yes
;;
-e)
test 'yes' = "$first" && set x
set "$@" "$x"
eat=yes
pattern_found=yes
;;
-*)
test 'yes' = "$first" && set x
set "$@" "$x"
first=no
;;
*)
case "$pattern_found" in
yes)
;; # not for us, but for ls-files
no)
test 'yes' = "$first" && set x
set "$@" "$x"
pattern_found=yes
esac
;;
esac
done
case "$eat,$pattern_found" in
yes,* | *,no)
echo >&2 "* malformed grep parameters"
exit 1
esac
shift
xargs -0 grep "$@"
}