From: Michael Haggerty <mhagger@alum.mit.edu>
To: Junio C Hamano <gitster@pobox.com>
Cc: git@vger.kernel.org, Jeff King <peff@peff.net>,
Jakub Narebski <jnareb@gmail.com>,
Heiko Voigt <hvoigt@hvoigt.net>,
Johan Herland <johan@herland.net>
Subject: Re: [PATCH 29/30] create_dir_entry(): allow the flag value to be passed as an argument
Date: Thu, 26 Apr 2012 23:12:22 +0200 [thread overview]
Message-ID: <4F99BA36.5070803@alum.mit.edu> (raw)
In-Reply-To: <xmqq62cnd4pv.fsf@junio.mtv.corp.google.com>
On 04/25/2012 08:52 PM, Junio C Hamano wrote:
> Junio C Hamano<gitster@pobox.com> writes:
>
>> mhagger@alum.mit.edu writes:
>>
>>> diff --git a/refs.c b/refs.c
>>> index 4eca965..869c9a7 100644
>>> --- a/refs.c
>>> +++ b/refs.c
>>> @@ -231,18 +231,18 @@ static void clear_ref_dir(struct ref_dir *dir)
>>> }
>>>
>>> /*
>>> + * Create a struct ref_entry object for the specified dirname and flag.
>>> * dirname is the name of the directory with a trailing slash (e.g.,
>>> * "refs/heads/") or "" for the top-level directory.
>>> */
>>> static struct ref_entry *create_dir_entry(struct ref_cache *ref_cache,
>>> - const char *dirname)
>>> + const char *dirname, int flag)
>>> {
>>> struct ref_entry *direntry;
>>> int len = strlen(dirname);
>>> direntry = xcalloc(1, sizeof(struct ref_entry) + len + 1);
>>> memcpy(direntry->name, dirname, len + 1);
>>> - direntry->flag = REF_DIR;
>>> + direntry->flag = flag;
>>> direntry->u.subdir.ref_cache = ref_cache;
>>
>> As the returned structure will always represent a subdirectory and not a
>> leaf node, i.e. you use u.subdir, I do not think it makes any sense to
>> make it responsibility for the caller of this function to include
>> REF_DIR in the value of the flag.
>
> Forseeing a response "But but but REF_DIR will become OR of two
> variants", my complaint is still valid ;-) and it is the bit assignment
> you did in the final patch that is wrong. If you make REF_DIR (or not)
> to differenticate between ref_dir vs ref_value, and use another bit
> REF_INCOMPLETE to remember that you still need to find out the actual
> value of it, the the above can still be
In an earlier design, there were three types of REF_DIR: packed,
loose(read), and loose(unread), which could all be packed (along with
dir/non-dir) into two bits. The current bit assignment was left over
from that design, plus a latent expectation that it would sometime be
necessary to distinguish between packed and loose(read) references.
But so far I haven't found a reason to distinguish between packed and
loose(read), so your suggested bit assignment is simpler. I will
include it in the next version of the patch series.
> The suggested bit assignment would also allow you to create ref_value
> leaf nodes, whose presence you know about (by iterating over readdir()
> results) but not their values yet (because you haven't opened and read
> them), by marking them with REF_INCOMPLETE to be extra lazy in the
> future, if necessary. I do not know if that much laziness buys us a
> lot, though ;-).
This would be pretty easy to implement. Maybe I'll try it someday.
Michael
--
Michael Haggerty
mhagger@alum.mit.edu
http://softwareswirl.blogspot.com/
next prev parent reply other threads:[~2012-04-26 21:12 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-04-24 22:45 [PATCH 00/30] Read loose references lazily mhagger
2012-04-24 22:45 ` [PATCH 01/30] get_ref_dir(): return early if directory cannot be read mhagger
2012-04-24 22:45 ` [PATCH 02/30] get_ref_dir(): use a strbuf to hold refname mhagger
2012-04-24 22:45 ` [PATCH 03/30] get_ref_dir(): rename "base" parameter to "dirname" mhagger
2012-04-24 22:45 ` [PATCH 04/30] get_ref_dir(): require that the dirname argument ends in '/' mhagger
2012-04-24 22:45 ` [PATCH 05/30] refs.c: extract function search_for_subdir() mhagger
2012-04-24 22:45 ` [PATCH 06/30] get_ref_dir(): take the containing directory as argument mhagger
2012-04-24 22:45 ` [PATCH 07/30] do_for_each_reflog(): return early on error mhagger
2012-04-24 22:45 ` [PATCH 08/30] do_for_each_reflog(): use a strbuf to hold logfile name mhagger
2012-04-24 22:45 ` [PATCH 09/30] do_for_each_reflog(): reuse strbuf across recursive function calls mhagger
2012-04-24 22:45 ` [PATCH 10/30] refs: wrap top-level ref_dirs in ref_entries mhagger
2012-04-26 14:38 ` Michael Haggerty
2012-04-24 22:45 ` [PATCH 11/30] get_packed_refs(): return (ref_entry *) instead of (ref_dir *) mhagger
2012-04-24 22:45 ` [PATCH 12/30] get_loose_refs(): " mhagger
2012-04-24 22:45 ` [PATCH 13/30] is_refname_available(): take " mhagger
2012-04-24 22:45 ` [PATCH 14/30] find_ref(): " mhagger
2012-04-24 22:45 ` [PATCH 15/30] read_packed_refs(): " mhagger
2012-04-24 22:45 ` [PATCH 16/30] add_ref(): " mhagger
2012-04-24 22:45 ` [PATCH 17/30] find_containing_direntry(): use " mhagger
2012-04-24 22:45 ` [PATCH 18/30] get_ref_dir(): take " mhagger
2012-04-24 22:45 ` [PATCH 19/30] get_ref_dir(): remove dirname argument mhagger
2012-04-24 22:45 ` [PATCH 20/30] search_for_subdir(): take (ref_entry *) instead of (ref_dir *) mhagger
2012-04-24 22:45 ` [PATCH 21/30] search_ref_dir(): " mhagger
2012-04-24 22:45 ` [PATCH 22/30] add_entry(): " mhagger
2012-04-24 22:45 ` [PATCH 23/30] do_for_each_ref_in_dirs(): " mhagger
2012-04-24 22:45 ` [PATCH 24/30] do_for_each_ref_in_dir(): " mhagger
2012-04-24 22:45 ` [PATCH 25/30] sort_ref_dir(): " mhagger
2012-04-24 22:45 ` [PATCH 26/30] struct ref_dir: store a reference to the enclosing ref_cache mhagger
2012-04-24 22:45 ` [PATCH 27/30] read_loose_refs(): rename function from get_ref_dir() mhagger
2012-04-24 22:45 ` [PATCH 28/30] read_loose_refs(): access ref_cache via the ref_dir field mhagger
2012-04-24 22:45 ` [PATCH 29/30] create_dir_entry(): allow the flag value to be passed as an argument mhagger
2012-04-25 18:31 ` Junio C Hamano
2012-04-25 18:52 ` Junio C Hamano
2012-04-26 21:12 ` Michael Haggerty [this message]
2012-04-24 22:45 ` [PATCH 30/30] refs: read loose references lazily mhagger
2012-04-25 18:39 ` [PATCH 00/30] Read " Junio C Hamano
2012-04-26 21:33 ` Michael Haggerty
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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4F99BA36.5070803@alum.mit.edu \
--to=mhagger@alum.mit.edu \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=hvoigt@hvoigt.net \
--cc=jnareb@gmail.com \
--cc=johan@herland.net \
--cc=peff@peff.net \
/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.
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 NNTP newsgroup(s).