From: Johan Herland <johan@herland.net>
To: "Shawn O. Pearce" <spearce@spearce.org>
Cc: git@vger.kernel.org, gitster@pobox.com
Subject: Re: [RFC/PATCHv8 08/10] fast-import: Proper notes tree manipulation using the notes API
Date: Thu, 26 Nov 2009 12:10:47 +0100 [thread overview]
Message-ID: <200911261210.48138.johan@herland.net> (raw)
In-Reply-To: <20091126024655.GR11919@spearce.org>
On Thursday 26 November 2009, Shawn O. Pearce wrote:
> Johan Herland <johan@herland.net> wrote:
> > This patch teaches 'git fast-import' to use the notes API to
> > organize
>
> ...
>
> > This patch is substantially different from the previous iteration.
> > Unloading (and reloading) the notes tree along with its
> > corresponding branch was relatively straightforward to fix, but
> > avoiding the destroying and re-adding of all the notes in every
> > commit was much harder. After 3-4 attempts at a simpler (but
> > fundamentally broken) approach, I finally landed on this. I'm not
> > satisfied with the amount of code introduced by this patch, and
> > would be happy if someone found a better/shorter/more elegant way
> > to solve this problem.
>
> Yea, I agree, I'm not happy with the amount of complex code added
> to implement this. But I can't say there's a better way to do it
> and still reuse the notes code. Maybe its just worth breaking away
> from the notes code altogether? fast-import also implements its
> own pack formatting functions because reusing them from pack-objects
> was just too ugly.
Ok, I will attempt to redo the patch without reusing the notes code. I
have couple of ideas on how to get it done, but probably won't have the
time to implement them until next week...
> Aside from a few minor nits below though, I could ACK this, it at
> least avoids the nasty corners that can arise when there are a lot
> of branches and tries to minimize the cost when there are many notes.
>
> > diff --git a/fast-import.c b/fast-import.c
> > +
> > +static void add_to_replace_list(
> > + struct tree_entry_replace **replace_list,
> > + const char *old_path, const char *new_path)
> > +{
> > + struct tree_entry_replace *r = (struct tree_entry_replace *)
> > + xmalloc(sizeof(struct tree_entry_replace));
> > + r->next = (*replace_list)->next;
> > + r->old_path = xstrdup(old_path);
> > + r->new_path = xstrdup(new_path);
> > + (*replace_list)->next = r;
> > + *replace_list = r;
>
> Really? I don't get why you are replacing the head's next with r
> only to then replace head itself with r.
>
> > @@ -2265,6 +2540,18 @@ static void parse_new_commit(void)
> > break;
> > }
> >
> > + if (notes) {
> > + /* reconcile diffs between b->branch_tree and the notes tree */
> > + struct reconcile_notes_tree_helper_data d;
> > + struct tree_entry_replace *replace_list =
> > + xcalloc(1, sizeof(struct tree_entry_replace));
>
> Oh, I see. The issue I had with understanding add_to_replace_list()
> is due to this spot allocating a blank header node. Normally we do
> this with a pointer to a pointer and initialize NULL:
>
> struct tree_entry_replace *list = NULL;
> struct tree_entry_replace **replace_list = &list;
>
> Can we avoid this blank header node? I think it comlicates the code,
> e.g. in process_replace_list() you have to skip over the blank node
> by testing for both paths being NULL.
The main problem is that I need to grow a linked list at the far end,
while keeping a reference to the first element, so that
process_replace_list() traverse the list in the correct order (FIFO).
However, I agree that my approach to doing so may have been somewhat
ham-fisted... Will redo (unless the alternative approach above renders
this code obsolete).
BTW, while we're on the topic, this whole code is only present because I
assume it's not possible to edit the fast-import tree structure _while_
traversing it. Is this assumption correct, or are there ways to get
around maintaining a separate edit list that is applied to the tree
structure afterwards?
Thanks for the review! :)
...Johan
--
Johan Herland, <johan@herland.net>
www.herland.net
next prev parent reply other threads:[~2009-11-26 11:12 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-11-20 1:39 [RFC/PATCHv8 00/10] git notes Johan Herland
2009-11-20 1:39 ` [RFC/PATCHv8 01/10] Notes API: get_commit_notes() -> format_note() + remove the commit restriction Johan Herland
2009-11-20 1:39 ` [RFC/PATCHv8 02/10] Notes API: init_notes(): Initialize the notes tree from the given notes ref Johan Herland
2009-11-20 1:39 ` [RFC/PATCHv8 03/10] Notes API: add_note(): Add note objects to the internal notes tree structure Johan Herland
2009-11-20 1:39 ` [RFC/PATCHv8 04/10] Notes API: get_note(): Return the note annotating the given object Johan Herland
2009-11-20 1:39 ` [RFC/PATCHv8 05/10] Notes API: for_each_note(): Traverse the entire notes tree with a callback Johan Herland
2009-11-20 1:39 ` [RFC/PATCHv8 06/10] Notes API: Allow multiple concurrent notes trees with new struct notes_tree Johan Herland
2009-11-20 1:39 ` [RFC/PATCHv8 07/10] Refactor notes concatenation into a flexible interface for combining notes Johan Herland
2009-11-20 1:39 ` [RFC/PATCHv8 08/10] fast-import: Proper notes tree manipulation using the notes API Johan Herland
2009-11-26 2:46 ` Shawn O. Pearce
2009-11-26 11:10 ` Johan Herland [this message]
2009-11-26 19:33 ` Shawn O. Pearce
2009-11-20 1:39 ` [RFC/PATCHv8 09/10] Rename t9301 to t9350, to make room for more fast-import tests Johan Herland
2009-11-20 1:39 ` [RFC/PATCHv8 10/10] Add more testcases to test fast-import of notes Johan Herland
2009-11-20 9:44 ` [RFC/PATCHv8 00/10] git notes Junio C Hamano
2009-11-20 10:14 ` Johan Herland
2009-11-20 10:28 ` Nanako Shiraishi
2009-11-20 10:36 ` Johannes Schindelin
2009-11-20 10:46 ` Junio C Hamano
2009-11-20 11:02 ` Junio C Hamano
2010-01-19 15:54 ` Alex Riesen
2010-01-19 18:10 ` Junio C Hamano
2010-01-20 3:29 ` Junio C Hamano
2010-01-20 8:17 ` Johannes Sixt
2010-01-20 8:34 ` Junio C Hamano
2010-01-20 10:06 ` Alex Riesen
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=200911261210.48138.johan@herland.net \
--to=johan@herland.net \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=spearce@spearce.org \
/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.