All of lore.kernel.org
 help / color / mirror / Atom feed
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/

  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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.