Re: [PATCH 3/6] refs/files: sort reflogs returned by the reflog iterator
- From
Patrick Steinhardt <ps@pks.im>
- Date
- Feb 20, 2024, 08:34 UTC
- Message-ID
- <ZdRkLylHKj44tstQ@tanuki>
- In-Reply-To
- <xmqq34to0znj.fsf@gitster.g>
On Mon, Feb 19, 2024 at 04:04:16PM -0800, Junio C Hamano wrote:
Show 47 quoted lines
> Patrick Steinhardt <ps@pks.im> writes:
>
> > We use a directory iterator to return reflogs via the reflog iterator.
> > This iterator returns entries in the same order as readdir(3P) would and
> > will thus yield reflogs with no discernible order.
> >
> > Set the new `DIR_ITERATOR_SORTED` flag that was introduced in the
> > preceding commit so that the order is deterministic. While the effect of
> > this can only been observed in a test tool, a subsequent commit will
> > start to expose this functionality to users via a new `git reflog list`
> > subcommand.
> >
> > Signed-off-by: Patrick Steinhardt <ps@pks.im>
> > ---
> > refs/files-backend.c | 4 ++--
> > t/t0600-reffiles-backend.sh | 4 ++--
> > t/t1405-main-ref-store.sh | 2 +-
> > t/t1406-submodule-ref-store.sh | 2 +-
> > 4 files changed, 6 insertions(+), 6 deletions(-)
> >
> > diff --git a/refs/files-backend.c b/refs/files-backend.c
> > index 75dcc21ecb..2ffc63185f 100644
> > --- a/refs/files-backend.c
> > +++ b/refs/files-backend.c
> > @@ -2193,7 +2193,7 @@ static struct ref_iterator *reflog_iterator_begin(struct ref_store *ref_store,
> >
> > strbuf_addf(&sb, "%s/logs", gitdir);
> >
> > - diter = dir_iterator_begin(sb.buf, 0);
> > + diter = dir_iterator_begin(sb.buf, DIR_ITERATOR_SORTED);
> > if (!diter) {
> > strbuf_release(&sb);
> > return empty_ref_iterator_begin();
> > @@ -2202,7 +2202,7 @@ static struct ref_iterator *reflog_iterator_begin(struct ref_store *ref_store,
> > CALLOC_ARRAY(iter, 1);
> > ref_iterator = &iter->base;
> >
> > - base_ref_iterator_init(ref_iterator, &files_reflog_iterator_vtable, 0);
> > + base_ref_iterator_init(ref_iterator, &files_reflog_iterator_vtable, 1);
>
> This caught my attention. Once we apply this patch, the only way
> base_ref_iterator_init() can receive 0 for its last parameter
> (i.e. 'ordered') is via the merge_ref_iterator_begin() call in
> files_reflog_iterator_begin() that passes 0 as 'ordered'. If we
> force files_reflog_iterator_begin() to ask for an ordered
> merge_ref_iterator, then we will have no unordered ref iterators.
> Am I reading the code right?Ah, true indeed. The "files" reflog iterator was the only remaining iterator that wasn't ordered. I'll include an additional patch on top that drops the `ordered` bit altogether.
Patrick