Mercurial > public > mercurial-scm > hg-stable
diff mercurial/bundle2.py @ 20864:9a75d2559cff
bundle2: support unbundling empty part
We augment the unbundler to make it able to unbundle the empty part we are now
able to bundle.
author | Pierre-Yves David <pierre-yves.david@fb.com> |
---|---|
date | Wed, 19 Mar 2014 23:04:03 -0700 |
parents | 8a6a86c9a5b5 |
children | ddd56f3eb786 |
line wrap: on
line diff
--- a/mercurial/bundle2.py Fri Mar 28 17:00:13 2014 -0700 +++ b/mercurial/bundle2.py Wed Mar 19 23:04:03 2014 -0700 @@ -240,9 +240,31 @@ def _readpart(self): """return None when an end of stream markers is reach""" - headersize = self._readexact(2) - assert headersize == '\0\0' - return None + + headersize = self._unpack(_fpartheadersize)[0] + self.ui.debug('part header size: %i\n' % headersize) + if not headersize: + return None + headerblock = self._readexact(headersize) + # some utility to help reading from the header block + self._offset = 0 # layer violation to have something easy to understand + def fromheader(size): + """return the next <size> byte from the header""" + offset = self._offset + data = headerblock[offset:(offset + size)] + self._offset = offset + size + return data + typesize = _unpack(_fparttypesize, fromheader(1))[0] + parttype = fromheader(typesize) + self.ui.debug('part type: "%s"\n' % parttype) + current = part(parttype) + assert fromheader(2) == '\0\0' # no option for now + del self._offset # clean up layer, nobody saw anything. + self.ui.debug('part parameters: 0\n') + assert self._readexact(4) == '\0\0\0\0' #empty payload + self.ui.debug('payload chunk size: 0\n') + return current + class part(object): """A bundle2 part contains application level payload @@ -251,8 +273,9 @@ handler. """ - def __init__(self, parttype): + def __init__(self, parttype, data=''): self.type = parttype + self.data = data def getchunks(self): ### header