From: Jeff King <peff@peff.net>
To: Christian Couder <christian.couder@gmail.com>
Cc: Junio C Hamano <gitster@pobox.com>,
Christian Couder <chriscool@tuxfamily.org>,
git <git@vger.kernel.org>, Jakub Narebski <jnareb@gmail.com>,
Eric Sunshine <sunshine@sunshineco.com>
Subject: Re: [PATCH v3 1/4] replace: add --graft option
Date: Sun, 8 Jun 2014 07:23:33 -0400 [thread overview]
Message-ID: <20140608112333.GA9691@sigill.intra.peff.net> (raw)
In-Reply-To: <CAP8UFD344NFECqtO-uK-2wHA7XEko3XMJWuhW9+KGBdaiqGq+w@mail.gmail.com>
On Sun, Jun 08, 2014 at 08:49:45AM +0200, Christian Couder wrote:
> On Fri, Jun 6, 2014 at 5:44 PM, Christian Couder
> <christian.couder@gmail.com> wrote:
> >
> > /* find existing parents */
> > strbuf_addstr(&buf, commit->buffer);
>
> Unfortunately, it looks like the above will not work if the commit->buffer
> contains an embedded NUL. I wonder if it is a real problem or not.
I ran into a similar problem recently[1] and have been pondering
solutions to know the size of commit->buffer. What I've been come up
with is:
1. Look up the object size via sha1_object_info. Besides being
inefficient (which probably does not matter for you here, but might
for using commit->buffer in a traversal), it strikes me as
inelegant; is it possible for commit->buffer to ever disagree in
size with the results of sha1_object_info, and if so, what happens?
2. Add an extra member "len" to "struct commit". This is simple, but
bloats "struct commit", which may have a performance impact for
things like rev-list, where the field will be unused.
3. Store the length of objects as a size_t, exactly sizeof(size_t)
bytes before the object buffer. Provide a macro:
#define OBJECT_SIZE(buf) (((size_t *)(buf))[-1])
to access it. Most callers can just use the buffer as-is, but
anybody who calls free() would need to be adjusted to use a special
"object_free".
4. Keep a static commit_slab that points to the length for each parsed
commit. We pay the same memory cost as (2), but as it's not part of
the struct, the cache effects are minimized.
-Peff
[1] http://article.gmane.org/gmane.comp.version-control.git/250480
next prev parent reply other threads:[~2014-06-08 11:23 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-06-04 19:43 [PATCH v3 0/4] Add --graft option to git replace Christian Couder
2014-06-04 19:43 ` [PATCH v3 1/4] replace: add --graft option Christian Couder
2014-06-05 21:49 ` Junio C Hamano
2014-06-06 15:29 ` Christian Couder
2014-06-06 15:44 ` Christian Couder
2014-06-08 6:49 ` Christian Couder
2014-06-08 11:23 ` Jeff King [this message]
2014-06-08 12:04 ` Jeff King
2014-06-08 12:09 ` Jeff King
2014-06-09 16:43 ` Junio C Hamano
[not found] ` <CAPc5daWBycdmKBZXGhhy4_649p_JFfGf7RQbqa08XA1hL9mFTg@mail.gmail.com>
2014-06-29 6:34 ` Christian Couder
2014-06-30 6:37 ` Junio C Hamano
2014-06-30 10:52 ` Christian Couder
2014-06-06 16:59 ` Junio C Hamano
2014-06-04 19:43 ` [PATCH v3 2/4] replace: add test for --graft Christian Couder
2014-06-04 19:43 ` [PATCH v3 3/4] Documentation: replace: add --graft option Christian Couder
2014-06-04 19:43 ` [PATCH v3 4/4] contrib: add convert-grafts-to-replace-refs.sh Christian Couder
2014-06-05 21:55 ` Junio C Hamano
2014-06-06 15:47 ` Christian Couder
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=20140608112333.GA9691@sigill.intra.peff.net \
--to=peff@peff.net \
--cc=chriscool@tuxfamily.org \
--cc=christian.couder@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jnareb@gmail.com \
--cc=sunshine@sunshineco.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.
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).