|
|
|
@ -1440,8 +1440,7 @@ def get_free_dirname(dn):
|
|
|
|
|
"""
|
|
|
|
|
Возвращает имя указанной директорий если оно отсутствует либо добавляются
|
|
|
|
|
цифры
|
|
|
|
|
:param base_dn:
|
|
|
|
|
:param name:
|
|
|
|
|
:param dn:
|
|
|
|
|
:return:
|
|
|
|
|
"""
|
|
|
|
|
if not path.exists(dn):
|
|
|
|
@ -1498,6 +1497,21 @@ def tar_directory(dn, archfile):
|
|
|
|
|
except (IOError, OSError) as e:
|
|
|
|
|
raise FilesError(_("Failed to create tarball: %s") % str(e))
|
|
|
|
|
|
|
|
|
|
def tar_xz_directory(dn, archfile):
|
|
|
|
|
"""
|
|
|
|
|
Заархивировать указанную директорю в xz формате
|
|
|
|
|
:param dn:
|
|
|
|
|
:param archfile:
|
|
|
|
|
:return:
|
|
|
|
|
"""
|
|
|
|
|
try:
|
|
|
|
|
tar = "/bin/tar"
|
|
|
|
|
p = process(tar, "-cJf", archfile, "-C", dn, *listDirectory(dn))
|
|
|
|
|
if p.failed():
|
|
|
|
|
raise FilesError(_("Failed to create tarball: %s")
|
|
|
|
|
% str(p.readerr()))
|
|
|
|
|
except (IOError, OSError) as e:
|
|
|
|
|
raise FilesError(_("Failed to create tarball: %s") % str(e))
|
|
|
|
|
|
|
|
|
|
def tar_list(file_list, archfile, prefix='/'):
|
|
|
|
|
"""
|
|
|
|
@ -1585,3 +1599,38 @@ def xz(data, decompress=False):
|
|
|
|
|
return data
|
|
|
|
|
else:
|
|
|
|
|
raise FilesError(errors)
|
|
|
|
|
|
|
|
|
|
class XZStreamRead(object):
|
|
|
|
|
"""
|
|
|
|
|
XZ объект для чтения данных для tarfile
|
|
|
|
|
"""
|
|
|
|
|
def __init__(self, data):
|
|
|
|
|
self._data = xz(data, decompress=True)
|
|
|
|
|
self.pos = 0
|
|
|
|
|
|
|
|
|
|
def tell(self):
|
|
|
|
|
return self.pos
|
|
|
|
|
|
|
|
|
|
def seek(self, n=0):
|
|
|
|
|
self.pos = n
|
|
|
|
|
|
|
|
|
|
def read(self, size=None):
|
|
|
|
|
if size is None:
|
|
|
|
|
try:
|
|
|
|
|
return self._data[self.pos:]
|
|
|
|
|
finally:
|
|
|
|
|
self.pos = len(self._data)
|
|
|
|
|
try:
|
|
|
|
|
return self._data[self.pos:self.pos+size]
|
|
|
|
|
finally:
|
|
|
|
|
self.pos += min(size,len(self._data))
|
|
|
|
|
|
|
|
|
|
@contextmanager
|
|
|
|
|
def xztaropen(fn):
|
|
|
|
|
f = None
|
|
|
|
|
try:
|
|
|
|
|
f = tarfile.TarFile(mode="r", fileobj=XZStreamRead(readFile(fn)))
|
|
|
|
|
yield f
|
|
|
|
|
finally:
|
|
|
|
|
if f:
|
|
|
|
|
f.close()
|
|
|
|
|