208 |
208 |
209 def extract(self): |
209 def extract(self): |
210 self.target = tempfile.mkdtemp(prefix='.dtrx-', dir='.') |
210 self.target = tempfile.mkdtemp(prefix='.dtrx-', dir='.') |
211 old_path = os.path.realpath(os.curdir) |
211 old_path = os.path.realpath(os.curdir) |
212 os.chdir(self.target) |
212 os.chdir(self.target) |
213 self.archive.seek(0, 0) |
213 try: |
214 self.extract_archive() |
214 self.archive.seek(0, 0) |
215 self.check_contents() |
215 self.extract_archive() |
|
216 self.check_contents() |
|
217 except ExtractorError: |
|
218 os.chdir(old_path) |
|
219 subprocess.call(['rm', '-rf', self.target]) |
|
220 raise |
216 os.chdir(old_path) |
221 os.chdir(old_path) |
217 |
222 |
218 def get_filenames(self): |
223 def get_filenames(self): |
219 self.run_pipes() |
224 self.run_pipes() |
220 self.archive.seek(0, 0) |
225 self.archive.seek(0, 0) |
632 |
637 |
633 def get_extractor(self): |
638 def get_extractor(self): |
634 for func_name in ('mimetype', 'extension', 'magic'): |
639 for func_name in ('mimetype', 'extension', 'magic'): |
635 archive_type, encoding = \ |
640 archive_type, encoding = \ |
636 getattr(self, 'try_by_' + func_name)(self.filename) |
641 getattr(self, 'try_by_' + func_name)(self.filename) |
|
642 logger.debug("%s extractor is %s, %s" % |
|
643 (func_name, archive_type, encoding)) |
637 if archive_type is not None: |
644 if archive_type is not None: |
638 yield self.build_extractor(archive_type, encoding) |
645 yield self.build_extractor(archive_type, encoding) |
639 |
646 |
640 def try_by_mimetype(cls, filename): |
647 def try_by_mimetype(cls, filename): |
641 mimetype, encoding = mimetypes.guess_type(filename) |
648 mimetype, encoding = mimetypes.guess_type(filename) |
687 def report(self, function, *args): |
694 def report(self, function, *args): |
688 try: |
695 try: |
689 error = function(*args) |
696 error = function(*args) |
690 except (ExtractorError, IOError, OSError), exception: |
697 except (ExtractorError, IOError, OSError), exception: |
691 error = str(exception) |
698 error = str(exception) |
692 logger.debug(traceback.format_exception(*sys.exc_info())) |
699 logger.debug(''.join(traceback.format_exception(*sys.exc_info()))) |
693 if error: |
700 if error: |
694 logger.error("%s: %s", self.current_filename, error) |
701 logger.info("%s: %s", self.current_filename, error) |
695 return False |
702 return False |
696 return True |
703 return True |
697 |
704 |
698 |
705 |
699 class ExtractionAction(BaseAction): |
706 class ExtractionAction(BaseAction): |
787 self.options.one_entry_policy = OneEntryPolicy(self.options) |
794 self.options.one_entry_policy = OneEntryPolicy(self.options) |
788 self.options.recursion_policy = RecursionPolicy(self.options) |
795 self.options.recursion_policy = RecursionPolicy(self.options) |
789 self.archives = {os.path.realpath(os.curdir): filenames} |
796 self.archives = {os.path.realpath(os.curdir): filenames} |
790 |
797 |
791 def setup_logger(self): |
798 def setup_logger(self): |
|
799 # WARNING is the default. |
|
800 log_level = (10 * (self.options.quiet - self.options.verbose)) |
|
801 logging.getLogger().setLevel(log_level) |
792 handler = logging.StreamHandler() |
802 handler = logging.StreamHandler() |
793 # WARNING is the default. |
803 handler.setLevel(log_level) |
794 handler.setLevel(10 * (self.options.quiet - self.options.verbose)) |
|
795 formatter = logging.Formatter("dtrx: %(levelname)s: %(message)s") |
804 formatter = logging.Formatter("dtrx: %(levelname)s: %(message)s") |
796 handler.setFormatter(formatter) |
805 handler.setFormatter(formatter) |
797 logger.addHandler(handler) |
806 logger.addHandler(handler) |
|
807 logger.debug("logger is set up") |
798 |
808 |
799 def recurse(self, filename, extractor, action): |
809 def recurse(self, filename, extractor, action): |
800 archives = extractor.included_archives |
810 archives = extractor.included_archives |
801 self.options.recursion_policy.prep(filename, archives) |
811 self.options.recursion_policy.prep(filename, archives) |
802 if self.options.recursion_policy.ok_to_recurse(): |
812 if self.options.recursion_policy.ok_to_recurse(): |
821 if action.run(filename, extractor): |
831 if action.run(filename, extractor): |
822 self.successes.append(filename) |
832 self.successes.append(filename) |
823 self.recurse(filename, extractor, action) |
833 self.recurse(filename, extractor, action) |
824 break |
834 break |
825 else: |
835 else: |
|
836 logger.error("%s: could not find a way to extract this" % |
|
837 (filename,)) |
826 self.failures.append(filename) |
838 self.failures.append(filename) |
827 self.options.one_entry_policy.permanent_policy = EXTRACT_WRAP |
839 self.options.one_entry_policy.permanent_policy = EXTRACT_WRAP |
828 if self.failures: |
840 if self.failures: |
829 return 1 |
841 return 1 |
830 return 0 |
842 return 0 |