contrib/git-svn: ensure repo-config returns a value before using it
[git.git] / git-grep.sh
index c77a2d0..ad4f2fe 100755 (executable)
@@ -1,25 +1,62 @@
 #!/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
+#
+
+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
+       -o|--cached|--deleted|--others|--killed|\
+       --ignored|--modified|--exclude=*|\
+       --exclude-from=*|\--exclude-per-directory=*)
+               git_flags=("${git_flags[@]}" "$1")
+               ;;
+       -e)
+               got_pattern "$2"
+               shift
+               ;;
+       -A|-B|-C|-D|-d|-f|-m)
+               flags=("${flags[@]}" "$1" "$2")
+               shift
+               ;;
+       --)
+               # The rest are git-ls-files paths
+               shift
+               break
+               ;;
+       -*)
+               flags=("${flags[@]}" "$1")
+               ;;
+       *)
+               if [ -z "$no_more_patterns" ]
+               then
+                       got_pattern "$1"
+                       shift
+               fi
+               [ "$1" = -- ] && shift
+               break
+               ;;
+       esac
+       shift
 done
-shift
-git-ls-files -z "$@" | xargs -0 grep $flags -e "$pattern"
+[ "$pattern" ] || {
+       usage
+}
+git-ls-files -z "${git_flags[@]}" -- "$@" |
+       xargs -0 grep "${flags[@]}" -e "$pattern" --