builtin-grep: workaround for non GNU grep.
Some implementations do not know what to do with -H; define NO_H_OPTION_IN_GREP when you build git if your grep lacks -H. Most of the time, it can be worked around by prepending /dev/null to the argument list, but that causes -L and -c to slightly misbehave (they both expose /dev/null is given), so when these options are given, do not run external grep that does not understand -H. Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
parent
63dffdf03d
commit
518920b764
11
Makefile
11
Makefile
@ -46,6 +46,8 @@ all:
|
||||
#
|
||||
# Define NO_MMAP if you want to avoid mmap.
|
||||
#
|
||||
# Define NO_H_OPTION_IN_GREP if your grep does not understand -H.
|
||||
#
|
||||
# Define WITH_OWN_SUBPROCESS_PY if you want to use with python 2.3.
|
||||
#
|
||||
# Define NO_IPV6 if you lack IPv6 support and getaddrinfo().
|
||||
@ -444,6 +446,12 @@ ifdef NO_ACCURATE_DIFF
|
||||
ALL_CFLAGS += -DNO_ACCURATE_DIFF
|
||||
endif
|
||||
|
||||
ifdef NO_H_OPTION_IN_GREP
|
||||
NO_H_OPTION_IN_GREP=1
|
||||
else
|
||||
NO_H_OPTION_IN_GREP=0
|
||||
endif
|
||||
|
||||
# Shell quote (do not use $(call) to accomodate ancient setups);
|
||||
|
||||
SHA1_HEADER_SQ = $(subst ','\'',$(SHA1_HEADER))
|
||||
@ -526,6 +534,9 @@ git$X git.spec \
|
||||
%.o: %.S
|
||||
$(CC) -o $*.o -c $(ALL_CFLAGS) $<
|
||||
|
||||
builtin-grep.o: builtin-grep.c
|
||||
$(CC) -o $*.o -c $(ALL_CFLAGS) -DNO_H_OPTION_IN_GREP=$(NO_H_OPTION_IN_GREP) $<
|
||||
|
||||
exec_cmd.o: exec_cmd.c
|
||||
$(CC) -o $*.o -c $(ALL_CFLAGS) '-DGIT_EXEC_PATH="$(gitexecdir_SQ)"' $<
|
||||
|
||||
|
@ -453,7 +453,6 @@ static int external_grep(struct grep_opt *opt, const char **paths, int cached)
|
||||
|
||||
len = nr = 0;
|
||||
push_arg("grep");
|
||||
push_arg("-H");
|
||||
if (opt->fixed)
|
||||
push_arg("-F");
|
||||
if (opt->linenum)
|
||||
@ -503,7 +502,13 @@ static int external_grep(struct grep_opt *opt, const char **paths, int cached)
|
||||
push_arg("-e");
|
||||
push_arg(p->pattern);
|
||||
}
|
||||
push_arg("--");
|
||||
|
||||
if (NO_H_OPTION_IN_GREP)
|
||||
push_arg("/dev/null");
|
||||
else {
|
||||
push_arg("-H");
|
||||
push_arg("--");
|
||||
}
|
||||
|
||||
hit = 0;
|
||||
argc = nr;
|
||||
@ -535,8 +540,19 @@ static int grep_cache(struct grep_opt *opt, const char **paths, int cached)
|
||||
* Use the external "grep" command for the case where
|
||||
* we grep through the checked-out files. It tends to
|
||||
* be a lot more optimized
|
||||
*
|
||||
* Some grep implementations do not understand -H nor --
|
||||
* but /dev/null can be used as a substitution in most
|
||||
* cases.
|
||||
*
|
||||
* However -L and -c would slightly misbehave (-L would
|
||||
* list /dev/null as a hit, and -c would report 0 hits
|
||||
* from /dev/null); so do not use the external one on
|
||||
* such platforms.
|
||||
*/
|
||||
if (!cached) {
|
||||
if (!cached &&
|
||||
(!NO_H_OPTION_IN_GREP ||
|
||||
(!opt->count && !opt->unmatch_name_only))) {
|
||||
hit = external_grep(opt, paths, cached);
|
||||
if (hit >= 0)
|
||||
return hit;
|
||||
|
Loading…
Reference in New Issue
Block a user