X-Git-Url: https://irasnyder.com/gitweb/?a=blobdiff_plain;f=PAR2Set%2FJoin.py;h=34c4996c709c2ba98e6f1b68ef1d8f2693b9abfc;hb=663cfde9556accb7d3e24227dec20e2bc84e431d;hp=c2b055f5ca4ca7f2ad1172fc1570428cae72adb8;hpb=807fadd16633dba83c40d863a3d38a43a00f1e61;p=rarslave2.git diff --git a/PAR2Set/Join.py b/PAR2Set/Join.py index c2b055f..34c4996 100644 --- a/PAR2Set/Join.py +++ b/PAR2Set/Join.py @@ -1,40 +1,81 @@ #!/usr/bin/env python # vim: set ts=4 sts=4 sw=4 textwidth=92: -import logging -import PAR2Set.Base -from RarslaveCommon import * +""" +Holds the Join class. + +This module works with normal joined sets. + +It will detect sets like the following: +X.par2 +X.vol0+1.par2 +... + +X.001 +X.002 +... + +Where the PAR2 files protect a file named X.avi, or similar other types. +It will not work where the PAR2 files are protecting the X.001, etc files +directly. +""" +__author__ = "Ira W. Snyder (devel@irasnyder.com)" +__copyright__ = "Copyright (c) 2006,2007 Ira W. Snyder (devel@irasnyder.com)" +__license__ = "GNU GPL v2 (or, at your option, any later version)" + +# Join.py # -# This is a regular joined file type +# Copyright (C) 2006,2007 Ira W. Snyder (devel@irasnyder.com) # -# It will detect sets like the following: -# X.par2 -# X.vol0+1.par2 -# X.vol1+2.par2 -# X.001 -# X.002 -# X.003 +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. # -# Where the PAR2 files protect a file named X.avi (or similar). It will not -# work where the PAR2 files are protecting the .001, etc files directly. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. # +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +import re +import os +import logging +import PAR2Set.Base +import rsutil.common + def detector (name_files, prot_files): - return has_a_match ('^.*\.\d\d\d$', name_files) \ - and not has_a_match ('^.*\.\d\d\d$', prot_files) + """Detects a Join set""" + + return rsutil.common.has_a_match ('^.*\.\d\d\d$', name_files) \ + and not rsutil.common.has_a_match ('^.*\.\d\d\d$', prot_files) class Join (PAR2Set.Base.Base): + """Class for normal joined-file sets""" + def __repr__ (self): return 'JOIN' def find_joinfiles (self): - return find_matches ('^.*\.\d\d\d$', self.name_matched_files) + """Finds files which contain data to be joined together""" + + return rsutil.common.find_matches ('^.*\.\d\d\d$', self.name_matched_files) def runVerifyAndRepair (self): - PAR2_CMD = config_get_value ('commands', 'par2repair') + """Verify and Repair a PAR2Set. This version extends the PAR2Set.Base.Base + version by adding the datafiles to be joined at the end of the command + line. + + This is done using the par2repair command by default""" + + PAR2_CMD = rsutil.common.config_get_value ('commands', 'par2repair') # assemble the command # par2repair -- PAR2 PAR2_EXTRA [JOIN_FILES] @@ -48,33 +89,52 @@ class Join (PAR2Set.Base.Base): command += "\"%s\" " % os.path.split (f)[1] # run the command - ret = run_command (command, self.dir) + ret = rsutil.common.run_command (command, self.dir) # check the result if ret != 0: logging.critical ('PAR2 Check / Repair failed: %s' % self.p2file) - return -ECHECK + return -rsutil.common.ECHECK + + return rsutil.common.SUCCESS - return SUCCESS + def find_deleteable_files (self): + """Find all files which are deletable by using the regular expression from the + configuration file""" + + DELETE_REGEX = rsutil.common.config_get_value ('regular expressions', 'delete_regex') + dregex = re.compile (DELETE_REGEX, re.IGNORECASE) + + return [f for f in self.all_files if dregex.match (f) and \ + f not in self.prot_matched_files] def find_extraction_heads (self): + """Find the extraction heads. Since this should not be an extractable set, + we return the files which are protected directly by the PAR2 files.""" + return self.prot_matched_files def extraction_function (self, file, todir): - """Extract a single file of this type to the given directory""" + """Extract a single file of the Join type. + + file -- the file to extract + todir -- the directory to extract to + + This command ignores the extraction if file and todir+file are the same + file. This keeps things like mv working smoothly.""" - NOEXTRACT_CMD = config_get_value ('commands', 'noextract') + NOEXTRACT_CMD = rsutil.common.config_get_value ('commands', 'noextract') # Make sure that both files are not the same file. If they are, don't run at all. if os.path.samefile (file, os.path.join (todir, file)): - return SUCCESS + return rsutil.common.SUCCESS cmd = NOEXTRACT_CMD % (file, todir) - ret = run_command (cmd) + ret = rsutil.common.run_command (cmd) # Check error code if ret != 0: - return -EEXTRACT + return -rsutil.common.EEXTRACT - return SUCCESS + return rsutil.common.SUCCESS