From 547bd75fd6c95204bb3c7084d060532cc477f56a Mon Sep 17 00:00:00 2001 From: Bastian Kleineidam Date: Fri, 11 May 2012 22:56:44 +0200 Subject: [PATCH] Support extraction of GZIP files with the Python gzip module. --- doc/changelog.txt | 3 ++- patoolib/__init__.py | 1 + patoolib/programs/pygzip.py | 44 +++++++++++++++++++++++++++++++++++++ tests/test_archives.py | 5 +++++ 4 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 patoolib/programs/pygzip.py diff --git a/doc/changelog.txt b/doc/changelog.txt index bc92b25..87a0598 100644 --- a/doc/changelog.txt +++ b/doc/changelog.txt @@ -11,7 +11,8 @@ * Added support for the lbzip2 program handling BZIP2 archives. * Added support for the plzip program handling LZIP archives. * Prevent overwriting the same file with repack. -* Support extraction of BZIP2 files with the Python bz2 module. +* Support extraction of BZIP2 (.bz2) files with the Python bz2 module. +* Support extraction of GZIP (.gz) files with the Python gzip module. 0.15 "Contraband" (released 8.4.2012) diff --git a/patoolib/__init__.py b/patoolib/__init__.py index d4df88c..39f8a8b 100644 --- a/patoolib/__init__.py +++ b/patoolib/__init__.py @@ -117,6 +117,7 @@ ArchivePrograms = { }, 'gzip': { None: ('pigz', 'gzip', '7z', '7za'), + 'extract': ('pygzip',), }, 'lzh': { None: ('lha',), diff --git a/patoolib/programs/pygzip.py b/patoolib/programs/pygzip.py new file mode 100644 index 0000000..c930e7b --- /dev/null +++ b/patoolib/programs/pygzip.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2012 Bastian Kleineidam +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +"""Archive commands for the gzip Python module.""" +from __future__ import absolute_import +# now gzip refers to the Python standard module, not the local one +import gzip +from patoolib import util + +READ_SIZE_BYTES = 1024*1024 + +def extract_gzip (archive, encoding, cmd, **kwargs): + """Extract a GZIP archive with the gzip Python module functionality.""" + verbose = kwargs['verbose'] + if verbose: + util.log_info('extracting %s...' % archive) + targetname = util.get_single_outfile(kwargs['outdir'], archive) + gzipfile = gzip.GzipFile(archive) + try: + targetfile = open(targetname, 'wb') + try: + data = gzipfile.read(READ_SIZE_BYTES) + while data: + targetfile.write(data) + data = gzipfile.read(READ_SIZE_BYTES) + finally: + targetfile.close() + finally: + gzipfile.close() + if verbose: + util.log_info('... extracted to %s' % targetname) + return None diff --git a/tests/test_archives.py b/tests/test_archives.py index d863112..809af60 100644 --- a/tests/test_archives.py +++ b/tests/test_archives.py @@ -153,6 +153,11 @@ class TestArchives (ArchiveTest): self.archive_commands('t.txt.gz', singlefile=True) self.archive_extract('t.Z') + def test_pygzip (self): + self.program = 'pygzip' + self.archive_extract('t.gz') + self.archive_extract('t.txt.gz') + @needs_program('pigz') def test_pigz (self): self.program = 'pigz'