[PATCH v2] grep: ignore --recurse-submodules if --no-index is given
- From
Philippe Blain via GitGitGadget <gitgitgadget@gmail.com>
- Date
- Jan 30, 2020, 13:37 UTC
- Message-ID
- <pull.540.v2.git.1580391448318.gitgitgadget@gmail.com>
- In-Reply-To
- <pull.540.git.1580000298097.gitgitgadget@gmail.com>
From: Philippe Blain <levraiphilippeblain@gmail.com>
Since grep learned to recurse into submodules in 0281e487fd (grep: optionally recurse into submodules, 2016-12-16), using --recurse-submodules along with --no-index makes Git die().
This is unfortunate because if submodule.recurse is set in a user's ~/.gitconfig, invoking `git grep --no-index` either inside or outside a Git repository results in
fatal: option not supported with --recurse-submodules
Let's allow using these options together, so that setting submodule.recurse globally does not prevent using `git grep --no-index`.
Using `--recurse-submodules` should not have any effect if `--no-index` is used inside a repository, as Git will recurse into the checked out submodule directories just like into regular directories.
Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
---
grep: ignore --recurse-submodules if --no-index is given
Changes since v1:
* set recurse_submodules to 0 early in cmd_grep if !use_index. This
makes more sense, and eliminates an incompatibility with topic
mt/threaded-grep-in-object-store.
v1: Since grep learned to recurse into submodules in 0281e487fd (grep:
optionally recurse into submodules, 2016-12-16), using
--recurse-submodules along with --no-index makes Git die().
This is unfortunate because if submodule.recurse is set in a user's
~/.gitconfig, invoking git grep --no-index either inside or outside a
Git repository results in
fatal: option not supported with --recurse-submodules
Let's allow using these options together, so that setting
submodule.recurse globally does not prevent using git grep --no-index.
Using --recurse-submodules should not have any effect if --no-indexis
used inside a repository, as Git will recurse into the checked out
submodule directories just like into regular directories.Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-540%2Fphil-blain%2Fgrep-no-index-ignore-recurse-submodule-v2 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-540/phil-blain/grep-no-index-ignore-recurse-submodule-v2 Pull-Request: https://github.com/gitgitgadget/git/pull/540
Range-diff vs v1:
1: 6634266b01 ! 1: 6fc8bf788a grep: ignore --recurse-submodules if --no-index is given
@@ -20,6 +20,7 @@
is used inside a repository, as Git will recurse into the checked out
submodule directories just like into regular directories.
+ Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
diff --git a/Documentation/git-grep.txt b/Documentation/git-grep.txt
@@ -39,6 +40,16 @@
diff --git a/builtin/grep.c b/builtin/grep.c
--- a/builtin/grep.c
+++ b/builtin/grep.c
+@@
+ /* die the same way as if we did it at the beginning */
+ setup_git_directory();
+ }
++ /* Ignore --recurse-submodules if --no-index is given or implied */
++ if (!use_index)
++ recurse_submodules = 0;
+
+ /*
+ * skip a -- separator; we know it cannot be
@@
}
}Documentation/git-grep.txt | 3 ++- builtin/grep.c | 7 +++++-- t/t7814-grep-recurse-submodules.sh | 11 ++++++++++- 3 files changed, 17 insertions(+), 4 deletions(-)
diff --git a/Documentation/git-grep.txt b/Documentation/git-grep.txt index c89fb569e3..ffc3a6efdc 100644 --- a/Documentation/git-grep.txt +++ b/Documentation/git-grep.txt @@ -96,7 +96,8 @@ OPTIONS Recursively search in each submodule that has been initialized and checked out in the repository. When used in combination with the <tree> option the prefix of all submodule output will be the name of - the parent project's <tree> object. + the parent project's <tree> object. This option has no effect + if `--no-index` is given. -a:: --text:: diff --git a/builtin/grep.c b/builtin/grep.c index 50ce8d9461..ae2d5bbafc 100644 --- a/builtin/grep.c +++ b/builtin/grep.c @@ -958,6 +958,9 @@ int cmd_grep(int argc, const char **argv, const char *prefix) /* die the same way as if we did it at the beginning */ setup_git_directory(); } + /* Ignore --recurse-submodules if --no-index is given or implied */ + if (!use_index) + recurse_submodules = 0; /* * skip a -- separator; we know it cannot be @@ -1115,8 +1118,8 @@ int cmd_grep(int argc, const char **argv, const char *prefix) } } - if (recurse_submodules && (!use_index || untracked)) - die(_("option not supported with --recurse-submodules")); + if (recurse_submodules && untracked) + die(_("--untracked not supported with --recurse-submodules")); if (!show_in_pager && !opt.status_only) setup_pager(); diff --git a/t/t7814-grep-recurse-submodules.sh b/t/t7814-grep-recurse-submodules.sh index 946f91fa57..828cb3ba58 100755 --- a/t/t7814-grep-recurse-submodules.sh +++ b/t/t7814-grep-recurse-submodules.sh @@ -345,7 +345,16 @@ test_incompatible_with_recurse_submodules () } test_incompatible_with_recurse_submodules --untracked -test_incompatible_with_recurse_submodules --no-index + +test_expect_success 'grep --recurse-submodules --no-index ignores --recurse-submodules' ' + git grep --recurse-submodules --no-index -e "^(.|.)[\d]" >actual && + cat >expect <<-\EOF && + a:(1|2)d(3|4) + submodule/a:(1|2)d(3|4) + submodule/sub/a:(1|2)d(3|4) + EOF + test_cmp expect actual +' test_expect_success 'grep --recurse-submodules should pass the pattern type along' ' # Fixed base-commit: bc7a3d4dc04dd719e7c8c35ebd7a6e6651c5c5b6
-- gitgitgadget