- if is_zip (files):
- extractor = RarslaveExtractor (TYPE_ZIP)
- regex = re.compile ('^.*\.zip$', re.IGNORECASE)
- for f in files:
- if regex.match (f):
- extractor.addHead (dir, f)
-
- if is_noextract (files):
- # Use the Par2 Parser (from cfv) here to find out what files are protected.
- # Since these are not being extracted, they will be mv'd to another directory
- # later.
- extractor = RarslaveExtractor (TYPE_NOEXTRACT)
-
- for f in p2files:
- done = False
- try:
- prot_files = par2parser.get_protected_files (dir, f)
- done = True
- except: #FIXME: add the actual exceptions
- print 'ERROR PARSING P2FILE ...', f
- continue
-
- if done:
- break
-
- if done:
- for f in prot_files:
- extractor.addHead (dir, f)
- else:
- print 'BADNESS'
-
- # Make sure we found the type
- assert extractor != None
-
- return extractor
-
-def is_oldrar (files):
- for f in files:
- if has_extension (f, '.r00'):
- return True
-
-def is_newrar (files):
- for f in files:
- if has_extension (f, '.part01.rar'):
- return True
-
-def is_zip (files):
- for f in files:
- if has_extension (f, '.zip'):
- return True
-
-def is_noextract (files):
- # Type that needs no extraction.
- # TODO: Add others ???
- for f in files:
- if has_extension (f, '.001'):
- return True
-
-def find_deleteable_files (files):
- # Deleteable types regex should come from the config
- dfiles = []
- dregex = re.compile ('^.*\.(par2|\d|\d\d\d|rar|r\d\d|zip)$', re.IGNORECASE)
-
- return [f for f in files if dregex.match (f)]
-
-def printlist (li):
- for f in li:
- print f
+ if options.version:
+ print PROGRAM + ' - ' + VERSION
+ print
+ print 'Copyright (c) 2005-2008 Ira W. Snyder (devel@irasnyder.com)'
+ print
+ print 'This program comes with ABSOLUTELY NO WARRANTY.'
+ print 'This is free software, and you are welcome to redistribute it'
+ print 'under certain conditions. See the file COPYING for details.'
+ sys.exit (0)
+
+ return (options, args)
+
+################################################################################
+
+# Find each unique CompareSet in the given directory and set of files
+def findUniqueSets(directory, files):
+
+ regex = r'^.*\.par2'
+ s = []
+
+ for f in PAR2Set.utils.findMatches(regex, files):
+
+ try:
+ c = PAR2Set.CompareSet(directory, f)
+
+ if c not in s:
+ s.append(c)
+ except:
+ # We just ignore any errors that happen, such as
+ # parsing the PAR file
+ pass
+
+ return s
+
+################################################################################
+
+# Run each PAR2Set type on a CompareSet
+def runEachType(cs, options):
+
+ types = (
+ PAR2Set.Join,
+ PAR2Set.ZIP,
+ PAR2Set.OldRAR,
+ PAR2Set.NewRAR,
+ PAR2Set.ExtractFirstOldRAR,
+ PAR2Set.ExtractFirstNewRAR,
+ PAR2Set.NoExtract,
+ )
+
+ detected = False
+
+ # Try to detect each type in turn
+ for t in types:
+ try:
+ instance = t(cs, options)
+ detected = True
+ logging.debug('%s detected for %s' % (t.__name__, cs.parityFile))
+ except TypeError:
+ logging.debug('%s not detected for %s' % (t.__name__, cs.parityFile))
+ continue
+
+ # We detected something, try to run it
+ try:
+ instance.run()
+ logging.info('Success: %s' % instance)
+
+ # Leave early, we're done
+ return
+ except (OSError, CalledProcessError):
+ logging.critical('Failure: %s' % instance)
+
+ # Check that at least one detection worked
+ if not detected:
+ logging.critical('Detection failed: %s' % cs.parityFile)
+ logging.debug('The following information will help to create a detector')
+ logging.debug('===== BEGIN CompareSet RAW INFO =====')
+ logging.debug(str(cs))
+ logging.debug('===== END CompareSet RAW INFO =====')
+
+ # If we got here, either the detection didn't work or the run itself didn't
+ # work, so print out the message telling the user that we were unsuccessful
+ logging.critical('Unsuccessful: %s' % cs.parityFile)
+
+################################################################################
+
+def runDirectory(directory, files, options):
+
+ logging.debug('Running in directory: %s' % directory)
+ sets = findUniqueSets(directory, files)
+
+ for cs in sets:
+ try:
+ runEachType(cs, options)
+ except:
+ logging.error('Unknown Exception: %s' % cs.parityFile)
+
+################################################################################