git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Michael Haggerty <mhagger@alum.mit.edu>
To: Duy Nguyen <pclouds@gmail.com>
Cc: "Junio C Hamano" <gitster@pobox.com>, "Jeff King" <peff@peff.net>,
	"Ævar Arnfjörð Bjarmason" <avarab@gmail.com>,
	"Stefan Beller" <sbeller@google.com>,
	"David Turner" <novalis@novalis.org>,
	"Git Mailing List" <git@vger.kernel.org>
Subject: Re: [PATCH v2 03/20] refs_ref_iterator_begin(): new function
Date: Sun, 16 Apr 2017 06:39:04 +0200	[thread overview]
Message-ID: <3b508517-80fc-d759-d27f-a582a36286ba@alum.mit.edu> (raw)
In-Reply-To: <CACsJy8CECcC1EDpr8u39Pzq75E5KXrYwm_Bz+UTXobWvgV5weA@mail.gmail.com>

On 04/07/2017 12:57 PM, Duy Nguyen wrote:
> On Fri, Mar 31, 2017 at 9:11 PM, Michael Haggerty <mhagger@alum.mit.edu> wrote:
>> Extract a new function from `do_for_each_ref()`. It will be useful
>> elsewhere.
>>
>> Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
>> ---
>>  refs.c               | 15 +++++++++++++--
>>  refs/refs-internal.h | 11 +++++++++++
>>  2 files changed, 24 insertions(+), 2 deletions(-)
>>
>> diff --git a/refs.c b/refs.c
>> index 0ed6c3c7a4..aeb704ab92 100644
>> --- a/refs.c
>> +++ b/refs.c
>> @@ -1230,6 +1230,18 @@ int head_ref(each_ref_fn fn, void *cb_data)
>>         return head_ref_submodule(NULL, fn, cb_data);
>>  }
>>
>> +struct ref_iterator *refs_ref_iterator_begin(
>> +               struct ref_store *refs,
>> +               const char *prefix, int trim, int flags)
>> +{
>> +       struct ref_iterator *iter;
>> +
>> +       iter = refs->be->iterator_begin(refs, prefix, flags);
>> +       iter = prefix_ref_iterator_begin(iter, prefix, trim);
> 
> Off topic. This code made me wonder if we really need the prefix
> iterator if prefix is NULL. And in fact we don't since
> prefix_ref_iterator_begin() will return the old iter in that case. But
> it's probably better to move that optimization outside. I think it's
> easier to understand that way, calling prefix_ref_ will always give
> you a new iterator. Don't call it unless you want to have it.

I like this aspect of the design because it is more powerful. Consider
for example that some reference backend might (e.g., a future
`packed_ref_store`) need to use a `prefix_ref_iterator` to implement
`iterator_begin()`, while another (e.g., one based on `ref_cache`) might
not. It would be easy to make `prefix_ref_iterator_begin()` check
whether its argument is already a `prefix_ref_iterator`, and if so, swap
it out with a new one with different arguments (to avoid having to stack
them up). It would be inappropriate for the caller to make such an
optimization, because it (a) shouldn't have to care what type of
reference iterator it is dealing with, and (b) shouldn't have to know
enough about `prefix_ref_iterator`s to know that the optimization makes
sense.

>> +/*
>> + * Return an iterator that goes over each reference in `refs` for
>> + * which the refname begins with prefix. If trim is non-zero, then
>> + * trim that many characters off the beginning of each refname. flags
>> + * can be DO_FOR_EACH_INCLUDE_BROKEN to include broken references in
>> + * the iteration.
>> + */
> 
> Do we need a separate docstring here? I think we document more or less
> the same for ref_iterator_begin_fn (except the include-broken flag).

There is a subtle difference: currently, `ref_iterator_begin_fn()`
doesn't use its full `prefix` argument as prefix, but rather
`find_containing_dir(prefix)`. (This is basically an implementation
detail of `ref_cache` leaking out into the virtual function interface.)

`refs_ref_iterator_begin()`, on the other hand, treats the prefix
literally, using `starts_with()`.

I don't like this design and plan to improve it sometime, but for now
that's an important difference. The fix, incidentally, would motivate
the `prefix_ref_iterator_begin()` optimization mentioned above.

Michael


  reply	other threads:[~2017-04-16  4:39 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-03-31 14:10 [PATCH v2 00/20] Separate `ref_cache` into a separate module Michael Haggerty
2017-03-31 14:10 ` [PATCH v2 01/20] get_ref_dir(): don't call read_loose_refs() for "refs/bisect" Michael Haggerty
2017-03-31 17:18   ` Stefan Beller
2017-03-31 14:11 ` [PATCH v2 02/20] refs_read_raw_ref(): new function Michael Haggerty
2017-03-31 14:11 ` [PATCH v2 03/20] refs_ref_iterator_begin(): " Michael Haggerty
2017-04-07 10:57   ` Duy Nguyen
2017-04-16  4:39     ` Michael Haggerty [this message]
2017-03-31 14:11 ` [PATCH v2 04/20] refs_verify_refname_available(): implement once for all backends Michael Haggerty
2017-04-07 11:20   ` Duy Nguyen
2017-04-16  4:44     ` Michael Haggerty
2017-03-31 14:11 ` [PATCH v2 05/20] refs_verify_refname_available(): use function in more places Michael Haggerty
2017-03-31 14:11 ` [PATCH v2 06/20] ref-cache: rename `add_ref()` to `add_ref_entry()` Michael Haggerty
2017-03-31 14:11 ` [PATCH v2 07/20] ref-cache: rename `find_ref()` to `find_ref_entry()` Michael Haggerty
2017-03-31 14:11 ` [PATCH v2 08/20] ref-cache: rename `remove_entry()` to `remove_entry_from_dir()` Michael Haggerty
2017-03-31 14:11 ` [PATCH v2 09/20] refs: split `ref_cache` code into separate files Michael Haggerty
2017-03-31 14:11 ` [PATCH v2 10/20] ref-cache: introduce a new type, ref_cache Michael Haggerty
2017-04-07 11:32   ` Duy Nguyen
2017-04-16  4:52     ` Michael Haggerty
2017-03-31 14:11 ` [PATCH v2 11/20] refs: record the ref_store in ref_cache, not ref_dir Michael Haggerty
2017-04-07 11:38   ` Duy Nguyen
2017-04-16  5:49     ` Michael Haggerty
2017-03-31 14:11 ` [PATCH v2 12/20] ref-cache: use a callback function to fill the cache Michael Haggerty
2017-03-31 14:11 ` [PATCH v2 13/20] refs: handle "refs/bisect/" in `loose_fill_ref_dir()` Michael Haggerty
2017-03-31 14:11 ` [PATCH v2 14/20] do_for_each_entry_in_dir(): eliminate `offset` argument Michael Haggerty
2017-03-31 14:11 ` [PATCH v2 15/20] get_loose_ref_dir(): function renamed from get_loose_refs() Michael Haggerty
2017-03-31 14:11 ` [PATCH v2 16/20] get_loose_ref_cache(): new function Michael Haggerty
2017-03-31 14:11 ` [PATCH v2 17/20] cache_ref_iterator_begin(): make function smarter Michael Haggerty
2017-03-31 14:11 ` [PATCH v2 18/20] commit_packed_refs(): use reference iteration Michael Haggerty
2017-03-31 14:11 ` [PATCH v2 19/20] files_pack_refs(): " Michael Haggerty
2017-04-07 11:51   ` Duy Nguyen
2017-04-16  6:13     ` Michael Haggerty
2017-03-31 14:11 ` [PATCH v2 20/20] do_for_each_entry_in_dir(): delete function Michael Haggerty
2017-03-31 16:01 ` [PATCH v2 00/20] Separate `ref_cache` into a separate module Junio C Hamano
2017-04-01  5:16   ` Michael Haggerty
2017-04-05 14:03     ` Duy Nguyen
2017-04-07 11:53       ` Duy Nguyen
2017-04-16  6:15         ` Michael Haggerty
2017-04-01 21:26   ` Ramsay Jones
2017-04-02  3:38     ` Junio C Hamano
2017-04-02 14:48       ` Ramsay Jones
2017-04-02 16:44         ` Junio C Hamano
2017-04-01  6:20 ` Jeff King

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=3b508517-80fc-d759-d27f-a582a36286ba@alum.mit.edu \
    --to=mhagger@alum.mit.edu \
    --cc=avarab@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=novalis@novalis.org \
    --cc=pclouds@gmail.com \
    --cc=peff@peff.net \
    --cc=sbeller@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).