scripts/dtrx

branch
trunk
changeset 33
3547e3124729
parent 32
ec4c845695b3
child 34
a8f875e02c83
equal deleted inserted replaced
32:ec4c845695b3 33:3547e3124729
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

mercurial