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

[PATCH 09/12] Add --pickaxe-all to diff-* brothers.

From
Junio C Hamano <junkio@cox.net>
Date
May 27, 2005, 22:55 UTC
Message-ID
<7vy8a02s9r.fsf_-_@assigned-by-dhcp.cox.net>
In-Reply-To
<7vk6lk5lxt.fsf_-_@assigned-by-dhcp.cox.net>

When --pickaxe-all is given in addition to -S, pickaxe shows the entire diffs contained in the changeset, not just the diffs for the filepair that touched the sought-after string. This is useful to see the changes in context.

Signed-off-by: Junio C Hamano <junkio@cox.net>
---

diff-cache.c | 7 ++++ diff-files.c | 5 ++- diff-helper.c | 7 +++- diff-tree.c | 7 ++++ diff.h | 4 ++ diffcore-pickaxe.c | 77 +++++++++++++++++++++++++++++++++++++++-------------- 6 files changed, 81 insertions(+), 26 deletions(-)

diff --git a/diff-cache.c b/diff-cache.c
--- a/diff-cache.c
+++ b/diff-cache.c
@@ -8,6 +8,7 @@ static int detect_rename = 0;
 static int diff_setup_opt = 0;
 static int diff_score_opt = 0;
 static const char *pickaxe = NULL;
+static int pickaxe_opts = 0;
 
 /* A file entry went away or appeared */
 static void show_file(const char *prefix, struct cache_entry *ce, unsigned char *sha1, unsigned int mode)
@@ -209,6 +210,10 @@ int main(int argc, const char **argv)
 			pickaxe = arg + 2;
 			continue;
 		}
