On Thu, Jun 22, 2017 at 06:25:46PM -0400, Jeff King wrote: > So here's a patch on top of what I posted before that pushes the reflog > check into the loop (it just decides whether to pull from the reflogs or > from the commit queue at the top of the loop). > > I was surprised to find, though, that simplify_commit() does not > actually do the pathspec limiting! It's done by > try_to_simplify_commit(), which is part of add_parents_to_list(). I > hacked around it in the later part of the loop by calling > try_to_simplify myself and checking the TREESAME flag. But I have a > feeling I'm missing something about how the traversal is supposed to > work. > > This does behave sensibly with "--no-merges" and "--merges", as well as > pathspec limiting. And here's one more patch on top of those that's necessary to get the tests to pass (I don't expect anybody to necessarily be applying this slow string of patches; it's just to show the direction I'm looking in). --- builtin/log.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/builtin/log.c b/builtin/log.c index 998437b23..512538479 100644 --- a/builtin/log.c +++ b/builtin/log.c @@ -373,9 +373,9 @@ static int cmd_log_walk(struct rev_info *rev) if (!rev->reflog_info) { /* we allow cycles in reflog ancestry */ free_commit_buffer(commit); + free_commit_list(commit->parents); + commit->parents = NULL; } - free_commit_list(commit->parents); - commit->parents = NULL; if (saved_nrl < rev->diffopt.needed_rename_limit) saved_nrl = rev->diffopt.needed_rename_limit; if (rev->diffopt.degraded_cc_to_c)