Merge branch 'rz/grepz'
* rz/grepz: git grep: Add "-z/--null" option as in GNU's grep.
This commit is contained in:
commit
86193807cf
@ -15,6 +15,7 @@ SYNOPSIS
|
|||||||
[-E | --extended-regexp] [-G | --basic-regexp]
|
[-E | --extended-regexp] [-G | --basic-regexp]
|
||||||
[-F | --fixed-strings] [-n]
|
[-F | --fixed-strings] [-n]
|
||||||
[-l | --files-with-matches] [-L | --files-without-match]
|
[-l | --files-with-matches] [-L | --files-without-match]
|
||||||
|
[-z | --null]
|
||||||
[-c | --count] [--all-match]
|
[-c | --count] [--all-match]
|
||||||
[-A <post-context>] [-B <pre-context>] [-C <context>]
|
[-A <post-context>] [-B <pre-context>] [-C <context>]
|
||||||
[-f <file>] [-e] <pattern>
|
[-f <file>] [-e] <pattern>
|
||||||
@ -94,6 +95,11 @@ OPTIONS
|
|||||||
For better compatibility with 'git-diff', --name-only is a
|
For better compatibility with 'git-diff', --name-only is a
|
||||||
synonym for --files-with-matches.
|
synonym for --files-with-matches.
|
||||||
|
|
||||||
|
-z::
|
||||||
|
--null::
|
||||||
|
Output \0 instead of the character that normally follows a
|
||||||
|
file name.
|
||||||
|
|
||||||
-c::
|
-c::
|
||||||
--count::
|
--count::
|
||||||
Instead of showing every matched line, show the number of
|
Instead of showing every matched line, show the number of
|
||||||
|
@ -295,6 +295,9 @@ static int external_grep(struct grep_opt *opt, const char **paths, int cached)
|
|||||||
push_arg("-l");
|
push_arg("-l");
|
||||||
if (opt->unmatch_name_only)
|
if (opt->unmatch_name_only)
|
||||||
push_arg("-L");
|
push_arg("-L");
|
||||||
|
if (opt->null_following_name)
|
||||||
|
/* in GNU grep git's "-z" translates to "-Z" */
|
||||||
|
push_arg("-Z");
|
||||||
if (opt->count)
|
if (opt->count)
|
||||||
push_arg("-c");
|
push_arg("-c");
|
||||||
if (opt->post_context || opt->pre_context) {
|
if (opt->post_context || opt->pre_context) {
|
||||||
@ -599,6 +602,11 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
|
|||||||
opt.unmatch_name_only = 1;
|
opt.unmatch_name_only = 1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (!strcmp("-z", arg) ||
|
||||||
|
!strcmp("--null", arg)) {
|
||||||
|
opt.null_following_name = 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (!strcmp("-c", arg) ||
|
if (!strcmp("-c", arg) ||
|
||||||
!strcmp("--count", arg)) {
|
!strcmp("--count", arg)) {
|
||||||
opt.count = 1;
|
opt.count = 1;
|
||||||
|
14
grep.c
14
grep.c
@ -239,6 +239,8 @@ static int word_char(char ch)
|
|||||||
static void show_line(struct grep_opt *opt, const char *bol, const char *eol,
|
static void show_line(struct grep_opt *opt, const char *bol, const char *eol,
|
||||||
const char *name, unsigned lno, char sign)
|
const char *name, unsigned lno, char sign)
|
||||||
{
|
{
|
||||||
|
if (opt->null_following_name)
|
||||||
|
sign = '\0';
|
||||||
if (opt->pathname)
|
if (opt->pathname)
|
||||||
printf("%s%c", name, sign);
|
printf("%s%c", name, sign);
|
||||||
if (opt->linenum)
|
if (opt->linenum)
|
||||||
@ -246,6 +248,11 @@ static void show_line(struct grep_opt *opt, const char *bol, const char *eol,
|
|||||||
printf("%.*s\n", (int)(eol-bol), bol);
|
printf("%.*s\n", (int)(eol-bol), bol);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void show_name(struct grep_opt *opt, const char *name)
|
||||||
|
{
|
||||||
|
printf("%s%c", name, opt->null_following_name ? '\0' : '\n');
|
||||||
|
}
|
||||||
|
|
||||||
static int fixmatch(const char *pattern, char *line, regmatch_t *match)
|
static int fixmatch(const char *pattern, char *line, regmatch_t *match)
|
||||||
{
|
{
|
||||||
char *hit = strstr(line, pattern);
|
char *hit = strstr(line, pattern);
|
||||||
@ -489,7 +496,7 @@ static int grep_buffer_1(struct grep_opt *opt, const char *name,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (opt->name_only) {
|
if (opt->name_only) {
|
||||||
printf("%s\n", name);
|
show_name(opt, name);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
/* Hit at this line. If we haven't shown the
|
/* Hit at this line. If we haven't shown the
|
||||||
@ -555,7 +562,7 @@ static int grep_buffer_1(struct grep_opt *opt, const char *name,
|
|||||||
return 0;
|
return 0;
|
||||||
if (opt->unmatch_name_only) {
|
if (opt->unmatch_name_only) {
|
||||||
/* We did not see any hit, so we want to show this */
|
/* We did not see any hit, so we want to show this */
|
||||||
printf("%s\n", name);
|
show_name(opt, name);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -565,7 +572,8 @@ static int grep_buffer_1(struct grep_opt *opt, const char *name,
|
|||||||
* make it another option? For now suppress them.
|
* make it another option? For now suppress them.
|
||||||
*/
|
*/
|
||||||
if (opt->count && count)
|
if (opt->count && count)
|
||||||
printf("%s:%u\n", name, count);
|
printf("%s%c%u\n", name,
|
||||||
|
opt->null_following_name ? '\0' : ':', count);
|
||||||
return !!last_hit;
|
return !!last_hit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
1
grep.h
1
grep.h
@ -74,6 +74,7 @@ struct grep_opt {
|
|||||||
unsigned extended:1;
|
unsigned extended:1;
|
||||||
unsigned relative:1;
|
unsigned relative:1;
|
||||||
unsigned pathname:1;
|
unsigned pathname:1;
|
||||||
|
unsigned null_following_name:1;
|
||||||
int regflags;
|
int regflags;
|
||||||
unsigned pre_context;
|
unsigned pre_context;
|
||||||
unsigned post_context;
|
unsigned post_context;
|
||||||
|
Loading…
Reference in New Issue
Block a user