builtin-grep: -L (--files-without-match).
[gitweb.git] / git-grep.sh
index e7a35ebd707c6ef485a26f4e1ece57fa248e0106..ad4f2fe81046505c43684e8c26f0eeaac6cc6146 100755 (executable)
@@ -3,18 +3,32 @@
 # Copyright (c) Linus Torvalds, 2005
 #
 
+USAGE='[<option>...] [-e] <pattern> [<path>...]'
+SUBDIRECTORY_OK='Yes'
+. git-sh-setup
+
+got_pattern () {
+       if [ -z "$no_more_patterns" ]
+       then
+               pattern="$1" no_more_patterns=yes
+       else
+               die "git-grep: do not specify more than one pattern"
+       fi
+}
+
+no_more_patterns=
 pattern=
 flags=()
 git_flags=()
 while : ; do
        case "$1" in
-       --cached|--deleted|--others|--killed|\
-       --ignored|--exclude=*|\
+       -o|--cached|--deleted|--others|--killed|\
+       --ignored|--modified|--exclude=*|\
        --exclude-from=*|\--exclude-per-directory=*)
                git_flags=("${git_flags[@]}" "$1")
                ;;
        -e)
-               pattern="$2"
+               got_pattern "$2"
                shift
                ;;
        -A|-B|-C|-D|-d|-f|-m)
@@ -22,7 +36,7 @@ while : ; do
                shift
                ;;
        --)
-               # The rest are git-ls-files paths (or flags)
+               # The rest are git-ls-files paths
                shift
                break
                ;;
@@ -30,14 +44,19 @@ while : ; do
                flags=("${flags[@]}" "$1")
                ;;
        *)
-               if [ -z "$pattern" ]; then
-                       pattern="$1"
+               if [ -z "$no_more_patterns" ]
+               then
+                       got_pattern "$1"
                        shift
                fi
+               [ "$1" = -- ] && shift
                break
                ;;
        esac
        shift
 done
-git-ls-files -z "${git_flags[@]}" "$@" |
-       xargs -0 grep "${flags[@]}" -e "$pattern"
+[ "$pattern" ] || {
+       usage
+}
+git-ls-files -z "${git_flags[@]}" -- "$@" |
+       xargs -0 grep "${flags[@]}" -e "$pattern" --