[PATCH v2 10/13] map/print ranges along traversing the history topologically
From: Bo Yang <hidden>
Date: 2016-06-15 22:49:01
Subsystem:
the rest · Maintainer:
Linus Torvalds
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 <redacted> --- 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