git/list[1] front-page[2] threads[3] people[4] search[5] about
 

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 "$@"
}
Previous: Linus TorvaldsNext: Linus Torvalds
Message 9 of 13 in “Add "git grep" helper”
  1. Linus TorvaldsSep 12, 2005
  2. Morten WelinderSep 12, 2005
  3. Linus TorvaldsSep 12, 2005
  4. Junio C HamanoSep 12, 2005
  5. Linus TorvaldsSep 12, 2005
  6. Improve "git grep" flags handlingLinus Torvalds, Sep 12, 2005
  7. Junio C HamanoSep 12, 2005
  8. Linus TorvaldsSep 12, 2005
  9. Junio C HamanoSep 12, 2005
  10. Linus TorvaldsSep 12, 2005
  11. Junio C HamanoSep 12, 2005
  12. Improve "git grep" flags handlingJunio C Hamano, Sep 13, 2005
  13. Junio C HamanoSep 12, 2005

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.