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@xxxxxxxxx> --- 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 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html