# HG changeset patch # User brett # Date 1195788094 18000 # Node ID ec4c845695b3e08b16b8f809f7515ffe7b296080 # Parent c3a2760d1c3a784089424ac304d81d211cfa9208 [svn] Oops, finish adding 7z support. diff -r c3a2760d1c3a -r ec4c845695b3 scripts/dtrx --- a/scripts/dtrx Thu Nov 22 22:20:39 2007 -0500 +++ b/scripts/dtrx Thu Nov 22 22:21:34 2007 -0500 @@ -30,8 +30,6 @@ import textwrap import traceback -from cStringIO import StringIO - VERSION = "5.0" VERSION_BANNER = """dtrx version %s Copyright (c) 2006, 2007 Brett Smith @@ -176,7 +174,8 @@ def check_included_archives(self, filenames): for filename in filenames: - if ExtractorBuilder.try_by_mimetype(filename)[0]: + if (ExtractorBuilder.try_by_mimetype(filename)[0] or + ExtractorBuilder.try_by_extension(filename)[0]): self.included_archives.append(filename) def check_contents(self): @@ -351,6 +350,33 @@ return os.path.basename(self.filename) + '-metadata.txt' +class SevenExtractor(BaseExtractor): + border_re = re.compile('^[- ]+$') + + def __init__(self, filename, encoding): + BaseExtractor.__init__(self, '/dev/null', None) + self.filename = os.path.realpath(filename) + + def get_filenames(self): + self.pipe(['7z', 'l', self.filename], "listing") + self.run_pipes() + self.archive.seek(0, 0) + fn_index = None + for line in self.archive: + if self.border_re.match(line): + if fn_index is not None: + break + else: + fn_index = line.rindex(' ') + 1 + elif fn_index is not None: + yield line[fn_index:-1] + self.archive.close() + + def extract_archive(self): + self.pipe(['7z', 'x', self.filename]) + self.run_pipes() + + class BaseHandler(object): def __init__(self, extractor, options): self.extractor = extractor @@ -546,7 +572,8 @@ 'rpm': (RPMExtractor, None), 'cpio': (CpioExtractor, None), 'gem': (GemExtractor, GemMetadataExtractor), - 'compress': (CompressionExtractor, None)} + 'compress': (CompressionExtractor, None), + '7z': (SevenExtractor, None)} mimetype_map = {} for mapping in (('tar', 'x-tar'), @@ -554,7 +581,8 @@ ('deb', 'x-debian-package'), ('rpm', 'x-redhat-package-manager', 'x-rpm'), ('cpio', 'x-cpio'), - ('gem', 'x-ruby-gem')): + ('gem', 'x-ruby-gem'), + ('7z', 'x-7z-compressed')): for mimetype in mapping[1:]: if '/' not in mimetype: mimetype = 'application/' + mimetype @@ -565,7 +593,8 @@ ('cpio', 'cpio archive'), ('tar', 'POSIX tar archive'), ('zip', 'Zip archive'), - ('rpm', 'RPM')): + ('rpm', 'RPM'), + ('7z', '7-zip archive')): for pattern in mapping[1:]: magic_mime_map[re.compile(pattern)] = mapping[0] @@ -584,7 +613,8 @@ ('rpm', None, 'rpm'), ('cpio', None, 'cpio'), ('gem', None, 'gem'), - ('compress', None, 'gz', 'bz2')): + ('compress', None, 'gz', 'bz2'), + ('7z', None, '7z')): for extension in mapping[2:]: extension_map[extension] = mapping[:2] diff -r c3a2760d1c3a -r ec4c845695b3 tests/test-1.23.7z Binary file tests/test-1.23.7z has changed