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

[PATCH v2 10/13] map/print ranges along traversing the history topologically

From
Bo Yang <struggleyb.nku@gmail.com>
Date
Jun 30, 2010, 15:25 UTC
Message-ID
<1277911526-12105-10-git-send-email-struggleyb.nku@gmail.com>
In-Reply-To
<1277911526-12105-1-git-send-email-struggleyb.nku@gmail.com>

Since ranges may change in different branches, we should make sure we do not pass range to parent until all the ranges get 'combined' at the commit which is a split commit. So, topological traversing is necessary.

Signed-off-by: Bo Yang <struggleyb.nku@gmail.com>
---
 builtin/log.c |    5 ++++-
 line.c        |   52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 line.h        |    2 ++
 3 files changed, 58 insertions(+), 1 deletions(-)
diff --git a/builtin/log.c b/builtin/log.c
index d0faf07..f14d54a 100644
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -612,7 +612,10 @@ int cmd_log(int argc, const char **argv, const char *prefix)
 	memset(&opt, 0, sizeof(opt));
 	opt.def = "HEAD";
 	cmd_log_init(argc, argv, prefix, &rev, &opt);
-	return cmd_log_walk(&rev);
+	if (rev.line)
+		return cmd_line_log_walk(&rev);
+	else
+		return cmd_log_walk(&rev);
 }
 
 /* format-patch */
diff --git a/line.c b/line.c
index 973eff5..faaa25a 100644
--- a/line.c
+++ b/line.c
@@ -1190,3 +1190,55 @@ static void line_log_flush(struct rev_info *rev, struct commit *c)
 	}
 }
 
+int cmd_line_log_walk(struct rev_info *rev)
+{
+	struct commit *commit;
+	struct commit_list *list = NULL;
+	struct diff_line_range *r = NULL;
+
+	if (prepare_revision_walk(rev))
+		die("revision walk prepare failed");
+
+	list = rev->commits;
+	if (list) {
+		list->item->object.flags |= RANGE_UPDATE;
+		list = list->next;
+	}
+	/* Clear the flags */
+	while (list) {
+		list->item->object.flags &= 0x0;
+		list = list->next;
+	}
+
+	list = rev->commits;
+	while (list) {
+		commit = list->item;
+
+		if (commit->object.flags & RANGE_UPDATE) {
+			assign_parents_range(rev, commit);
+		}
+
+		if (commit->object.flags & NEED_PRINT) {
+			line_log_flush(rev, commit);
+		}
+
+		r = lookup_line_range(rev, commit);
+		if (r) {
+			cleanup(r);
+			r = NULL;
+			add_line_range(rev, commit, r);
+		}
+
+		r = lookup_decoration(&rev->nontrivial_merge, &commit->object);
+		if (r) {
+			cleanup(r);
+			r = NULL;
+			add_decoration(&rev->nontrivial_merge, &commit->object, r);
+		}
+
+		list = list->next;
+	}
+
+	return 0;
+}
+
diff --git a/line.h b/line.h
index 885e985..b293894 100644
--- a/line.h
+++ b/line.h
@@ -128,4 +128,6 @@ extern struct diff_line_range *lookup_line_range(struct rev_info *revs, struct c
 const char *parse_loc(const char *spec, nth_line_fn_t nth_line,
 		void *data, long lines, long begin, long *ret);
 
+extern int cmd_line_log_walk(struct rev_info *rev);
+
 #endif
-- 
1.7.0.2.273.gc2413.dirty
Previous: Bo YangNext: Bo Yang
Message 12 of 16 in “parse-options: stop when encounter a non-option”
  1. 01/13 parse-options: stop when encounter a non-optionBo Yang, Jun 30, 2010
  2. 02/13 parse-options: add two helper functionsBo Yang, Jun 30, 2010
  3. 03/13 add the basic data structure for line level historyBo Yang, Jun 30, 2010
  4. Junio C HamanoJul 6, 2010
  5. Bo YangJul 6, 2010
  6. 04/13 refactor parse_locBo Yang, Jun 30, 2010
  7. 05/13 parse the -L optionsBo Yang, Jun 30, 2010
  8. 06/13 export three functions from diff.cBo Yang, Jun 30, 2010
  9. 07/13 add range clone functionsBo Yang, Jun 30, 2010
  10. 08/13 map/take range to parentBo Yang, Jun 30, 2010
  11. 09/13 print the line logBo Yang, Jun 30, 2010
  12. 10/13 map/print ranges along traversing the history topologicallyBo Yang, Jun 30, 2010
  13. 11/13 add --always-print optionBo Yang, Jun 30, 2010
  14. 12/13 add two test casesBo Yang, Jun 30, 2010
  15. 13/13 some document updateBo Yang, Jun 30, 2010
  16. Junio C HamanoJul 6, 2010

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.