# HG changeset patch # User brett # Date 1195788244 18000 # Node ID 3547e31247290ba1ce77a6397c29a2536304112c # Parent ec4c845695b3e08b16b8f809f7515ffe7b296080 [svn] Fix some bugs and make things a little more user-friendly now that we can try multiple extractors per file. Add some logging as part of this. I'm probably still not done -- heck, dtrx has never really been user-friendly enough -- but at least now it's not ridiculous. diff -r ec4c845695b3 -r 3547e3124729 scripts/dtrx --- a/scripts/dtrx Thu Nov 22 22:21:34 2007 -0500 +++ b/scripts/dtrx Thu Nov 22 22:24:04 2007 -0500 @@ -210,9 +210,14 @@ self.target = tempfile.mkdtemp(prefix='.dtrx-', dir='.') old_path = os.path.realpath(os.curdir) os.chdir(self.target) - self.archive.seek(0, 0) - self.extract_archive() - self.check_contents() + try: + self.archive.seek(0, 0) + self.extract_archive() + self.check_contents() + except ExtractorError: + os.chdir(old_path) + subprocess.call(['rm', '-rf', self.target]) + raise os.chdir(old_path) def get_filenames(self): @@ -634,6 +639,8 @@ for func_name in ('mimetype', 'extension', 'magic'): archive_type, encoding = \ getattr(self, 'try_by_' + func_name)(self.filename) + logger.debug("%s extractor is %s, %s" % + (func_name, archive_type, encoding)) if archive_type is not None: yield self.build_extractor(archive_type, encoding) @@ -689,9 +696,9 @@ error = function(*args) except (ExtractorError, IOError, OSError), exception: error = str(exception) - logger.debug(traceback.format_exception(*sys.exc_info())) + logger.debug(''.join(traceback.format_exception(*sys.exc_info()))) if error: - logger.error("%s: %s", self.current_filename, error) + logger.info("%s: %s", self.current_filename, error) return False return True @@ -789,12 +796,15 @@ self.archives = {os.path.realpath(os.curdir): filenames} def setup_logger(self): + # WARNING is the default. + log_level = (10 * (self.options.quiet - self.options.verbose)) + logging.getLogger().setLevel(log_level) handler = logging.StreamHandler() - # WARNING is the default. - handler.setLevel(10 * (self.options.quiet - self.options.verbose)) + handler.setLevel(log_level) formatter = logging.Formatter("dtrx: %(levelname)s: %(message)s") handler.setFormatter(formatter) logger.addHandler(handler) + logger.debug("logger is set up") def recurse(self, filename, extractor, action): archives = extractor.included_archives @@ -823,6 +833,8 @@ self.recurse(filename, extractor, action) break else: + logger.error("%s: could not find a way to extract this" % + (filename,)) self.failures.append(filename) self.options.one_entry_policy.permanent_policy = EXTRACT_WRAP if self.failures: diff -r ec4c845695b3 -r 3547e3124729 tests/tests.yml --- a/tests/tests.yml Thu Nov 22 22:21:34 2007 -0500 +++ b/tests/tests.yml Thu Nov 22 22:24:04 2007 -0500 @@ -375,3 +375,17 @@ cleanup: rm -f ${1}test-1.23.bin baseline: | tar -zxf $1 + +- name: extracting file with misleading extension + filenames: trickery.tar.gz + prerun: cp ${1}test-1.23.zip ${1}trickery.tar.gz + cleanup: rm -f ${1}trickery.tar.gz + baseline: | + mkdir trickery + cd trickery + unzip -q ../$1 + +- name: get an error when extracting a non-archive + filenames: /dev/null + error: true + grep: ERROR