--- yum/misc.py | 76 +++++++++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 56 insertions(+), 20 deletions(-)
diff --git a/yum/misc.py b/yum/misc.py index ebce8e1..92e9127 100644 --- a/yum/misc.py +++ b/yum/misc.py @@ -19,6 +19,13 @@ import pwd import fnmatch import bz2 import gzip +_available_compression = ['gz', 'bz2'] +try: + import lzma + _available_compression.append('xz') +except ImportError: + lzma = None + from rpmUtils.miscutils import stringToVersion, flagToString from stat import * try: @@ -675,10 +682,22 @@ def refineSearchPattern(arg): restring = re.escape(arg) return restring + + +def _decompress_chunked(source, dest, ztype): + + if ztype not in _available_compression: + msg = "%s compression not available" % ztype + raise Errors.MiscError, msg + + if ztype == 'bz2': + s_fn = bz2.BZ2File(source, 'r') + elif ztype == 'xz': + s_fn = lzma.LZMAFile(source, 'r') + elif ztype == 'gz': + s_fn = gzip.GzipFile(source, 'r') + -def bunzipFile(source,dest): - """ Extract the bzipped contents of source to dest. """ - s_fn = bz2.BZ2File(source, 'r') destination = open(dest, 'w') while True: @@ -697,7 +716,11 @@ def bunzipFile(source,dest): destination.close() s_fn.close() - + +def bunzipFile(source,dest): + """ Extract the bzipped contents of source to dest. """ + _decompress_chunked(source, dest, ztype='bz2') + def get_running_kernel_pkgtup(ts): """This takes the output of uname and figures out the pkgtup of the running kernel (name, arch, epoch, version, release).""" @@ -982,29 +1005,42 @@ def get_uuid(savepath): return myid -def decompress(filename): +def decompress(filename, dest=None): """take a filename and decompress it into the same relative location. if the file is not compressed just return the file""" - out = filename + + out = dest + if not dest: + out = filename + if filename.endswith('.gz'): - out = filename.replace('.gz', '') - decom = gzip.open(filename) - fo = open(out, 'w') - fo.write(decom.read()) - fo.flush() - fo.close() - decom.close() - elif filename.endswith('.bz') or filename.endswith('.bz2'): - if filename.endswith('.bz'): - out = filename.replace('.bz','') - else: - out = filename.replace('.bz2', '') - bunzipFile(filename, out) + ztype='gz' + if not dest: + out = filename.replace('.gz', '') - #add magical lzma/xz trick here + elif filename.endswith('.bz') or filename.endswith('.bz2'): + ztype='bz2' + if not dest: + if filename.endswith('.bz'): + out = filename.replace('.bz','') + else: + out = filename.replace('.bz2', '') + + elif filename.endswith('.xz'): + ztype='xz' + if not dest: + out = filename.replace('.xz', '') + + else: + out = filename # returning the same file since it is not compressed + ztype = None + if ztype: + _decompress_chunked(filename, out, ztype) + return out + def read_in_items_from_dot_dir(thisglob, line_as_list=True): """takes a glob of a dir (like /etc/foo.d/*.foo) returns a list of all the lines in all the files matching -- 1.7.0.1 _______________________________________________ Yum-devel mailing list Yum-devel@lists.baseurl.org http://lists.baseurl.org/mailman/listinfo/yum-devel