[svn] Fix some bugs and make things a little more user-friendly now that we can trunk

Thu, 22 Nov 2007 22:24:04 -0500

author
brett
date
Thu, 22 Nov 2007 22:24:04 -0500
branch
trunk
changeset 33
3547e3124729
parent 32
ec4c845695b3
child 34
a8f875e02c83

[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.

scripts/dtrx file | annotate | diff | comparison | revisions
tests/tests.yml file | annotate | diff | comparison | revisions
--- 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:
--- 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

mercurial