git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
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

  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 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).