Re: Re*: Extremely slow progress during 'git reflog expire --all'
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Apr 7, 2010, 18:43 UTC
- Message-ID
- <7vk4sjcddh.fsf@alter.siamese.dyndns.org>
- In-Reply-To
- <7vochvcdkc.fsf_-_@alter.siamese.dyndns.org>
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