From: Michael Haggerty <mhagger@alum.mit.edu>
To: Junio C Hamano <gitster@pobox.com>
Cc: git@vger.kernel.org, Jeff King <peff@peff.net>,
Drew Northup <drew.northup@maine.edu>,
Jakub Narebski <jnareb@gmail.com>,
Heiko Voigt <hvoigt@hvoigt.net>,
Johan Herland <johan@herland.net>,
Julian Phillips <julian@quantumfyre.co.uk>
Subject: Re: [PATCH v2 28/51] refs.c: rename ref_array -> ref_dir
Date: Tue, 13 Dec 2011 06:43:59 +0100 [thread overview]
Message-ID: <4EE6E61F.8080405@alum.mit.edu> (raw)
In-Reply-To: <7v7h21xps9.fsf@alter.siamese.dyndns.org>
[-- Attachment #1: Type: text/plain, Size: 3838 bytes --]
On 12/13/2011 01:45 AM, Junio C Hamano wrote:
> mhagger@alum.mit.edu writes:
>
>> From: Michael Haggerty <mhagger@alum.mit.edu>
>>
>> This purely textual change is in preparation for storing references
>> hierarchically, when the old ref_array structure will represent one
>> "directory" of references. Rename functions that deal with this
>> structure analogously, and also rename the structure's "refs" member
>> to "entries".
>>
>> Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
>> ---
>> refs.c | 166 ++++++++++++++++++++++++++++++++--------------------------------
>> 1 files changed, 83 insertions(+), 83 deletions(-)
>>
>> diff --git a/refs.c b/refs.c
>> index fe6d657..b74ef80 100644
>> --- a/refs.c
>> +++ b/refs.c
>> @@ -106,9 +106,9 @@ struct ref_value {
>> unsigned char peeled[20];
>> };
>>
>> -struct ref_array {
>> +struct ref_dir {
>> int nr, alloc;
>> - struct ref_entry **refs;
>> + struct ref_entry **entries;
>> };
>
> The s/refs/entries/ renaming is a sane thing to do; on the other hand, I
> somehow find the s/ref_array/ref_dir/ renaming is a short-sighted change
> and undesirable, as you are essentially declaring that "if you use this
> structure, the contents you store there are expected to be named
> hierarchically", forbidding users that want to use a simple flat array.
This data structure is not exposed outside of the module, so it only
describes the de facto current storage scheme rather than making any
promises to the outside world.
> BUT. That was an observation before I continued reading the remainder of
> the series.
> I think the above observation primarily come from my worries around the
> extra ref stuff, which by nature does not fit well with the hierarchical
> naming (they do not even have any meaningful names). Sorting or requiring
> uniqueness among them do not make any sense, let alone cutting their names
> in hierarchical boundaries.
>
> As an alternative, it _might_ make sense to get rid of "add_extra_ref()"
> API from refs.c and make it the responsibility for its users to add their
> extra anchor points where they use for_each_ref() to find out all anchor
> points in the history from the refs.c subsystem. If we go that route, I
> fully agree that "s/ref_array/ref_dir/" renaming is the right thing to do,
> as refs.c subsystem will _only_ handle the hierarchical ref namespace and
> nothing else after such a change.
I absolutely agree; the fact that extra refs are part of the refs module
has the foul smell of expedience. And your suggestion for changing the
situation makes sense to me as far as I can follow it. But I don't
think I have the gumption to attack another big part of the code base
before I've even finished the changes that I still have planned for the
refs API.
If somebody else wants to volunteer to make extra_refs redundant, I
would be happy to support that person on the refs side.
Otherwise, I propose to just avoid de-duping extra refs so that my patch
series doesn't make things worse. If it is acceptable, I would prefer
to add the fix as a patch at the end of the series, because after
struct ref_dir: store a reference to the enclosing ref_cache
ref_dir carries around information that can be used to distinguish
between the extra_refs and other ref caches. I think it is as easy as
the attached patch (untested).
Apropos testing, it is unsettling that our test suite doesn't show any
failures after my changes. The dir entries in extra_refs are now always
sorted and de-duped when do_for_each_ref() is called. Could it be that
duplicate ".have" references never come up in the test suite? It sounds
like an important code path is not being tested. In particular, I won't
be able to test whether my fix works :-/
Michael
--
Michael Haggerty
mhagger@alum.mit.edu
http://softwareswirl.blogspot.com/
[-- Attachment #2: fix-dedup.diff --]
[-- Type: text/x-patch, Size: 1358 bytes --]
diff --git a/refs.c b/refs.c
index 2d5c827..2fd3db2 100644
--- a/refs.c
+++ b/refs.c
@@ -457,7 +457,6 @@ static int is_dup_ref(const struct ref_entry *ref1, const struct ref_entry *ref2
*/
static void sort_ref_dir(struct ref_entry *direntry)
{
- int i, j;
struct ref_entry *last = NULL;
struct ref_dir *dir;
assert(direntry->flag & REF_DIR);
@@ -468,19 +467,24 @@ static void sort_ref_dir(struct ref_entry *direntry)
qsort(dir->entries, dir->nr, sizeof(*dir->entries), ref_entry_cmp);
- /* Remove any duplicates: */
- for (i = 0, j = 0; j < dir->nr; j++) {
- struct ref_entry *entry = dir->entries[j];
- if (last && is_dup_ref(last, entry)) {
- free_ref_entry(entry);
- } else if (entry->flag & REF_DIR) {
- dir->entries[i++] = entry;
- last = NULL;
- } else {
- last = dir->entries[i++] = entry;
+ /* Remove any duplicates, but not for extra_refs: */
+ if (dir->ref_cache != NULL) {
+ int i, j;
+ for (i = 0, j = 0; j < dir->nr; j++) {
+ struct ref_entry *entry = dir->entries[j];
+ if (last && is_dup_ref(last, entry)) {
+ free_ref_entry(entry);
+ } else if (entry->flag & REF_DIR) {
+ dir->entries[i++] = entry;
+ last = NULL;
+ } else {
+ last = dir->entries[i++] = entry;
+ }
}
+ dir->nr = i;
}
- dir->sorted = dir->nr = i;
+
+ dir->sorted = dir->nr;
}
#define DO_FOR_EACH_INCLUDE_BROKEN 01
next prev parent reply other threads:[~2011-12-13 5:44 UTC|newest]
Thread overview: 79+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-12-12 5:38 [PATCH v2 00/51] ref-api-C and ref-api-D re-roll mhagger
2011-12-12 5:38 ` [PATCH v2 01/51] struct ref_entry: document name member mhagger
2011-12-12 5:38 ` [PATCH v2 02/51] refs: rename "refname" variables mhagger
2011-12-13 0:37 ` Junio C Hamano
2011-12-12 5:38 ` [PATCH v2 03/51] refs: rename parameters result -> sha1 mhagger
2011-12-12 5:38 ` [PATCH v2 04/51] clear_ref_array(): rename from free_ref_array() mhagger
2011-12-12 5:38 ` [PATCH v2 05/51] is_refname_available(): remove the "quiet" argument mhagger
2011-12-12 5:38 ` [PATCH v2 06/51] parse_ref_line(): add docstring mhagger
2011-12-12 5:38 ` [PATCH v2 07/51] add_ref(): " mhagger
2011-12-12 5:38 ` [PATCH v2 08/51] is_dup_ref(): extract function from sort_ref_array() mhagger
2011-12-12 8:33 ` Jeff King
2011-12-12 11:44 ` Michael Haggerty
2011-12-12 17:14 ` Junio C Hamano
2011-12-12 22:33 ` Junio C Hamano
2011-12-13 4:35 ` Michael Haggerty
2011-12-13 5:00 ` Michael Haggerty
2011-12-12 5:38 ` [PATCH v2 09/51] refs: change signatures of get_packed_refs() and get_loose_refs() mhagger
2011-12-12 5:38 ` [PATCH v2 10/51] get_ref_dir(): change signature mhagger
2011-12-12 5:38 ` [PATCH v2 11/51] resolve_gitlink_ref(): improve docstring mhagger
2011-12-12 5:38 ` [PATCH v2 12/51] Pass a (ref_cache *) to the resolve_gitlink_*() helper functions mhagger
2011-12-12 5:38 ` [PATCH v2 13/51] resolve_gitlink_ref_recursive(): change to work with struct ref_cache mhagger
2011-12-12 5:38 ` [PATCH v2 14/51] repack_without_ref(): remove temporary mhagger
2011-12-12 5:38 ` [PATCH v2 15/51] create_ref_entry(): extract function from add_ref() mhagger
2011-12-12 5:38 ` [PATCH v2 16/51] add_ref(): take a (struct ref_entry *) parameter mhagger
2011-12-12 5:38 ` [PATCH v2 17/51] do_for_each_ref(): correctly terminate while processesing extra_refs mhagger
2011-12-12 22:41 ` Junio C Hamano
2011-12-12 5:38 ` [PATCH v2 18/51] do_for_each_ref_in_array(): new function mhagger
2011-12-12 5:38 ` [PATCH v2 19/51] do_for_each_ref_in_arrays(): " mhagger
2011-12-12 5:38 ` [PATCH v2 20/51] repack_without_ref(): reimplement using do_for_each_ref_in_array() mhagger
2011-12-12 22:44 ` Junio C Hamano
2011-12-12 5:38 ` [PATCH v2 21/51] names_conflict(): new function, extracted from is_refname_available() mhagger
2011-12-12 5:38 ` [PATCH v2 22/51] names_conflict(): simplify implementation mhagger
2011-12-12 5:38 ` [PATCH v2 23/51] is_refname_available(): reimplement using do_for_each_ref_in_array() mhagger
2011-12-12 5:38 ` [PATCH v2 24/51] refs.c: reorder definitions more logically mhagger
2011-12-12 5:38 ` [PATCH v2 25/51] free_ref_entry(): new function mhagger
2011-12-12 5:38 ` [PATCH v2 26/51] check_refname_component(): return 0 for zero-length components mhagger
2011-12-12 5:38 ` [PATCH v2 27/51] struct ref_entry: nest the value part in a union mhagger
2011-12-12 5:38 ` [PATCH v2 28/51] refs.c: rename ref_array -> ref_dir mhagger
2011-12-13 0:45 ` Junio C Hamano
2011-12-13 5:43 ` Michael Haggerty [this message]
2011-12-13 6:37 ` Junio C Hamano
2011-12-13 19:12 ` Michael Haggerty
2011-12-13 19:17 ` Junio C Hamano
2011-12-13 22:13 ` Michael Haggerty
2011-12-13 23:24 ` Junio C Hamano
2011-12-14 0:19 ` Junio C Hamano
2011-12-14 2:33 ` Jeff King
2011-12-15 8:19 ` Michael Haggerty
2011-12-15 8:37 ` Jeff King
2012-01-17 15:07 ` Michael Haggerty
2012-02-10 14:51 ` Michael Haggerty
2012-02-10 20:44 ` Jeff King
2012-02-10 21:17 ` Junio C Hamano
2012-02-11 6:33 ` Michael Haggerty
2011-12-12 5:38 ` [PATCH v2 29/51] refs: store references hierarchically mhagger
2011-12-12 5:38 ` [PATCH v2 30/51] sort_ref_dir(): do not sort if already sorted mhagger
2011-12-12 23:26 ` Junio C Hamano
2011-12-12 5:38 ` [PATCH v2 31/51] refs: sort ref_dirs lazily mhagger
2011-12-12 5:38 ` [PATCH v2 32/51] do_for_each_ref(): only iterate over the subtree that was requested mhagger
2011-12-12 5:38 ` [PATCH v2 33/51] get_ref_dir(): keep track of the current ref_dir mhagger
2011-12-12 5:38 ` [PATCH v2 34/51] refs: wrap top-level ref_dirs in ref_entries mhagger
2011-12-12 5:38 ` [PATCH v2 35/51] get_packed_refs(): return (ref_entry *) instead of (ref_dir *) mhagger
2011-12-12 5:38 ` [PATCH v2 36/51] get_loose_refs(): " mhagger
2011-12-12 5:38 ` [PATCH v2 37/51] is_refname_available(): take " mhagger
2011-12-12 5:38 ` [PATCH v2 38/51] find_ref(): " mhagger
2011-12-12 5:38 ` [PATCH v2 39/51] read_packed_refs(): " mhagger
2011-12-12 5:38 ` [PATCH v2 40/51] add_ref(): " mhagger
2011-12-12 5:38 ` [PATCH v2 41/51] find_containing_direntry(): use " mhagger
2011-12-12 5:38 ` [PATCH v2 42/51] search_ref_dir(): take " mhagger
2011-12-12 5:38 ` [PATCH v2 43/51] add_entry(): " mhagger
2011-12-12 5:38 ` [PATCH v2 44/51] do_for_each_ref_in_dir*(): " mhagger
2011-12-12 5:38 ` [PATCH v2 45/51] sort_ref_dir(): " mhagger
2011-12-12 5:38 ` [PATCH v2 46/51] struct ref_dir: store a reference to the enclosing ref_cache mhagger
2011-12-12 5:38 ` [PATCH v2 47/51] read_loose_refs(): take a (ref_entry *) as argument mhagger
2011-12-12 5:38 ` [PATCH v2 48/51] refs: read loose references lazily mhagger
2011-12-12 5:38 ` [PATCH v2 49/51] is_refname_available(): query only possibly-conflicting references mhagger
2011-12-12 5:38 ` [PATCH v2 50/51] read_packed_refs(): keep track of the directory being worked in mhagger
2011-12-12 5:38 ` [PATCH v2 51/51] repack_without_ref(): call clear_packed_ref_cache() mhagger
2011-12-12 8:24 ` [PATCH v2 00/51] ref-api-C and ref-api-D re-roll Junio C Hamano
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=4EE6E61F.8080405@alum.mit.edu \
--to=mhagger@alum.mit.edu \
--cc=drew.northup@maine.edu \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=hvoigt@hvoigt.net \
--cc=jnareb@gmail.com \
--cc=johan@herland.net \
--cc=julian@quantumfyre.co.uk \
--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).