From: Chris Packham <judge.packham@gmail.com>
To: git@vger.kernel.org
Cc: Chris Packham <judge.packham@gmail.com>
Subject: [RFC PATCH 2/2] submodule: add grep command
Date: Thu, 23 Sep 2010 14:17:07 -0700 [thread overview]
Message-ID: <1285276627-7907-3-git-send-email-judge.packham@gmail.com> (raw)
In-Reply-To: <1285276627-7907-1-git-send-email-judge.packham@gmail.com>
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(-)
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
next prev parent reply other threads:[~2010-09-23 21:17 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-09-23 21:17 [RFC PATCH 0/2] submodule aware grep Chris Packham
2010-09-23 21:17 ` [RFC PATCH 1/2] contrib: add git-submodule-grep.sh Chris Packham
2010-09-23 21:17 ` Chris Packham [this message]
2010-09-24 13:47 ` [RFC PATCH 0/2] submodule aware grep Heiko Voigt
2010-09-24 16:07 ` Chris Packham
2010-09-24 17:10 ` Jens Lehmann
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1285276627-7907-3-git-send-email-judge.packham@gmail.com \
--to=judge.packham@gmail.com \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).