From: Dmitry Ivankov Date: Thu, 28 Jul 2011 08:11:47 GMT Subject: Re: [PATCH/WIP 4/7] fast-import: fix data corruption in store_tree Message-ID: In-Reply-To: <20110728074239.GA5980@elie> On Thu, Jul 28, 2011 at 1:42 PM, Jonathan Nieder wrote: > Dmitry Ivankov wrote: > >> --- a/fast-import.c >> +++ b/fast-import.c >> @@ -1474,8 +1474,11 @@ static void store_tree(struct tree_entry *root) >>               return; >> >>       for (i = 0; i < t->entry_count; i++) { >> -             if (t->entries[i]->tree) >> -                     store_tree(t->entries[i]); >> +             if (!S_ISDIR(t->entries[i]->versions[1].mode)) >> +                     continue; >> +             if (!t->entries[i]->tree) >> +                     load_tree(t->entries[i]); >> +             store_tree(t->entries[i]); > > How can this load_tree call work if t->entries[i]->versions[1].sha1 > is not already in the object database? Well, it can be in the database and at the same time t->entries[i]->tree == NULL. In my testcase the commit is like ls :10386 trunk M 040000 e1b2ea9d3634cb7914044425ffae91945c41ac6a branches/cygnus D branches/cygnus/gcc/assert.h D branches/cygnus/gcc/collect2.c D branches/cygnus/gcc/cccp.c D branches/cygnus/gcc/c-parse.gperf ... only D branches/cygnus/gcc/..... lines progress done #here we call it, so it's when we store whole tree, some subdirectory of branches/cygnus the load_tree really gets called (with whole series applied to fast-import) and the load works (sha1 = 2e90a035614854f626bb35eeac517f41ac84da27) Though I don't yet see if not loading it breaks anything in my test (with the whole series).