git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] builtin-grep: workaround for non GNU grep.

From
Junio C Hamano <junkio@cox.net>
Date
May 17, 2006, 09:54 UTC
Message-ID
<7vves5geng.fsf_-_@assigned-by-dhcp.cox.net>
In-Reply-To
<7vejythvkr.fsf@assigned-by-dhcp.cox.net>

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>
---
 Junio C Hamano <junkio@cox.net> writes:
 > But I think this approach breaks -L; I do not think Solaris
 > supports -L, so it does not matter there, but on platforms that
 > knows how to do -L it does.
 So this is an updated version.  I am not proud of the handling
 of the new Makefile variable, although I like the C code that
 does not need #ifdef thanks to it.
 Makefile       |   11 +++++++++++
 builtin-grep.c |   22 +++++++++++++++++++---
 2 files changed, 30 insertions(+), 3 deletions(-)
diff --git a/Makefile b/Makefile
index 9ba608c..c67108d 100644
--- a/Makefile
+++ b/Makefile
@@ -46,6 +46,8 @@ # Patrick Mauritz).
 #
 # 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)"' $<
 
diff --git a/builtin-grep.c b/builtin-grep.c
index 66111de..36512d8 100644
--- a/builtin-grep.c
+++ b/builtin-grep.c
@@ -453,7 +453,6 @@ static int external_grep(struct grep_opt
 
 	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
 		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 @@ #ifdef __unix__
 	 * 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;
-- 
1.3.3.g8a24
Previous: Junio C HamanoNext: Linus Torvalds
Message 25 of 36 in “Git 1.3.2 on Solaris”
  1. Stefan PfetzingMay 16, 2006
  2. Jason RiedyMay 17, 2006
  3. Linus TorvaldsMay 17, 2006
  4. Jason RiedyMay 17, 2006
  5. Linus TorvaldsMay 17, 2006
  6. Stefan PfetzingMay 17, 2006
  7. Linus TorvaldsMay 17, 2006
  8. Stefan PfetzingMay 17, 2006
  9. Linus TorvaldsMay 17, 2006
  10. Jason RiedyMay 17, 2006
  11. Stefan PfetzingMay 23, 2006
  12. Jason RiedyMay 23, 2006
  13. Stefan PfetzingMay 23, 2006
  14. Linus TorvaldsMay 23, 2006
  15. Edgar ToernigMay 23, 2006
  16. Linus TorvaldsMay 23, 2006
  17. Edgar ToernigMay 23, 2006
  18. Jason RiedyMay 23, 2006
  19. Linus TorvaldsMay 23, 2006
  20. Linus TorvaldsMay 23, 2006
  21. Stefan PfetzingMay 26, 2006
  22. Ryan AndersonMay 17, 2006
  23. Junio C HamanoMay 17, 2006
  24. Junio C HamanoMay 17, 2006
  25. builtin-grep: workaround for non GNU grep.Junio C Hamano, May 17, 2006
  26. Linus TorvaldsMay 17, 2006
  27. Junio C HamanoMay 17, 2006
  28. Bertrand JacquinMay 17, 2006
  29. Junio C HamanoMay 17, 2006
  30. Linus TorvaldsMay 17, 2006
  31. Junio C HamanoMay 17, 2006
  32. Linus TorvaldsMay 17, 2006
  33. Junio C HamanoMay 17, 2006
  34. Stefan PfetzingMay 17, 2006
  35. Junio C HamanoMay 17, 2006
  36. Stefan PfetzingMay 17, 2006

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.