From f22cc3fcbfe7755154a3a151215abd39162e2e85 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Mon, 12 Sep 2005 12:06:10 -0700 Subject: [PATCH] Add "git grep" helper Very convenient shorthand for git-ls-files [file-patterns] | xargs grep which I tend to do all the time. Yes, it's trivial, but it's really nice. I can do git grep '\' arch/i386 include/asm-i386 and it does exactly what you'd think it does. And since it just uses the normal git-ls-files file patterns, you can do things like git grep something 'include/*.h' and it will search all header files under the include/ subdirectory. Signed-off-by: Linus Torvalds Signed-off-by: Junio C Hamano --- git-grep.sh | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100755 git-grep.sh (limited to 'git-grep.sh') diff --git a/git-grep.sh b/git-grep.sh new file mode 100755 index 000000000..db2296c33 --- /dev/null +++ b/git-grep.sh @@ -0,0 +1,20 @@ +#!/bin/sh +flags= +while :; do + pattern="$1" + case "$pattern" in + -i|-I|-a|-E|-H|-h|-l) + flags="$flags $pattern" + shift + ;; + -*) + echo "unknown flag $pattern" >&2 + exit 1 + ;; + *) + break + ;; + esac +done +shift +git-ls-files -z "$@" | xargs -0 grep $flags "$pattern" -- cgit v1.2.1 From 540bf654d007b3289adec37e3008c588ba677e25 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Mon, 12 Sep 2005 13:24:55 -0700 Subject: Allow finding things that begin with a dash in 'git grep' Signed-off-by: Junio C Hamano --- git-grep.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'git-grep.sh') diff --git a/git-grep.sh b/git-grep.sh index db2296c33..c77a2d006 100755 --- a/git-grep.sh +++ b/git-grep.sh @@ -7,6 +7,11 @@ while :; do flags="$flags $pattern" shift ;; + -e) + pattern="$2" + shift + break + ;; -*) echo "unknown flag $pattern" >&2 exit 1 @@ -17,4 +22,4 @@ while :; do esac done shift -git-ls-files -z "$@" | xargs -0 grep $flags "$pattern" +git-ls-files -z "$@" | xargs -0 grep $flags -e "$pattern" -- cgit v1.2.1 From 5d9d831a51dc7847ad40fac77f9a072aa2d1c0bd Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Mon, 12 Sep 2005 16:46:53 -0700 Subject: Improve "git grep" flags handling 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 is the version Linus sent out after I showed him a barf-o-meter test version that avoids shell arrays. He 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 Signed-off-by: Junio C Hamano --- git-grep.sh | 64 +++++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 41 insertions(+), 23 deletions(-) (limited to 'git-grep.sh') diff --git a/git-grep.sh b/git-grep.sh index c77a2d006..51924fd7c 100755 --- 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" -- cgit v1.2.1