From: 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>,
Michael Haggerty <mhagger@alum.mit.edu>
Subject: [PATCH 4/6] Store extra_refs in a separate data structure
Date: Tue, 13 Dec 2011 21:06:49 +0100 [thread overview]
Message-ID: <1323806811-5798-5-git-send-email-mhagger@alum.mit.edu> (raw)
In-Reply-To: <1323806811-5798-1-git-send-email-mhagger@alum.mit.edu>
From: Michael Haggerty <mhagger@alum.mit.edu>
Extra references really don't have much to do with real references,
and we want to change how real references are handled. So hold extra
references in a separate data structure.
Since extra references cannot be broken, don't store flags with them
and don't pass the flags argument (a different "flags"!) to
do_for_each_extra_ref().
Finally, current_ref is not useful while iterating through the
extra_refs. In fact, peel_ref() doesn't even work for extra refs
because they cannot be peeled themselves, and moreover they might
coincidentally have the same name as a "real" reference. So
explicitly set current_ref to NULL while iterating over extra_refs to
avoid confusion.
Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
---
Strictly speaking, this patch changes how an extra reference with an
invalid SHA1 would be treated. In the old code, it would be skipped
over (assuming DO_FOR_EACH_INCLUDE_BROKEN is not set). In the new
code the SHA1 is not checked. However, from my understanding of how
extra_refs are used, they should never have invalid SHA1s and so the
old test is superfluous.
refs.c | 38 ++++++++++++++++++++++++++++----------
1 files changed, 28 insertions(+), 10 deletions(-)
diff --git a/refs.c b/refs.c
index 268bda9..843c530 100644
--- a/refs.c
+++ b/refs.c
@@ -146,7 +146,11 @@ static struct ref_cache {
static struct ref_entry *current_ref;
-static struct ref_array extra_refs;
+static struct extra_ref {
+ struct extra_ref *next;
+ unsigned char sha1[20];
+ char name[FLEX_ARRAY];
+} *extra_refs;
static void free_ref_array(struct ref_array *array)
{
@@ -250,12 +254,21 @@ static void read_packed_refs(FILE *f, struct ref_array *array)
void add_extra_ref(const char *name, const unsigned char *sha1)
{
- add_ref(name, sha1, 0, 0, &extra_refs, NULL);
+ int len = strlen(name) + 1;
+ struct extra_ref *entry = xmalloc(sizeof(struct extra_ref) + len);
+ hashcpy(entry->sha1, sha1);
+ memcpy(entry->name, name, len);
+ entry->next = extra_refs;
+ extra_refs = entry;
}
void clear_extra_refs(void)
{
- free_ref_array(&extra_refs);
+ while (extra_refs) {
+ struct extra_ref *entry = extra_refs;
+ extra_refs = entry->next;
+ free(entry);
+ }
}
static struct ref_array *get_packed_refs(const char *submodule)
@@ -694,13 +707,18 @@ fallback:
}
static int do_for_each_extra_ref(const char *base, each_ref_fn fn,
- int trim, int flags, void *cb_data)
+ int trim, void *cb_data)
{
- int i;
- for (i = 0; i < extra_refs.nr; i++) {
- int retval = do_one_ref(base, fn, trim, flags, cb_data, extra_refs.refs[i]);
- if (retval)
- return retval;
+ struct extra_ref *extra;
+
+ current_ref = NULL;
+ for (extra = extra_refs; extra; extra = extra->next) {
+ if (!prefixcmp(extra->name, base)) {
+ int retval = fn(extra->name + trim, extra->sha1,
+ 0, cb_data);
+ if (retval)
+ return retval;
+ }
}
return 0;
}
@@ -712,7 +730,7 @@ static int do_for_each_ref(const char *submodule, const char *base, each_ref_fn
struct ref_array *packed = get_packed_refs(submodule);
struct ref_array *loose = get_loose_refs(submodule);
- retval = do_for_each_extra_ref(base, fn, trim, flags, cb_data);
+ retval = do_for_each_extra_ref(base, fn, trim, cb_data);
if (retval)
goto end_each;
--
1.7.8
next prev parent reply other threads:[~2011-12-13 20:07 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-12-13 20:06 [PATCH 0/6] Handle extra_refs separately from ref_caches mhagger
2011-12-13 20:06 ` [PATCH 1/6] t5519: push two branches to alternate repo mhagger
2011-12-13 20:06 ` [PATCH 2/6] add_extra_ref(): remove flag argument mhagger
2011-12-13 20:06 ` [PATCH 3/6] Extract a function do_for_each_extra_ref() mhagger
2011-12-13 20:06 ` mhagger [this message]
2011-12-13 20:06 ` [PATCH 5/6] Omit extra_refs except when iterating using for_each_ref() mhagger
2011-12-13 20:06 ` [PATCH 6/6] do_for_each_extra_ref(): simplify signature mhagger
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=1323806811-5798-5-git-send-email-mhagger@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).