+		if (!strcmp(arg, "--pickaxe-all")) {
+			pickaxe_opts = DIFF_PICKAXE_ALL;
+			continue;
+		}
 		if (!strcmp(arg, "-m")) {
 			match_nonexisting = 1;
 			continue;
@@ -238,7 +243,7 @@ int main(int argc, const char **argv)
 	if (detect_rename)
 		diffcore_rename(detect_rename, diff_score_opt);
 	if (pickaxe)
-		diffcore_pickaxe(pickaxe);
+		diffcore_pickaxe(pickaxe, pickaxe_opts);
 	if (pathspec)
 		diffcore_pathspec(pathspec);
 	diff_flush(diff_output_format, 1);
diff --git a/diff-files.c b/diff-files.c
--- a/diff-files.c
+++ b/diff-files.c
@@ -14,6 +14,7 @@ static int detect_rename = 0;
 static int diff_setup_opt = 0;
 static int diff_score_opt = 0;
 static const char *pickaxe = NULL;
+static int pickaxe_opts = 0;
 static int silent = 0;
 
 static void show_unmerge(const char *path)
@@ -54,6 +55,8 @@ int main(int argc, const char **argv)
 			diff_setup_opt |= DIFF_SETUP_REVERSE;
 		else if (!strcmp(argv[1], "-S"))
 			pickaxe = argv[1] + 2;
+		else if (!strcmp(argv[1], "--pickaxe-all"))
+			pickaxe_opts = DIFF_PICKAXE_ALL;
 		else if (!strncmp(argv[1], "-M", 2)) {
 			diff_score_opt = diff_scoreopt_parse(argv[1]);
 			detect_rename = DIFF_DETECT_RENAME;
@@ -116,7 +119,7 @@ int main(int argc, const char **argv)
 	if (detect_rename)
 		diffcore_rename(detect_rename, diff_score_opt);
 	if (pickaxe)
-		diffcore_pickaxe(pickaxe);
+		diffcore_pickaxe(pickaxe, pickaxe_opts);
 	if (1 < argc)
 		diffcore_pathspec(argv + 1);
 	diff_flush(diff_output_format, 1);
diff --git a/diff-helper.c b/diff-helper.c
--- a/diff-helper.c
+++ b/diff-helper.c
@@ -6,6 +6,7 @@
 #include "diff.h"
 
 static const char *pickaxe = NULL;
+static int pickaxe_opts = 0;
 static int line_termination = '\n';
 static int inter_name_termination = '\t';
 
@@ -23,6 +24,8 @@ int main(int ac, const char **av) {
 		else if (av[1][1] == 'S') {
 			pickaxe = av[1] + 2;
 		}
+		else if (!strcmp(av[1], "--pickaxe-all"))
+			pickaxe_opts = DIFF_PICKAXE_ALL;
 		else
 			usage(diff_helper_usage);
 		ac--; av++;
@@ -127,14 +130,14 @@ int main(int ac, const char **av) {
 			continue;
 		}
 		if (pickaxe)
-			diffcore_pickaxe(pickaxe);
+			diffcore_pickaxe(pickaxe, pickaxe_opts);
 		if (1 < ac)
 			diffcore_pathspec(av + 1);
 		diff_flush(DIFF_FORMAT_PATCH, 0);
 		printf("%s\n", sb.buf);
 	}
 	if (pickaxe)
-		diffcore_pickaxe(pickaxe);
+		diffcore_pickaxe(pickaxe, pickaxe_opts);
 	if (1 < ac)
 		diffcore_pathspec(av + 1);
 	diff_flush(DIFF_FORMAT_PATCH, 0);
diff --git a/diff-tree.c b/diff-tree.c
--- a/diff-tree.c
+++ b/diff-tree.c
@@ -13,6 +13,7 @@ static int detect_rename = 0;
 static int diff_setup_opt = 0;
 static int diff_score_opt = 0;
 static const char *pickaxe = NULL;
+static int pickaxe_opts = 0;
 static const char *header = NULL;
 static const char *header_prefix = "";
 
@@ -263,7 +264,7 @@ static int call_diff_flush(void)
 	if (detect_rename)
 		diffcore_rename(detect_rename, diff_score_opt);
 	if (pickaxe)
-		diffcore_pickaxe(pickaxe);
+		diffcore_pickaxe(pickaxe, pickaxe_opts);
 	if (diff_queue_is_empty()) {
 		diff_flush(DIFF_FORMAT_NO_OUTPUT, 0);
 		return 0;
@@ -509,6 +510,10 @@ int main(int argc, const char **argv)
 			pickaxe = arg + 2;
 			continue;
 		}
+		if (!strcmp(arg, "--pickaxe-all")) {
+			pickaxe_opts = DIFF_PICKAXE_ALL;
+			continue;
+		}
 		if (!strncmp(arg, "-M", 2)) {
 			detect_rename = DIFF_DETECT_RENAME;
 			diff_score_opt = diff_scoreopt_parse(arg);
diff --git a/diff.h b/diff.h
--- a/diff.h
+++ b/diff.h
@@ -36,7 +36,9 @@ extern void diff_setup(int flags);
 
 extern void diffcore_rename(int rename_copy, int minimum_score);
 
-extern void diffcore_pickaxe(const char *needle);
+#define DIFF_PICKAXE_ALL	1
+extern void diffcore_pickaxe(const char *needle, int opts);
+
 extern void diffcore_pathspec(const char **pathspec);
 
 extern int diff_queue_is_empty(void);
diff --git a/diffcore-pickaxe.c b/diffcore-pickaxe.c
--- a/diffcore-pickaxe.c
+++ b/diffcore-pickaxe.c
@@ -21,36 +21,73 @@ static int contains(struct diff_filespec
 	return 0;
 }
 
-void diffcore_pickaxe(const char *needle)
+void diffcore_pickaxe(const char *needle, int opts)
 {
 	struct diff_queue_struct *q = &diff_queued_diff;
 	unsigned long len = strlen(needle);
-	int i;
+	int i, has_changes;
 	struct diff_queue_struct outq;
 	outq.queue = NULL;
 	outq.nr = outq.alloc = 0;
 
-	for (i = 0; i < q->nr; i++) {
-		struct diff_filepair *p = q->queue[i];
-		int onum = outq.nr;
-		if (!DIFF_FILE_VALID(p->one)) {
-			if (!DIFF_FILE_VALID(p->two))
-				continue; /* ignore nonsense */
-			/* created */
-			if (contains(p->two, needle, len))
-				diff_q(&outq, p);
+	if (opts & DIFF_PICKAXE_ALL) {
+		/* Showing the whole changeset if needle exists */
+		for (i = has_changes = 0; !has_changes && i < q->nr; i++) {
+			struct diff_filepair *p = q->queue[i];
+			if (!DIFF_FILE_VALID(p->one)) {
+				if (!DIFF_FILE_VALID(p->two))
+					continue; /* ignore unmerged */
+				/* created */
+				if (contains(p->two, needle, len))
+					has_changes++;
+			}
+			else if (!DIFF_FILE_VALID(p->two)) {
+				if (contains(p->one, needle, len))
+					has_changes++;
+			}
+			else if (!diff_unmodified_pair(p) &&
+				 contains(p->one, needle, len) !=
+				 contains(p->two, needle, len))
+				has_changes++;
 		}
-		else if (!DIFF_FILE_VALID(p->two)) {
-			if (contains(p->one, needle, len))
+		if (has_changes)
+			return; /* not munge the queue */
+
+		/* otherwise we will clear the whole queue
+		 * by copying the empty outq at the end of this
+		 * function, but first clear the current entries
+		 * in the queue.
+		 */
+		for (i = 0; i < q->nr; i++)
+			diff_free_filepair(q->queue[i]);
+	}
+	else 
+		/* Showing only the filepairs that has the needle */
+		for (i = 0; i < q->nr; i++) {
+			struct diff_filepair *p = q->queue[i];
+			has_changes = 0;
+			if (!DIFF_FILE_VALID(p->one)) {
+				if (!DIFF_FILE_VALID(p->two))
+					; /* ignore unmerged */
+				/* created */
+				else if (contains(p->two, needle, len))
+					has_changes = 1;
+			}
+			else if (!DIFF_FILE_VALID(p->two)) {
+				if (contains(p->one, needle, len))
+					has_changes = 1;
+			}
+			else if (!diff_unmodified_pair(p) &&
+				 contains(p->one, needle, len) !=
+				 contains(p->two, needle, len))
+				has_changes = 1;
+
+			if (has_changes)
 				diff_q(&outq, p);
+			else
+				diff_free_filepair(p);
 		}
-		else if (!diff_unmodified_pair(p) &&
-			 contains(p->one, needle, len) !=
-			 contains(p->two, needle, len))
-			diff_q(&outq, p);
-		if (onum == outq.nr)
-			diff_free_filepair(p);
-	}
+
 	free(q->queue);
 	*q = outq;
 	return;
------------------------------------------------
Previous: Junio C HamanoNext: Junio C Hamano
Message 17 of 45 in “Broken directory pathname pruning..”
  1. Linus TorvaldsMay 27, 2005
  2. Junio C HamanoMay 27, 2005
  3. allow pathspec to end with a slashJunio C Hamano, May 27, 2005
  4. allow pathspec to end with a slash (take #2)Junio C Hamano, May 27, 2005
  5. Diff updates, fixing pathspec and rename/copy interaction.Junio C Hamano, May 27, 2005
  6. Linus TorvaldsMay 27, 2005
  7. Junio C HamanoMay 27, 2005
  8. 00/12 Diff updatesJunio C Hamano, May 27, 2005
  9. 01/12 Fix math thinko in similarity estimator.Junio C Hamano, May 27, 2005
  10. 02/12 Introduce diff_free_filepair() funcion.Junio C Hamano, May 27, 2005
  11. 03/12 Make pathspec only care about the detination tree.Junio C Hamano, May 27, 2005
  12. 04/12 Remove unused rank field from diff_core structure.Junio C Hamano, May 27, 2005
  13. 05/12 Do not expose internal scaling to diff-helper.Junio C Hamano, May 27, 2005
  14. 06/12 Remove final newline from the value of xfrm_msg variable.Junio C Hamano, May 27, 2005
  15. 07/12 Clean up diff_setup() to make it more extensible.Junio C Hamano, May 27, 2005
  16. 08/12 Remove a function not used anymore.Junio C Hamano, May 27, 2005
  17. 09/12 Add --pickaxe-all to diff-* brothers.Junio C Hamano, May 27, 2005
  18. 10/12 Fix the way diffcore-rename records unremoved source.Junio C Hamano, May 27, 2005
  19. 11/12 Move pathspec to the beginning of the diffcore chain.Junio C Hamano, May 27, 2005
  20. 12/12 Optimize diff-tree -[CM] --stdinJunio C Hamano, May 27, 2005
  21. Yoichi YuasaJun 4, 2005
  22. Junio C HamanoMay 27, 2005
  23. Do not show empty diff in diff-cache uncached.Junio C Hamano, May 28, 2005
  24. Diff: two fixes.Junio C Hamano, May 28, 2005
  25. diff-helper: fix R/C score parsing under -z flag.Junio C Hamano, May 29, 2005
  26. diff-cache: diff-patch (-p) format fixes.Junio C Hamano, May 29, 2005
  27. diff: code clean-up.Junio C Hamano, May 29, 2005
  28. Linus TorvaldsMay 29, 2005
  29. Junio C HamanoMay 29, 2005
  30. Junio C HamanoMay 29, 2005
  31. 0/3 Leftover bits after 12-seriesJunio C Hamano, May 29, 2005
  32. 1/3 diff-helper: Fix R/C score parsing under -z flag.Junio C Hamano, May 29, 2005
  33. 2/3 diff: consolidate various calls into diffcore.Junio C Hamano, May 29, 2005
  34. 3/3 diff: code clean-up and removal of rename hack.Junio C Hamano, May 29, 2005
  35. 0/4 Junio C Hamano, May 30, 2005
  36. 1/4 diff: further cleanup.Junio C Hamano, May 30, 2005
  37. 2/4 diff: fix the culling of unneeded delete record.Junio C Hamano, May 30, 2005
  38. 3/4 Add -B flag to diff-* brothers.Junio C Hamano, May 30, 2005
  39. 4/4 Add -O<orderfile> option to diff-* brothers.Junio C Hamano, May 30, 2005
  40. Linus TorvaldsMay 30, 2005
  41. Junio C HamanoMay 30, 2005
  42. apply.c: tolerate diff from a dirty but unchanged pathJunio C Hamano, Jun 11, 2005
  43. Linus TorvaldsJun 12, 2005
  44. Linus TorvaldsJun 12, 2005
  45. Junio C HamanoJun 12, 2005

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.