Re: Add "git grep" helper

3 messages, 2 authors, 2016-06-15 · open the first message on its own page

Re: Add "git grep" helper

From: Junio C Hamano <hidden>
Date: 2016-06-15 22:42:06

Linus Torvalds [off-list ref] writes:
Very convenient shorthand for

	git-ls-files [file-patterns] | xargs grep <pattern>

which I tend to do all the time.
Great minds think alike.  I stopped using 'grep-find' in Emacs
and use "git-ls-fiels -z | xargs -0 grep" instead these days.
Thanks for the patch; applied.

I do not much care about other grep flags but I think you forgot
to special case '-e', so what is in the "master" branch has one
extra commit on top of it for that (it does not seem to have
percolated down yet).

Re: Add "git grep" helper

From: Linus Torvalds <torvalds@osdl.org>
Date: 2016-06-15 22:42:06


On Mon, 12 Sep 2005, Junio C Hamano wrote:
I do not much care about other grep flags but I think you forgot
to special case '-e', so what is in the "master" branch has one
extra commit on top of it for that (it does not seem to have
percolated down yet).
Actually, the more I think about it, the more I think Morten was right, 
and the git-grep case statement should just put all flags in "$flags", and 
any git-ls-files flags can be handled specially before.

We also need special casing for grep flags that take an argument.  So the
end result might be something like the following..

  ...
  case "$pattern" in

    # git-ls-file specific flags
    --others|--exclude=*|--exclude-from=*|--exclude-per-directory=*)
	git_flags="$git_flags $pattern"
	shift
	;;

    # grep flags with an argument
    -B|-C|-m)
	flags="$flags $pattern $2"
	shift
	shift
	;;

    # grep 'pattern' argument
    -e)
	pattern="$2"
	shift
	break
	;;

    # We assume everything else is a regular grep pattern
    -*)
	flags="$flags $pattern"
	shift
	;;
  ...

instead. And it's entirely possible that we'd never want to even bother 
with things like --others and --exclude* at all.

		Linus

Improve "git grep" flags handling

From: Linus Torvalds <torvalds@osdl.org>
Date: 2016-06-15 22:42:06

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.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
---

On Mon, 12 Sep 2005, Linus Torvalds wrote:
We also need special casing for grep flags that take an argument.  So the
end result might be something like the following..
diff --git a/git-grep.sh b/git-grep.sh
--- a/git-grep.sh
+++ b/git-grep.sh
@@ -1,25 +1,38 @@
 #!/bin/sh
 flags=
+git_flags=
 while :; do
   pattern="$1"
   case "$pattern" in
-  -i|-I|-a|-E|-H|-h|-l)
-    flags="$flags $pattern"
-    shift
-    ;;
+  # git-ls-file specific flags
+  --others|--exclude=*|--exclude-from=*|--exclude-per-directory=*)
+      git_flags="$git_flags $pattern"
+      shift
+      ;;
+
+  # grep flags with an argument
+  -B|-C|-m)
+      flags="$flags $pattern $2"
+      shift
+      shift
+      ;;
+
+  # grep 'pattern' argument
   -e)
-    pattern="$2"
-    shift
-    break
-    ;;
+      pattern="$2"
+      shift
+      break
+      ;;
+
+  # We assume everything else is a regular grep pattern
   -*)
-    echo "unknown flag $pattern" >&2
-    exit 1
-    ;;
+      flags="$flags $pattern"
+      shift
+      ;;
   *)
     break
     ;;
   esac
 done
 shift
-git-ls-files -z "$@" | xargs -0 grep $flags -e "$pattern"
+git-ls-files -z $git_flags "$@" | xargs -0 grep $flags -e "$pattern"
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help