From: Brandon Williams <bmwill@google.com>
To: git@vger.kernel.org
Cc: Brandon Williams <bmwill@google.com>,
sbeller@google.com, jonathantanmy@google.com, gitster@pobox.com
Subject: [PATCH v3 0/6] recursively grep across submodules
Date: Fri, 11 Nov 2016 15:51:07 -0800 [thread overview]
Message-ID: <1478908273-190166-1-git-send-email-bmwill@google.com> (raw)
In-Reply-To: <1477953496-103596-1-git-send-email-bmwill@google.com>
Most of the changes between v2 and v3 of this series were to address the few
reviewer comments.
* use 'path' as the directory to cd into for the child process and use 'name'
for the super_prefix
* flush output from childprocess on error and print a more useful error msg
* change is_submodule_checked_out to is_submodule_populated
* fix GIT_DIR for a submodule child process from being set to '.git'
* Addition of a test for searching history of a submodule which had been moved.
The series as a whole probably needs a few more rounds of
review so any additional input would be appreciated!
Thanks!
Brandon
Brandon Williams (6):
submodules: add helper functions to determine presence of submodules
submodules: load gitmodules file from commit sha1
grep: add submodules as a grep source type
grep: optionally recurse into submodules
grep: enable recurse-submodules to work on <tree> objects
grep: search history of moved submodules
Documentation/git-grep.txt | 14 ++
builtin/grep.c | 391 ++++++++++++++++++++++++++++++++++---
cache.h | 2 +
config.c | 8 +-
git.c | 2 +-
grep.c | 16 +-
grep.h | 1 +
submodule-config.c | 6 +-
submodule-config.h | 3 +
submodule.c | 50 +++++
submodule.h | 3 +
t/t7814-grep-recurse-submodules.sh | 182 +++++++++++++++++
12 files changed, 646 insertions(+), 32 deletions(-)
create mode 100755 t/t7814-grep-recurse-submodules.sh
-- interdiff based on 'bw/grep-recurse-submodules'
diff --git a/Documentation/git-grep.txt b/Documentation/git-grep.txt
index 386a868..71f32f3 100644
--- a/Documentation/git-grep.txt
+++ b/Documentation/git-grep.txt
@@ -26,7 +26,7 @@ SYNOPSIS
[--threads <num>]
[-f <file>] [-e] <pattern>
[--and|--or|--not|(|)|-e <pattern>...]
- [--recurse-submodules] [--parent-basename]
+ [--recurse-submodules] [--parent-basename <basename>]
[ [--[no-]exclude-standard] [--cached | --no-index | --untracked] | <tree>...]
[--] [<pathspec>...]
@@ -95,7 +95,7 @@ OPTIONS
<tree> option the prefix of all submodule output will be the name of
the parent project's <tree> object.
---parent-basename::
+--parent-basename <basename>::
For internal use only. In order to produce uniform output with the
--recurse-submodules option, this option can be used to provide the
basename of a parent's <tree> object to a submodule so the submodule
diff --git a/builtin/grep.c b/builtin/grep.c
index bdf1b90..1879432 100644
--- a/builtin/grep.c
+++ b/builtin/grep.c
@@ -538,14 +538,22 @@ static int grep_submodule_launch(struct grep_opt *opt,
struct child_process cp = CHILD_PROCESS_INIT;
int status, i;
const char *end_of_base;
+ const char *name;
struct work_item *w = opt->output_priv;
+ end_of_base = strchr(gs->name, ':');
+ if (end_of_base)
+ name = end_of_base + 1;
+ else
+ name = gs->name;
+
prepare_submodule_repo_env(&cp.env_array);
+ argv_array_push(&cp.env_array, GIT_DIR_ENVIRONMENT);
/* Add super prefix */
argv_array_pushf(&cp.args, "--super-prefix=%s%s/",
- super_prefix ? super_prefix: "",
- gs->path);
+ super_prefix ? super_prefix : "",
+ name);
argv_array_push(&cp.args, "grep");
/*
@@ -556,7 +564,6 @@ static int grep_submodule_launch(struct grep_opt *opt,
* parent project's object name to the submodule so the submodule can
* prefix its output with the parent's name and not its own SHA1.
*/
- end_of_base = strchr(gs->name, ':');
if (end_of_base)
argv_array_pushf(&cp.args, "--parent-basename=%.*s",
(int) (end_of_base - gs->name),
@@ -588,8 +595,12 @@ static int grep_submodule_launch(struct grep_opt *opt,
* anything else is an error.
*/
status = capture_command(&cp, &w->out, 0);
- if (status && (status != 1))
- exit(status);
+ if (status && (status != 1)) {
+ /* flush the buffer */
+ write_or_die(1, w->out.buf, w->out.len);
+ die("process for submodule '%s' failed with exit code: %d",
+ gs->name, status);
+ }
/* invert the return code to make a hit equal to 1 */
return !status;
@@ -605,11 +616,20 @@ static int grep_submodule(struct grep_opt *opt, const unsigned char *sha1,
const char *filename, const char *path)
{
if (!(is_submodule_initialized(path) &&
- is_submodule_checked_out(path))) {
- warning("skiping submodule '%s%s' since it is not initialized and checked out",
- super_prefix ? super_prefix: "",
- path);
- return 0;
+ is_submodule_populated(path))) {
+ /*
+ * If searching history, check for the presense of the
+ * submodule's gitdir before skipping the submodule.
+ */
+ if (sha1) {
+ path = git_path("modules/%s",
+ submodule_from_path(null_sha1, path)->name);
+
+ if(!(is_directory(path) && is_git_directory(path)))
+ return 0;
+ } else {
+ return 0;
+ }
}
#ifndef NO_PTHREADS
@@ -670,8 +690,7 @@ static int grep_cache(struct grep_opt *opt, const struct pathspec *pathspec,
continue;
hit |= grep_sha1(opt, ce->oid.hash, ce->name,
0, ce->name);
- }
- else {
+ } else {
hit |= grep_file(opt, ce->name);
}
} else if (recurse_submodules && S_ISGITLINK(ce->ce_mode) &&
@@ -705,8 +724,8 @@ static int grep_tree(struct grep_opt *opt, const struct pathspec *pathspec,
struct strbuf name = STRBUF_INIT;
int name_base_len = 0;
if (super_prefix) {
- name_base_len = strlen(super_prefix);
strbuf_addstr(&name, super_prefix);
+ name_base_len = name.len;
}
while (tree_entry(tree, &entry)) {
@@ -715,8 +734,16 @@ static int grep_tree(struct grep_opt *opt, const struct pathspec *pathspec,
if (match != all_entries_interesting) {
strbuf_setlen(&name, name_base_len);
strbuf_addstr(&name, base->buf + tn_len);
- match = tree_entry_interesting(&entry, &name,
- 0, pathspec);
+
+ if (recurse_submodules && S_ISGITLINK(entry.mode)) {
+ strbuf_addstr(&name, entry.path);
+ match = submodule_path_match(pathspec, name.buf,
+ NULL);
+ } else {
+ match = tree_entry_interesting(&entry, &name,
+ 0, pathspec);
+ }
+
if (match == all_entries_not_interesting)
break;
if (match == entry_not_interesting)
diff --git a/submodule.c b/submodule.c
index f2a5668..062e58b 100644
--- a/submodule.c
+++ b/submodule.c
@@ -221,31 +221,30 @@ int is_submodule_initialized(const char *path)
module = submodule_from_path(null_sha1, path);
if (module) {
- struct strbuf buf = STRBUF_INIT;
- char *submodule_url = NULL;
+ char *key = xstrfmt("submodule.%s.url", module->name);
+ char *value = NULL;
- strbuf_addf(&buf, "submodule.%s.url",module->name);
- ret = !git_config_get_string(buf.buf, &submodule_url);
+ ret = !git_config_get_string(key, &value);
- free(submodule_url);
- strbuf_release(&buf);
+ free(value);
+ free(key);
}
return ret;
}
/*
- * Determine if a submodule has been checked out at a given 'path'
+ * Determine if a submodule has been populated at a given 'path'
*/
-int is_submodule_checked_out(const char *path)
+int is_submodule_populated(const char *path)
{
int ret = 0;
- struct strbuf buf = STRBUF_INIT;
+ char *gitdir = xstrfmt("%s/.git", path);
- strbuf_addf(&buf, "%s/.git", path);
- ret = file_exists(buf.buf);
+ if (resolve_gitdir(gitdir))
+ ret = 1;
- strbuf_release(&buf);
+ free(gitdir);
return ret;
}
diff --git a/submodule.h b/submodule.h
index 9a24ac8..9203d89 100644
--- a/submodule.h
+++ b/submodule.h
@@ -39,7 +39,7 @@ int submodule_config(const char *var, const char *value, void *cb);
void gitmodules_config(void);
extern void gitmodules_config_sha1(const unsigned char *commit_sha1);
extern int is_submodule_initialized(const char *path);
-extern int is_submodule_checked_out(const char *path);
+extern int is_submodule_populated(const char *path);
int parse_submodule_update_strategy(const char *value,
struct submodule_update_strategy *dst);
const char *submodule_strategy_to_string(const struct submodule_update_strategy *s);
diff --git a/t/t7814-grep-recurse-submodules.sh b/t/t7814-grep-recurse-submodules.sh
index 3d1892d..ee173ad 100755
--- a/t/t7814-grep-recurse-submodules.sh
+++ b/t/t7814-grep-recurse-submodules.sh
@@ -127,6 +127,47 @@ test_expect_success 'grep tree and pathspecs' '
test_cmp expect actual
'
+test_expect_success 'grep history with moved submoules' '
+ git init parent &&
+ echo "foobar" >parent/file &&
+ git -C parent add file &&
+ git -C parent commit -m "add file" &&
+
+ git init sub &&
+ echo "foobar" >sub/file &&
+ git -C sub add file &&
+ git -C sub commit -m "add file" &&
+
+ git -C parent submodule add ../sub &&
+ git -C parent commit -m "add submodule" &&
+
+ cat >expect <<-\EOF &&
+ file:foobar
+ sub/file:foobar
+ EOF
+ git -C parent grep -e "foobar" --recurse-submodules > actual &&
+ test_cmp expect actual &&
+
+ git -C parent mv sub sub-moved &&
+ git -C parent commit -m "moved submodule" &&
+
+ cat >expect <<-\EOF &&
+ file:foobar
+ sub-moved/file:foobar
+ EOF
+ git -C parent grep -e "foobar" --recurse-submodules > actual &&
+ test_cmp expect actual &&
+
+ cat >expect <<-\EOF &&
+ HEAD^:file:foobar
+ HEAD^:sub/file:foobar
+ EOF
+ git -C parent grep -e "foobar" --recurse-submodules HEAD^ > actual &&
+ test_cmp expect actual &&
+
+ rm -rf parent sub
+'
+
test_incompatible_with_recurse_submodules ()
{
test_expect_success "--recurse-submodules and $1 are incompatible" "
diff --git a/tree-walk.c b/tree-walk.c
index b3f9961..828f435 100644
--- a/tree-walk.c
+++ b/tree-walk.c
@@ -999,11 +999,10 @@ static enum interesting do_match(const struct name_entry *entry,
return entry_interesting;
/*
- * Match all directories and gitlinks. We'll
- * try to match files later on.
+ * Match all directories. We'll try to
+ * match files later on.
*/
- if (ps->recursive && (S_ISDIR(entry->mode) ||
- S_ISGITLINK(entry->mode)))
+ if (ps->recursive && S_ISDIR(entry->mode))
return entry_interesting;
}
@@ -1044,13 +1043,13 @@ static enum interesting do_match(const struct name_entry *entry,
strbuf_setlen(base, base_offset + baselen);
/*
- * Match all directories and gitlinks. We'll try to match files
- * later on. max_depth is ignored but we may consider support
- * it in future, see
+ * Match all directories. We'll try to match files
+ * later on.
+ * max_depth is ignored but we may consider support it
+ * in future, see
* http://thread.gmane.org/gmane.comp.version-control.git/163757/focus=163840
*/
- if (ps->recursive && (S_ISDIR(entry->mode) ||
- S_ISGITLINK(entry->mode)))
+ if (ps->recursive && S_ISDIR(entry->mode))
return entry_interesting;
}
return never_interesting; /* No matches */
--
2.8.0.rc3.226.g39d4020
next prev parent reply other threads:[~2016-11-11 23:57 UTC|newest]
Thread overview: 126+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-10-27 22:38 [RFC PATCH 0/5] recursively grep across submodules Brandon Williams
2016-10-27 22:38 ` [PATCH 1/5] submodules: add helper functions to determine presence of submodules Brandon Williams
2016-10-27 22:38 ` [PATCH 2/5] submodules: load gitmodules file from commit sha1 Brandon Williams
2016-10-27 22:38 ` [PATCH 3/5] grep: add submodules as a grep source type Brandon Williams
2016-10-27 22:38 ` [PATCH 4/5] grep: optionally recurse into submodules Brandon Williams
2016-11-05 5:09 ` Jonathan Tan
2016-10-27 22:38 ` [PATCH 5/5] grep: enable recurse-submodules to work on <tree> objects Brandon Williams
2016-10-28 19:35 ` Brandon Williams
2016-10-27 23:26 ` [RFC PATCH 0/5] recursively grep across submodules Junio C Hamano
2016-10-28 0:59 ` Stefan Beller
2016-10-28 2:50 ` Junio C Hamano
2016-10-28 3:46 ` Stefan Beller
2016-10-28 15:06 ` Philip Oakley
2016-10-28 17:02 ` Brandon Williams
2016-10-28 17:21 ` Junio C Hamano
2016-10-31 22:38 ` [PATCH v2 0/6] " Brandon Williams
2016-10-31 22:38 ` [PATCH v2 1/6] submodules: add helper functions to determine presence of submodules Brandon Williams
2016-10-31 23:34 ` Stefan Beller
2016-11-01 17:20 ` Junio C Hamano
2016-11-01 17:24 ` Brandon Williams
2016-11-01 17:31 ` Stefan Beller
2016-11-06 7:42 ` Jacob Keller
2016-11-01 17:23 ` Brandon Williams
2016-11-05 2:34 ` Jonathan Tan
2016-10-31 22:38 ` [PATCH v2 2/6] submodules: load gitmodules file from commit sha1 Brandon Williams
2016-11-01 16:39 ` Stefan Beller
2016-10-31 22:38 ` [PATCH v2 3/6] grep: add submodules as a grep source type Brandon Williams
2016-11-01 16:53 ` Stefan Beller
2016-11-01 17:31 ` Junio C Hamano
2016-10-31 22:38 ` [PATCH v2 4/6] grep: optionally recurse into submodules Brandon Williams
2016-11-01 17:26 ` Stefan Beller
2016-11-01 20:25 ` Brandon Williams
2016-10-31 22:38 ` [PATCH v2 5/6] grep: enable recurse-submodules to work on <tree> objects Brandon Williams
2016-11-11 23:09 ` Jonathan Tan
2016-10-31 22:38 ` [PATCH v2 6/6] grep: search history of moved submodules Brandon Williams
2016-11-11 23:51 ` Brandon Williams [this message]
2016-11-11 23:51 ` [PATCH v3 1/6] submodules: add helper functions to determine presence of submodules Brandon Williams
2016-11-15 23:49 ` Stefan Beller
2016-11-11 23:51 ` [PATCH v3 2/6] submodules: load gitmodules file from commit sha1 Brandon Williams
2016-11-12 0:22 ` Stefan Beller
2016-11-11 23:51 ` [PATCH v3 3/6] grep: add submodules as a grep source type Brandon Williams
2016-11-11 23:51 ` [PATCH v3 4/6] grep: optionally recurse into submodules Brandon Williams
2016-11-16 0:07 ` Stefan Beller
2016-11-17 22:13 ` Brandon Williams
2016-11-11 23:51 ` [PATCH v3 5/6] grep: enable recurse-submodules to work on <tree> objects Brandon Williams
2016-11-14 18:10 ` Junio C Hamano
2016-11-14 18:44 ` Jonathan Tan
2016-11-14 18:56 ` Junio C Hamano
2016-11-14 19:08 ` Jonathan Tan
2016-11-14 19:14 ` Brandon Williams
2016-11-16 1:09 ` Stefan Beller
2016-11-17 23:34 ` Brandon Williams
2016-11-11 23:51 ` [PATCH v3 6/6] grep: search history of moved submodules Brandon Williams
2016-11-12 0:30 ` Stefan Beller
2016-11-14 17:43 ` Brandon Williams
2016-11-15 17:42 ` [PATCH v3 0/6] recursively grep across submodules Stefan Beller
2016-11-18 19:58 ` [PATCH v4 " Brandon Williams
2016-11-18 19:58 ` [PATCH v4 1/6] submodules: add helper functions to determine presence of submodules Brandon Williams
2016-11-18 19:58 ` [PATCH v4 2/6] submodules: load gitmodules file from commit sha1 Brandon Williams
2016-11-18 19:58 ` [PATCH v4 3/6] grep: add submodules as a grep source type Brandon Williams
2016-11-18 21:37 ` Junio C Hamano
2016-11-18 22:56 ` Brandon Williams
2016-11-18 19:58 ` [PATCH v4 4/6] grep: optionally recurse into submodules Brandon Williams
2016-11-18 21:48 ` Junio C Hamano
2016-11-18 22:01 ` Junio C Hamano
2016-11-18 22:14 ` Junio C Hamano
2016-11-18 22:58 ` Brandon Williams
2016-11-18 19:58 ` [PATCH v4 5/6] grep: enable recurse-submodules to work on <tree> objects Brandon Williams
2016-11-18 22:19 ` Junio C Hamano
2016-11-18 22:52 ` Brandon Williams
2016-11-21 18:14 ` Brandon Williams
2016-11-18 19:58 ` [PATCH v4 6/6] grep: search history of moved submodules Brandon Williams
2016-11-18 20:10 ` [PATCH v4 0/6] recursively grep across submodules Stefan Beller
2016-11-22 18:46 ` [PATCH v5 " Brandon Williams
2016-11-22 18:46 ` [PATCH v5 1/6] submodules: add helper functions to determine presence of submodules Brandon Williams
2016-11-22 18:46 ` [PATCH v5 2/6] submodules: load gitmodules file from commit sha1 Brandon Williams
2016-11-22 18:46 ` [PATCH v5 3/6] grep: add submodules as a grep source type Brandon Williams
2016-11-22 18:46 ` [PATCH v5 4/6] grep: optionally recurse into submodules Brandon Williams
2016-11-22 18:46 ` [PATCH v5 5/6] grep: enable recurse-submodules to work on <tree> objects Brandon Williams
2016-11-22 22:59 ` Junio C Hamano
2016-11-22 23:21 ` Brandon Williams
2016-11-22 23:28 ` Brandon Williams
2016-11-22 23:37 ` Junio C Hamano
2016-11-22 23:54 ` Brandon Williams
2016-11-22 18:46 ` [PATCH v5 6/6] grep: search history of moved submodules Brandon Williams
2016-12-01 1:28 ` [PATCH v6 0/6] recursively grep across submodules Brandon Williams
2016-12-01 1:28 ` [PATCH v6 1/6] submodules: add helper functions to determine presence of submodules Brandon Williams
2016-12-01 4:29 ` Jeff King
2016-12-01 18:31 ` Stefan Beller
2016-12-01 18:46 ` Junio C Hamano
2016-12-01 19:09 ` Jeff King
2016-12-01 19:16 ` Brandon Williams
2016-12-01 20:54 ` Brandon Williams
2016-12-01 20:59 ` Jeff King
2016-12-01 21:56 ` Stefan Beller
2016-12-01 21:59 ` Jeff King
2016-12-02 18:36 ` Brandon Williams
2016-12-02 18:44 ` Jacob Keller
2016-12-02 18:49 ` Brandon Williams
2016-12-02 19:20 ` Jacob Keller
2016-12-02 19:28 ` Stefan Beller
2016-12-02 21:31 ` Jacob Keller
2016-12-02 21:46 ` Brandon Williams
2016-12-02 21:45 ` Jeff King
2016-12-03 0:16 ` Brandon Williams
2016-12-01 1:28 ` [PATCH v6 2/6] submodules: load gitmodules file from commit sha1 Brandon Williams
2016-12-01 1:28 ` [PATCH v6 3/6] grep: add submodules as a grep source type Brandon Williams
2016-12-01 1:28 ` [PATCH v6 4/6] grep: optionally recurse into submodules Brandon Williams
2016-12-01 1:28 ` [PATCH v6 5/6] grep: enable recurse-submodules to work on <tree> objects Brandon Williams
2016-12-01 7:25 ` Johannes Sixt
2016-12-01 17:51 ` Brandon Williams
2016-12-01 18:49 ` Junio C Hamano
2016-12-01 18:52 ` Jeff King
2016-12-01 1:28 ` [PATCH v6 6/6] grep: search history of moved submodules Brandon Williams
2016-12-01 4:22 ` [PATCH v6 0/6] recursively grep across submodules Jeff King
2016-12-01 17:45 ` Brandon Williams
2016-12-01 19:03 ` Jeff King
2016-12-16 19:03 ` [PATCH v7 0/7] " Brandon Williams
2016-12-16 19:03 ` [PATCH v7 1/7] submodules: add helper to determine if a submodule is populated Brandon Williams
2016-12-16 19:03 ` [PATCH v7 2/7] submodules: add helper to determine if a submodule is initialized Brandon Williams
2016-12-16 19:03 ` [PATCH v7 3/7] submodules: load gitmodules file from commit sha1 Brandon Williams
2016-12-16 19:03 ` [PATCH v7 4/7] grep: add submodules as a grep source type Brandon Williams
2016-12-16 19:03 ` [PATCH v7 5/7] grep: optionally recurse into submodules Brandon Williams
2016-12-16 19:03 ` [PATCH v7 6/7] grep: enable recurse-submodules to work on <tree> objects Brandon Williams
2016-12-16 19:03 ` [PATCH v7 7/7] grep: search history of moved submodules Brandon Williams
2016-12-16 21:42 ` [PATCH v7 0/7] recursively grep across submodules Junio C Hamano
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=1478908273-190166-1-git-send-email-bmwill@google.com \
--to=bmwill@google.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jonathantanmy@google.com \
--cc=sbeller@google.com \
/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).