def try_append(self, item): if item.kind == 'content': data = [ b'\xdd' ] data.append(valuecodecs.make_varuint(len(item.cid))) data.append(valuecodecs.make_varuint(len(item.checksum))) if item.cid.startswith(item.checksum): data.append(item.cid) else: if not item.checksum.startswith(item.cid): raise InvalidDataError('cid and checksum mismatch') data.append(item.checksum) data.append(valuecodecs.make_uint32(item.first)) if hasattr(item, 'last'): self._logger.warn('deprecated', 'item.last') # The "last" data item in the file is obsoleted, so just # fill it with the first seen time instead. data.append(valuecodecs.make_uint32(item.first)) if hasattr(item, 'updates'): self._logger.warn('deprecated', 'item.updates') data = b''.join(data) if (self._blockdatasize is not None and self._datasize + len(data) > self._blockdatasize): return False self.modified = True self._items.append((data, item)) self._datasize += len(data) return True raise InvalidDataError('Unknown item type: ' + item.kind)
def try_append(self, item): if item.kind == 'directory': if item.extra_data: data = [ b'\x92' ] else: data = [ b'\x90' ] data.append(valuecodecs.make_varuint(item.dirid)) data.append(valuecodecs.make_varuint(item.parent)) data.append(valuecodecs.make_varuint(len(item.name))) data.append(item.name) if item.extra_data: data.append(valuecodecs.make_varuint(item.extra_data)) data = b''.join(data) elif item.kind.startswith('file'): if item.kind == 'file': if item.extra_data: data = [ b'\x93' ] else: data = [ b'\x91' ] else: data = [ b'\x94' ] data.append(valuecodecs.make_varuint(item.parent)) data.append(valuecodecs.make_varuint(len(item.name))) data.append(item.name) data.append(valuecodecs.make_varuint(len(item.cid))) data.append(item.cid) data.append(valuecodecs.make_varuint(item.size)) year = item.mtime_year second = item.mtime_second ns = item.mtime_ns if year < 1000 or year > 9999: raise InvalidDataError( 'Unreasonable last-modified year: ' + str(year)) if second < 0 or second > 31622399: # Not checking for December 32 in non-leap years raise InvalidDataError( 'Unreasonable last-modifed second of year: ' + str(second)) if ns < 0 or ns > 999999999: raise InvalidDataError( 'Unreasonable last-modified nanosecond: ' + str(ns)) mtime = bytes(( item.mtime_year & 0xff, (item.mtime_year >> 8), item.mtime_second & 0xff, (item.mtime_second >> 8) & 0xff, (item.mtime_second >> 16) & 0xff, ((item.mtime_second >> 17) & 0x80) + (item.mtime_ns & 0x3f), (item.mtime_ns >> 6) & 0xff, (item.mtime_ns >> 14) & 0xff, item.mtime_ns >> 22)) data.append(mtime) if item.kind != 'file': filetypechar = self._filetypechars.get(item.kind) if filetypechar is None: raise AssertionError('Unknown file type: ' + item.kind) data.append(filetypechar) if item.kind != 'file' or item.extra_data: data.append(valuecodecs.make_varuint(item.extra_data)) data = b''.join(data) elif item.kind == 'key-value': assert b':' not in item.key data = [ ] data.append(valuecodecs.make_varuint(item.kvid)) data.append(item.key) data.append(b':') data.append(item.value) data = b''.join(data) data = b'\x21' + valuecodecs.make_varuint(len(data)) + data elif item.kind == 'extradef': data = [ ] data.append(valuecodecs.make_varuint(item.xid)) for kvid in item.kvids: data.append(valuecodecs.make_varuint(kvid)) data = b''.join(data) data = b'\x22' + valuecodecs.make_varuint(len(data)) + data else: raise InvalidDataError('Unknown item type: ' + item.kind) if (self._blockdatasize is not None and self._datasize + len(data) > self._blockdatasize): return False self.modified = True self._items.append((data, item)) self._datasize += len(data) return True