reflog: add for_each_reflog_ent_reverse() API
commit98f85ff4b65b565bae0592ded494d67045cbd3bf
authorJunio C Hamano <gitster@pobox.com>
Fri, 8 Mar 2013 21:27:37 +0000 (8 13:27 -0800)
committerJunio C Hamano <gitster@pobox.com>
Fri, 8 Mar 2013 22:00:22 +0000 (8 14:00 -0800)
tree658d3cbcd537658fbe60e59e6054fa0a5ceea8df
parent7ae07c1bd7bdab0bf0b36190c94e761cc593a890
reflog: add for_each_reflog_ent_reverse() API

"git checkout -" is a short-hand for "git checkout @{-1}" and the
"@{nth}" notation for a negative number is to find nth previous
checkout in the reflog of the HEAD to determine the name of the
branch the user was on.  We would want to find the nth most recent
reflog entry that matches "checkout: moving from X to Y" for this.

Unfortunately, reflog is implemented as an append-only file, and the
API to iterate over its entries, for_each_reflog_ent(), reads the
file in order, giving the entries from the oldest to newer.  For the
purpose of finding nth most recent one, this API forces us to record
the last n entries in a rotating buffer and give the result out only
after we read everything.  To optimize for a common case of finding
the nth most recent one for a small value of n, we also have a side
API for_each_recent_reflog_ent() that starts reading near the end of
the file, but it still has to read the entries in the "wrong" order.
The implementation of understanding @{-1} uses this interface.

This all becomes unnecessary if we add an API to let us iterate over
reflog entries in the reverse order, from the newest to older.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
refs.c
refs.h
sha1_name.c