Side note. It may be an improvement to dig the history even more incrementally. Inside unreachable(), we currently dig immediately down to root, but it may give us a better performance in a long history with reflog entries that wildly jump everywhere in that history if we dug down to the timestamp of the commit we are looking at. A patch to do so on top of the previous one may look like this. builtin-reflog.c | 17 ++++++++++------- 1 files changed, 10 insertions(+), 7 deletions(-) diff --git a/builtin-reflog.c b/builtin-reflog.c index 9792090..42d225f 100644 --- a/builtin-reflog.c +++ b/builtin-reflog.c @@ -274,16 +274,19 @@ static int unreachable(struct expire_reflog_cb *cb, struct commit *commit, unsig return 0; } - /* Reachable from the current ref? Don't prune. */ - if (commit->object.flags & REACHABLE) - return 0; + while (1) { + /* Reachable from the current ref? Don't prune. */ + if (commit->object.flags & REACHABLE) + return 0; - if (cb->mark_list && cb->mark_limit) { - cb->mark_limit = 0; /* dig down to the root */ + /* Did we mark everything? Then we know we cannot reach it. */ + if (!cb->mark_list || !cb->mark_limit) + return 1; + + /* Dig down to the timestamp of this commit, or down to root. */ + cb->mark_limit = (cb->mark_limit < commit->date) ? 0 : commit->date; mark_reachable(cb); } - - return !(commit->object.flags & REACHABLE); } static int expire_reflog_ent(unsigned char *osha1, unsigned char *nsha1, -- 1.7.1.rc0.212.gbd88f -- 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