Linus Torvalds [off-list ref] writes:
On Tue, 7 Mar 2006, Junio C Hamano wrote:
quoted
However, I am stuck with the first step, which is to do a full
flush after the header. An obvious change to the code quoted
above writes out a corrupt object:
/* First header.. */
stream.next_in = hdr;
stream.avail_in = hdrlen;
- while (deflate(&stream, 0) == Z_OK)
+ while (deflate(&stream, Z_FULL_FLUSH) == Z_OK)
/* nothing */;
No, I don't think that's good. You're only doing a partial deflate, you
can't ask for a Z_FULL_FLUSH. That only works if you give it the whole
buffer, and you don't.
So, in short there is no way to create:
hdr part deflated.
flush.
data part deflated independently.
and have the current sha1_read_file() not to notice that flush,
while I can inspect the deflated stream to find the "flush", and
copy only the defalted data part into a pack? Bummer... I was
really shooting for full backward compatibility.
On Tue, 7 Mar 2006, Junio C Hamano wrote:
quoted
No, I don't think that's good. You're only doing a partial deflate, you
can't ask for a Z_FULL_FLUSH. That only works if you give it the whole
buffer, and you don't.
Actually, I misread what you were trying to do, and thought this was the
inflate phase, not the deflate. Now that I understand what you want,
So, in short there is no way to create:
hdr part deflated.
flush.
data part deflated independently.
and have the current sha1_read_file() not to notice that flush,
Actually, try the patch you already tried, except you'll need to add a
deflateEnd(&stream);
deflateInit(&stream, Z_BEST_COMPRESSION);
.. set up output parameters again ..
and you need to change the initial
size = deflateBound(&stream, len+hdrlen);
to
size = deflateBound(&stream, len) + deflateBound(&stream, hdrlen);
and then you might be ok.
That said, I'm not sure I agree with what you're trying to do.
Linus
Hi,
On Tue, 7 Mar 2006, Linus Torvalds wrote:
On Tue, 7 Mar 2006, Junio C Hamano wrote:
quoted
quoted
No, I don't think that's good. You're only doing a partial deflate, you
can't ask for a Z_FULL_FLUSH. That only works if you give it the whole
buffer, and you don't.
Actually, I misread what you were trying to do, and thought this was the
inflate phase, not the deflate.
I don't think it matters if it is inflate or deflate. ZLib keeps an
internal state depending on the data. That is the whole reason why the
packing is so good: it uses the redundancy in the data already seen to
construct a codebook. (And that's also the reason why you can't start to
deflate in the middle.)
Ciao,
Dscho