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

[PATCH] grep: do not skip unmerged entries when grepping in the working tree.

From
Junio C Hamano <junkio@cox.net>
Date
Nov 26, 2006, 20:49 UTC
Message-ID
<7vvel2rl05.fsf@assigned-by-dhcp.cox.net>
In-Reply-To
<ekc9q7$36e$1@sea.gmane.org>

We used to skip unmerged entries, which made sense for grepping in the cached copies, but not for grepping in the files on the working tree.

Noticed by Johannes Sixt.
Signed-off-by: Junio C Hamano <junkio@cox.net>
---
  Johannes Sixt <johannes.sixt@telecom.at> writes:
  > $ git-grep getSibling -- kdbg/exprwnd.h    # this file had a conflict
  > $ grep getSibling -- kdbg/exprwnd.h       
  >     { return static_cast<VarTree*>(getSibling()); }
  > $ git-update-index kdbg/exprwnd.h
  > $ git-grep getSibling -- kdbg/exprwnd.h       
  > kdbg/exprwnd.h:    { return static_cast<VarTree*>(getSibling()); }
  This is because unmerged entries were ignored.
 builtin-grep.c |   25 +++++++++++++++++++++----
 1 files changed, 21 insertions(+), 4 deletions(-)
diff --git a/builtin-grep.c b/builtin-grep.c
index ad7dc00..9873e3d 100644
--- a/builtin-grep.c
+++ b/builtin-grep.c
@@ -268,7 +268,7 @@ static int external_grep(struct grep_opt *opt, const char **paths, int cached)
 	for (i = 0; i < active_nr; i++) {
 		struct cache_entry *ce = active_cache[i];
 		char *name;
-		if (ce_stage(ce) || !S_ISREG(ntohl(ce->ce_mode)))
+		if (!S_ISREG(ntohl(ce->ce_mode)))
 			continue;
 		if (!pathspec_matches(paths, ce->name))
 			continue;
@@ -280,12 +280,19 @@ static int external_grep(struct grep_opt *opt, const char **paths, int cached)
 			memcpy(name + 2, ce->name, len + 1);
 		}
 		argv[argc++] = name;
-		if (argc < MAXARGS)
+		if (argc < MAXARGS && !ce_stage(ce))
 			continue;
 		status = exec_grep(argc, argv);
 		if (0 < status)
 			hit = 1;
 		argc = nr;
+		if (ce_stage(ce)) {
+			do {
+				i++;
+			} while (i < active_nr &&
+				 !strcmp(ce->name, active_cache[i]->name));
+			i--; /* compensate for loop control */
+		}
 	}
 	if (argc > nr) {
 		status = exec_grep(argc, argv);
@@ -316,14 +323,24 @@ static int grep_cache(struct grep_opt *opt, const char **paths, int cached)
 
 	for (nr = 0; nr < active_nr; nr++) {
 		struct cache_entry *ce = active_cache[nr];
-		if (ce_stage(ce) || !S_ISREG(ntohl(ce->ce_mode)))
+		if (!S_ISREG(ntohl(ce->ce_mode)))
 			continue;
 		if (!pathspec_matches(paths, ce->name))
 			continue;
-		if (cached)
+		if (cached) {
+			if (ce_stage(ce))
+				continue;
 			hit |= grep_sha1(opt, ce->sha1, ce->name, 0);
+		}
 		else
 			hit |= grep_file(opt, ce->name);
+		if (ce_stage(ce)) {
+			do {
+				nr++;
+			} while (nr < active_nr &&
+				 !strcmp(ce->name, active_cache[nr]->name));
+			nr--; /* compensate for loop control */
+		}
 	}
 	free_grep_patterns(opt);
 	return hit;
-- 
1.4.4.1.ge3fb
Previous: Johannes SixtNext: Johannes Sixt
Message 2 of 3 in “git-grep misses an instance of a string (after conflict)”
  1. Johannes SixtNov 26, 2006
  2. grep: do not skip unmerged entries when grepping in the working tree.Junio C Hamano, Nov 26, 2006
  3. Johannes SixtNov 26, 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.