X-Git-Url: https://www.irasnyder.com/gitweb/?p=rarslave2.git;a=blobdiff_plain;f=rarslave.py;h=2e9861a78e097f3e4e888ea261a5c2d16d0527e2;hp=89d526dcdd12d7c0fec30eba37a8b8db2a8e4730;hb=16584b7fab23c01c2c48eda9efad513dc4addcec;hpb=72db861c672a65ec0d2638b278421419e0fb0efd diff --git a/rarslave.py b/rarslave.py index 89d526d..2e9861a 100644 --- a/rarslave.py +++ b/rarslave.py @@ -6,6 +6,7 @@ import par2parser # Global Variables (TYPE_OLDRAR, TYPE_NEWRAR, TYPE_ZIP, TYPE_NOEXTRACT) = range (4) +(ECHECK, EEXTRACT, EDELETE) = range(1,4) class RarslaveExtractor (object): @@ -22,18 +23,17 @@ class RarslaveExtractor (object): self.heads.append (os.path.join (dir, head)) - def extract (self, todir): + def extract (self, todir=None): # Extract all heads of this set # Create the directory $todir if it doesn't exist - if not os.path.isdir (todir): + if todir != None and not os.path.isdir (todir): # TODO: LOGGER try: os.makedirs (todir) except OSError: # TODO: LOGGER - # Failed mkdir -p, clean up time ... - pass # FIXME: temporary for syntax + return -EEXTRACT # Extract all heads extraction_func = \ @@ -44,7 +44,11 @@ class RarslaveExtractor (object): # Call the extraction function on each head for h in self.heads: - extraction_func (h, todir) + if todir == None: + # Run in the head's directory + extraction_func (h, os.path.dirname (h)) + else: + extraction_func (h, todir) def __extract_rar (self, file, todir): assert os.path.isfile (file) @@ -52,24 +56,33 @@ class RarslaveExtractor (object): RAR_CMD = 'unrar x -o+ -- ' - #file = full_abspath (file) - #todir = full_abspath (todir) - cmd = '%s \"%s\"' % (RAR_CMD, file) ret = run_command (cmd, todir) + # Check error code + if ret != 0: + return -EEXTRACT + def __extract_zip (self, file, todir): ZIP_CMD = 'unzip \"%s\" -d \"%s\"' cmd = ZIP_CMD % (file, todir) ret = run_command (cmd) + # Check error code + if ret != 0: + return -EEXTRACT + def __extract_noextract (self, file, todir): # Just move this file to the $todir, since no extraction is needed # FIXME: NOTE: mv will fail by itself if you're moving to the same dir! cmd = 'mv \"%s\" \"%s\"' % (file, todir) ret = run_command (cmd) + # Check error code + if ret != 0: + return -EEXTRACT + class RarslaveRepairer (object): @@ -110,6 +123,12 @@ class RarslaveRepairer (object): # run the command ret = run_command (command, self.dir) + # check the result + if ret != 0: + # TODO: logger + print 'error during checkAndRepair()' + return -ECHECK + def run_command (cmd, indir=None): # Runs the specified command-line in the directory given (or, in the current directory # if none is given). It returns the status code given by the application. @@ -118,10 +137,12 @@ def run_command (cmd, indir=None): if indir != None: assert os.path.isdir (indir) # MUST be a directory! - os.chdir (pwd) + os.chdir (indir) # FIXME: re-enable this after testing print 'RUNNING (%s): %s' % (indir, cmd) + return 0 + # return os.system (cmd) @@ -330,14 +351,44 @@ class PAR2Set (object): # Repair Stage repairer = RarslaveRepairer (self.dir, par2head, join) - repairer.checkAndRepair () # FIXME: Check return value + ret = repairer.checkAndRepair () # FIXME: Check return value + + if ret: # FAILURE + return -ECHECK # Extraction Stage extractor = find_extraction_heads (self.dir, self.likely_files) - extractor.extract ('extract_dir') # FIXME: Get it from the config + ret = extractor.extract ('extract_dir') # FIXME: Get it from the config + + if ret: # FAILURE + return -EEXTRACT # Deletion Stage - printlist ( find_deleteable_files (self.likely_files) ) + 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.