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

[PATCH] Improve "git grep" flags handling

From
Junio C Hamano <junkio@cox.net>
Date
Sep 13, 2005, 00:51 UTC
Message-ID
<7v64t56b83.fsf_-_@assigned-by-dhcp.cox.net>
In-Reply-To
<Pine.LNX.4.58.0509121635060.3266@g5.osdl.org>

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 was the version after I showed Linus a barf-o-meter test
 version that avoids shell arrays.  The emperor penguin 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>
---
    Linus Torvalds <torvalds@osdl.org> writes:
    Wouldn't it be _much_ nicer to just do which does use bash
    array variables, but dang, it does so for a reason: they
    really are very very useful, and they make it _so_ much more
    pleasant to do these things..
 Thanks, Linus.  This is what will go into "master" tonight.
 git-grep.sh |   64 ++++++++++++++++++++++++++++++++++++++---------------------
 1 files changed, 41 insertions(+), 23 deletions(-)
6df4eef9b10c8de2b9bc3dc769f3a008a1200df7
diff --git a/git-grep.sh b/git-grep.sh
--- a/git-grep.sh
+++ b/git-grep.sh
@@ -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"
Previous: Junio C HamanoNext: Junio C Hamano
Message 12 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.