grep --no-index: allow use of "git grep" outside a git repository
Just like some people wanted diff features that are not found in other people's diff implementations outside of a git repository and added --no-index mode to the command, this adds --no-index mode to the "git grep" command. Also, inside a git repository, --no-index mode allows you to grep in untracked (but not ignored) files. Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
7e622650d7
commit
308162372d
@ -14,6 +14,7 @@
|
|||||||
#include "userdiff.h"
|
#include "userdiff.h"
|
||||||
#include "grep.h"
|
#include "grep.h"
|
||||||
#include "quote.h"
|
#include "quote.h"
|
||||||
|
#include "dir.h"
|
||||||
|
|
||||||
static char const * const grep_usage[] = {
|
static char const * const grep_usage[] = {
|
||||||
"git grep [options] [-e] <pattern> [<rev>...] [[--] path...]",
|
"git grep [options] [-e] <pattern> [<rev>...] [[--] path...]",
|
||||||
@ -320,6 +321,21 @@ static int grep_object(struct grep_opt *opt, const char **paths,
|
|||||||
die("unable to grep from object of type %s", typename(obj->type));
|
die("unable to grep from object of type %s", typename(obj->type));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int grep_directory(struct grep_opt *opt, const char **paths)
|
||||||
|
{
|
||||||
|
struct dir_struct dir;
|
||||||
|
int i, hit = 0;
|
||||||
|
|
||||||
|
memset(&dir, 0, sizeof(dir));
|
||||||
|
setup_standard_excludes(&dir);
|
||||||
|
|
||||||
|
fill_directory(&dir, paths);
|
||||||
|
for (i = 0; i < dir.nr; i++)
|
||||||
|
hit |= grep_file(opt, dir.entries[i]->name);
|
||||||
|
free_grep_patterns(opt);
|
||||||
|
return hit;
|
||||||
|
}
|
||||||
|
|
||||||
static int context_callback(const struct option *opt, const char *arg,
|
static int context_callback(const struct option *opt, const char *arg,
|
||||||
int unset)
|
int unset)
|
||||||
{
|
{
|
||||||
@ -418,6 +434,8 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
|
|||||||
struct option options[] = {
|
struct option options[] = {
|
||||||
OPT_BOOLEAN(0, "cached", &cached,
|
OPT_BOOLEAN(0, "cached", &cached,
|
||||||
"search in index instead of in the work tree"),
|
"search in index instead of in the work tree"),
|
||||||
|
OPT_BOOLEAN(0, "index", &use_index,
|
||||||
|
"--no-index finds in contents not managed by git"),
|
||||||
OPT_GROUP(""),
|
OPT_GROUP(""),
|
||||||
OPT_BOOLEAN('v', "invert-match", &opt.invert,
|
OPT_BOOLEAN('v', "invert-match", &opt.invert,
|
||||||
"show non-matching lines"),
|
"show non-matching lines"),
|
||||||
@ -591,6 +609,14 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
|
|||||||
paths[1] = NULL;
|
paths[1] = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!use_index) {
|
||||||
|
if (cached)
|
||||||
|
die("--cached cannot be used with --no-index.");
|
||||||
|
if (list.nr)
|
||||||
|
die("--no-index cannot be used with revs.");
|
||||||
|
return !grep_directory(&opt, paths);
|
||||||
|
}
|
||||||
|
|
||||||
if (!list.nr) {
|
if (!list.nr) {
|
||||||
if (!cached)
|
if (!cached)
|
||||||
setup_work_tree();
|
setup_work_tree();
|
||||||
|
@ -426,4 +426,56 @@ test_expect_success 'grep -Fi' '
|
|||||||
test_cmp expected actual
|
test_cmp expected actual
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'outside of git repository' '
|
||||||
|
rm -fr non &&
|
||||||
|
mkdir -p non/git/sub &&
|
||||||
|
echo hello >non/git/file1 &&
|
||||||
|
echo world >non/git/sub/file2 &&
|
||||||
|
echo ".*o*" >non/git/.gitignore &&
|
||||||
|
{
|
||||||
|
echo file1:hello &&
|
||||||
|
echo sub/file2:world
|
||||||
|
} >non/expect.full &&
|
||||||
|
echo file2:world >non/expect.sub
|
||||||
|
(
|
||||||
|
GIT_CEILING_DIRECTORIES="$(pwd)/non/git" &&
|
||||||
|
export GIT_CEILING_DIRECTORIES &&
|
||||||
|
cd non/git &&
|
||||||
|
test_must_fail git grep o &&
|
||||||
|
git grep --no-index o >../actual.full &&
|
||||||
|
test_cmp ../expect.full ../actual.full
|
||||||
|
cd sub &&
|
||||||
|
test_must_fail git grep o &&
|
||||||
|
git grep --no-index o >../../actual.sub &&
|
||||||
|
test_cmp ../../expect.sub ../../actual.sub
|
||||||
|
)
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'inside git repository but with --no-index' '
|
||||||
|
rm -fr is &&
|
||||||
|
mkdir -p is/git/sub &&
|
||||||
|
echo hello >is/git/file1 &&
|
||||||
|
echo world >is/git/sub/file2 &&
|
||||||
|
echo ".*o*" >is/git/.gitignore &&
|
||||||
|
{
|
||||||
|
echo file1:hello &&
|
||||||
|
echo sub/file2:world
|
||||||
|
} >is/expect.full &&
|
||||||
|
: >is/expect.empty &&
|
||||||
|
echo file2:world >is/expect.sub
|
||||||
|
(
|
||||||
|
cd is/git &&
|
||||||
|
git init &&
|
||||||
|
test_must_fail git grep o >../actual.full &&
|
||||||
|
test_cmp ../expect.empty ../actual.full &&
|
||||||
|
git grep --no-index o >../actual.full &&
|
||||||
|
test_cmp ../expect.full ../actual.full &&
|
||||||
|
cd sub &&
|
||||||
|
test_must_fail git grep o >../../actual.sub &&
|
||||||
|
test_cmp ../../expect.empty ../../actual.sub &&
|
||||||
|
git grep --no-index o >../../actual.sub &&
|
||||||
|
test_cmp ../../expect.sub ../../actual.sub
|
||||||
|
)
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
Loading…
Reference in New Issue
Block a user