[RFC PATCH 2/2] submodule: add grep command
This adds a 'grep' command to the 'git submodule' commands. Internally it is basically a wrapper for "git submodule foreach 'git grep <pattern>'" but does have the advantage of supplying results with a path relative to the current directory.
Unlike contrib/git-submodule-grep.sh this can only be run from the root of a submodule or the root of the superproject.
Signed-off-by: Chris Packham <judge.packham@gmail.com>
---
git-sh-setup.sh | 19 +++++++++++++++++++
git-submodule.sh | 41 +++++++++++++++++++++++++++++++++++++++--
2 files changed, 58 insertions(+), 2 deletions(-)
Show changes to 2 files +58 −2
git-sh-setup.sh, git-submodule.sh
diff --git a/git-sh-setup.sh b/git-sh-setup.sh
index 6131670..2a1d585 100644
--- a/git-sh-setup.sh
+++ b/git-sh-setup.sh
@@ -145,6 +145,25 @@ require_work_tree () {
die "fatal: $0 cannot be used without a working tree."
}
+submodule_root_relative()
+{
+ ceiling="$HOME"
+ while test ! -e "$cdup.gitmodules"; do
+ cdup="$cdup../"
+ if test "$(cd $cdup && pwd)" == "$ceiling"; then
+ echo >&2 "fatal: failed to find superproject root."
+ echo >&2 " stopped searching at $ceiling".
+ exit 1
+ fi
+ done
+ echo "$cdup"
+}
+
+submodule_root()
+{
+ (cd "$(submodule_root_relative)" && pwd)
+}
+
get_author_ident_from_commit () {
pick_author_script='
/^author /{
diff --git a/git-submodule.sh b/git-submodule.sh
index 9ebbab7..3edaa49 100755
--- a/git-submodule.sh
+++ b/git-submodule.sh
@@ -11,7 +11,8 @@ USAGE="[--quiet] add [-b branch] [-f|--force] [--reference <repository>] [--] <r
or: $dashless [--quiet] update [--init] [-N|--no-fetch] [--rebase] [--reference <repository>] [--merge] [--recursive] [--] [<path>...]
or: $dashless [--quiet] summary [--cached|--files] [--summary-limit <n>] [commit] [--] [<path>...]
or: $dashless [--quiet] foreach [--recursive] <command>
- or: $dashless [--quiet] sync [--] [<path>...]"
+ or: $dashless [--quiet] sync [--] [<path>...]
+ or: $dashless [--quiet] grep [--] [-n] [<pattern>]"
OPTIONS_SPEC=
. git-sh-setup
. git-parse-remote
@@ -849,6 +850,42 @@ cmd_sync()
fi
done
}
+#
+# Search for a pattern within all submodules
+# This is a fairly simple wrapper using foreach and git grep,
+# arguments could be passed to git grep but for now we only
+# understand -n
+#
+cmd_grep()
+{
+ grep_args=""
+ while test $# -ne 0
+ do
+ case "$1" in
+ -n)
+ grep_args="$1"
+ shift
+ ;;
+ --)
+ shift
+ break
+ ;;
+ -*)
+ usage
+ ;;
+ *)
+ break
+ ;;
+ esac
+ done
+ test $# -lt 1 && die "fatal: no pattern given"
+
+ prefix="$(submodule_root_relative)" || exit 1
+ (cd "./$prefix"; \
+ cmd_foreach "git --no-pager grep $grep_args -- $@ | \
+ sed s\"|.*|$prefix\$path/&|\" || true") \
+ | git_pager
+}
# This loop parses the command line arguments to find the
# subcommand name to dispatch. Parsing of the subcommand specific
@@ -859,7 +896,7 @@ cmd_sync()
while test $# != 0 && test -z "$command"
do
case "$1" in
- add | foreach | init | update | status | summary | sync)
+ add | foreach | init | update | status | summary | sync | grep)
command=$1
;;
-q|--quiet)
--
1.7.3.dirty