From: Junio C Hamano Date: Mon, 12 Sep 2005 23:26:28 GMT Subject: Re: Improve "git grep" flags handling Message-ID: <7vslw96f6j.fsf@assigned-by-dhcp.cox.net> In-Reply-To: Linus Torvalds 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 ... ... { # 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 "$@" }