1
0
mirror of https://github.com/openSUSE/osc.git synced 2025-02-26 04:02:11 +01:00

Port CpioWrite to python3

Now, CpioWrite provides a bytes-only API. It would be also possible
that the API accepts bytes and str (we would need to explicitly
encode the latter) but this would be a bit inconsistent wrt.
cpio.CpioRead (which is bytes-only).
Also, by using a bytesarray instead of a [] we avoid several
intermediate ''.join(...)s.
This commit is contained in:
Marcus Huewe 2019-01-15 20:37:57 +01:00
parent 3e326b1bb4
commit 5387744d36

View File

@ -200,50 +200,49 @@ class CpioWrite:
"""cpio archive small files in memory, using new style portable header format"""
def __init__(self):
self.cpio = ''
self.cpio = bytearray()
def add(self, name=None, content=None, perms=0x1a4, type=0x8000):
namesize = len(name) + 1
if namesize % 2:
name += '\0'
name += b'\0'
filesize = len(content)
mode = perms | type
c = []
c.append('070701') # magic
c.append('%08X' % 0) # inode
c.append('%08X' % mode) # mode
c.append('%08X' % 0) # uid
c.append('%08X' % 0) # gid
c.append('%08X' % 0) # nlink
c.append('%08X' % 0) # mtime
c.append('%08X' % filesize)
c.append('%08X' % 0) # major
c.append('%08X' % 0) # minor
c.append('%08X' % 0) # rmajor
c.append('%08X' % 0) # rminor
c.append('%08X' % namesize)
c.append('%08X' % 0) # checksum
c = bytearray()
c.extend(b'070701') # magic
c.extend(b'%08X' % 0) # inode
c.extend(b'%08X' % mode) # mode
c.extend(b'%08X' % 0) # uid
c.extend(b'%08X' % 0) # gid
c.extend(b'%08X' % 0) # nlink
c.extend(b'%08X' % 0) # mtime
c.extend(b'%08X' % filesize)
c.extend(b'%08X' % 0) # major
c.extend(b'%08X' % 0) # minor
c.extend(b'%08X' % 0) # rmajor
c.extend(b'%08X' % 0) # rminor
c.extend(b'%08X' % namesize)
c.extend(b'%08X' % 0) # checksum
c.append(name + '\0')
c.append('\0' * (len(''.join(c)) % 4))
c.extend(name + b'\0')
c.extend(b'\0' * (len(c) % 4))
c.append(content)
c.extend(content)
c = ''.join(c)
if len(c) % 4:
c += '\0' * (4 - len(c) % 4)
c.extend(b'\0' * (4 - len(c) % 4))
self.cpio += c
self.cpio.extend(c)
def add_padding(self):
if len(self.cpio) % 512:
self.cpio += '\0' * (512 - len(self.cpio) % 512)
self.cpio.extend(b'\0' * (512 - len(self.cpio) % 512))
def get(self):
self.add('TRAILER!!!', '')
self.add(b'TRAILER!!!', b'')
self.add_padding()
return ''.join(self.cpio)
return bytes(self.cpio)
if __name__ == '__main__':