+class PAR2Set (object):
+
+ dir = None
+ file = None
+ likely_files = []
+
+ def __init__ (self, dir, file):
+ assert os.path.isdir (dir)
+ assert os.path.isfile (os.path.join (dir, file))
+
+ self.dir = dir
+ self.file = file
+
+ basename = get_basename (file)
+ self.likely_files = find_likely_files (basename, dir)
+
+ def __list_eq (self, l1, l2):
+
+ if len(l1) != len(l2):
+ return False
+
+ for e in l1:
+ if e not in l2:
+ return False
+
+ return True
+
+ def __eq__ (self, rhs):
+ return self.__list_eq (self.likely_files, rhs.likely_files)
+
+ def run_all (self):
+ par2files = find_par2_files (self.likely_files)
+ par2head = par2files[0]
+
+ join = is_noextract (self.likely_files)
+
+ # Repair Stage
+ repairer = RarslaveRepairer (self.dir, par2head, join)
+ ret = repairer.checkAndRepair () # FIXME: Check return value
+
+ if ret: # FAILURE
+ return -ECHECK
+
+ # Extraction Stage
+ extractor = find_extraction_heads (self.dir, self.likely_files)
+ ret = extractor.extract ('extract_dir') # FIXME: Get it from the config
+
+ if ret: # FAILURE
+ return -EEXTRACT
+
+ # Deletion Stage
+ deleteable_files = find_deleteable_files (self.likely_files)
+ ret = delete_list (deleteable_files)
+
+ if ret: # FAILURE
+ return -EDELETE
+
+ return 0
+
+def delete_list (files, interactive=False):
+ # Delete a list of files
+ # TODO: Add the ability to confirm deletion, like in the original rarslave
+
+ if interactive:
+ # TODO: prompt here
+ # prompt -> OK_TO_DELETE -> do nothing, fall through
+ # prompt -> NOT_OK -> return immediately
+ pass
+
+ for f in files:
+ # FIXME: re-enable this in production
+ # os.remove (f)
+ print 'rm', f
+
+ return 0
+
+
+def generate_all_parsets (dir):
+ # Generate all parsets in the given directory.
+
+ assert os.path.isdir (dir) # Directory MUST be valid
+
+ parsets = []
+ p2files = find_all_par2_files (dir)
+
+ for f in p2files:
+ p = PAR2Set (dir, f)
+ if p not in parsets:
+ parsets.append (p)
+
+ return parsets
+