Re: [PATCH/WIP 4/7] fast-import: fix data corruption in store_tree
- From
Dmitry Ivankov <divanorama@gmail.com>
- Date
- Jul 28, 2011, 08:11 UTC
- Message-ID
- <CA+gfSn-62W8TPjaKkSZCbWmxaeNnk_KSWJ-1=x106hGk5cEw=w@mail.gmail.com>
- In-Reply-To
- <20110728074239.GA5980@elie>
On Thu, Jul 28, 2011 at 1:42 PM, Jonathan Nieder <jrnieder@gmail.com> wrote:
Show 18 quoted lines
> 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).