Add Copyright / License information + Documentation
[rarslave2.git] / rarslave.py
old mode 100644 (file)
new mode 100755 (executable)
index a18e6a3..0d6a471
@@ -1,20 +1,53 @@
 #!/usr/bin/env python
-# vim: set ts=4 sts=4 sw=4 textwidth=112 :
+# vim: set ts=4 sts=4 sw=4 textwidth=92:
+
+"""
+The main program of the rarslave project.
+
+This handles all of the commandline, configuration file, and option
+work. It gets the environment set up for a run using the RarslaveDetector
+class.
+"""
+
+__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)"
+
+#    rarslave.py -- a usenet autorepair and autoextract utility
+#
+#    Copyright (C) 2006,2007  Ira W. Snyder (devel@irasnyder.com)
+#
+#    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.
+#
+#    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
 
 VERSION="2.0.0"
 PROGRAM="rarslave2"
 
 import os, sys, optparse, logging
+import rsutil
 import RarslaveDetector
-import RarslaveGlobals
-from RarslaveCommon import *
 
-# Global options from the RarslaveGlobals class
-options = RarslaveGlobals.options
-config = RarslaveGlobals.config
+# Global options from the rsutil.globals class
+options = rsutil.globals.options
+config = rsutil.globals.config
 
 # A tiny class to hold logging output until we're finished
 class DelayedLogger (object):
+
+       """A small class to hold logging output until the program is finished running.
+          It emulates sys.stdout in the needed ways for the logging module."""
+
        def __init__ (self, output=sys.stdout.write):
                self.__messages = []
                self.__output = output
@@ -39,22 +72,27 @@ class DelayedLogger (object):
 # A tiny class used to find unique PAR2 sets
 class CompareSet (object):
 
+       """A small class used to find unique PAR2 sets"""
+
        def __init__ (self, dir, p2file):
                self.dir = dir
                self.p2file = p2file
 
-               self.basename = get_basename (self.p2file)
-               self.name_matches = find_name_matches (self.dir, self.basename)
+               self.basename = rsutil.common.get_basename (self.p2file)
+               self.name_matches = rsutil.common.find_name_matches (self.dir, self.basename)
 
        def __eq__ (self, rhs):
                return (self.dir == rhs.dir) \
                                and (self.basename == rhs.basename) \
-                               and list_eq (self.name_matches, rhs.name_matches)
+                               and rsutil.common.list_eq (self.name_matches, rhs.name_matches)
 
 
 def find_all_par2_files (dir):
-       """Finds all par2 files in a directory"""
-       # NOTE: does NOT return absolute paths
+       """Finds all par2 files in the given directory.
+
+          dir -- the directory in which to search for PAR2 files
+
+          NOTE: does not return absolute paths"""
 
        if not os.path.isdir (os.path.abspath (dir)):
                raise ValueError # bad directory given
@@ -62,10 +100,12 @@ def find_all_par2_files (dir):
        dir = os.path.abspath (dir)
        files = os.listdir (dir)
 
-       return find_par2_files (files)
+       return rsutil.common.find_par2_files (files)
 
 def generate_all_parsets (dir):
-       # Generate all parsets in the given directory.
+       """Generate all parsets in the given directory
+
+          dir -- the directory in which to search"""
 
        assert os.path.isdir (dir) # Directory MUST be valid
 
@@ -85,13 +125,13 @@ def check_required_progs():
        shell_not_found = 32512
        needed = []
 
-       if run_command ('par2repair --help > /dev/null 2>&1') == shell_not_found:
+       if rsutil.common.run_command ('par2repair --help > /dev/null 2>&1') == shell_not_found:
                needed.append ('par2repair')
 
-       if run_command ('unrar --help > /dev/null 2>&1') == shell_not_found:
+       if rsutil.common.run_command ('unrar --help > /dev/null 2>&1') == shell_not_found:
                needed.append ('unrar')
 
-       if run_command ('unzip --help > /dev/null 2>&1') == shell_not_found:
+       if rsutil.common.run_command ('unzip --help > /dev/null 2>&1') == shell_not_found:
                needed.append ('unzip')
 
        if needed:
@@ -101,9 +141,11 @@ def check_required_progs():
                sys.exit(1)
 
 def run_options (options):
+       """Process all of the commandline options, doing thing such as printing the
+          version number, etc."""
 
        # Fix directories
-       options.work_dir = full_abspath (options.work_dir)
+       options.work_dir = rsutil.common.full_abspath (options.work_dir)
 
        # Make sure that the directory is valid
        if not os.path.isdir (options.work_dir):
@@ -113,7 +155,7 @@ def run_options (options):
                sys.exit (1)
 
        if options.extract_dir != None:
-               options.extract_dir = full_abspath (options.extract_dir)
+               options.extract_dir = rsutil.common.full_abspath (options.extract_dir)
 
        if options.version:
                print PROGRAM + ' - ' + VERSION
@@ -130,11 +172,14 @@ def run_options (options):
 
        if options.write_def_config:
                config.write_config (default=True)
+               sys.exit (0)
 
        if options.write_config:
                config.write_config ()
+               sys.exit (0)
 
 def find_loglevel (options):
+       """Find the log level that should be printed by the logging class"""
 
        loglevel = options.verbose - options.quiet
 
@@ -162,19 +207,16 @@ def main ():
 
        # Build the OptionParser
        parser = optparse.OptionParser()
-       parser.add_option('-n', '--not-recursive',
-                                               action='store_false', dest='recursive',
-                                               default=config_get_value('options', 'recursive'),
+       parser.add_option('-n', '--not-recursive', action='store_false', dest='recursive',
+                                               default=rsutil.common.config_get_value('options', 'recursive'),
                                                help="Don't run recursively")
 
-       parser.add_option('-d', '--work-dir',
-                                               dest='work_dir', type='string',
-                                               default=config_get_value('directories', 'working_directory'),
+       parser.add_option('-d', '--work-dir', dest='work_dir', type='string',
+                                               default=rsutil.common.config_get_value('directories', 'working_directory'),
                                                help="Start running at DIR", metavar='DIR')
 
-       parser.add_option('-e', '--extract-dir',
-                                               dest='extract_dir', type='string',
-                                               default=config_get_value('directories', 'extract_directory'),
+       parser.add_option('-e', '--extract-dir', dest='extract_dir', type='string',
+                                               default=rsutil.common.config_get_value('directories', 'extract_directory'),
                                                help="Extract to DIR", metavar='DIR')
 
        parser.add_option('-p', '--check-required-programs',
@@ -191,7 +233,7 @@ def main ():
                                                default=False, help="Write out the current config")
 
        parser.add_option('-i', '--interactive', dest='interactive', action='store_true',
-                                               default=config_get_value('options', 'interactive'),
+                                               default=rsutil.common.config_get_value('options', 'interactive'),
                                                help="Confirm before removing files")
 
        parser.add_option('-q', '--quiet', dest='quiet', action='count',
@@ -207,13 +249,13 @@ def main ():
 
        # Parse the given options
        global options
-       (RarslaveGlobals.options, args) = parser.parse_args()
-       options = RarslaveGlobals.options
+       (rsutil.globals.options, args) = parser.parse_args()
+       options = rsutil.globals.options
 
        # Run any special actions that are needed on these options
        run_options (options)
 
-       # Find the loglevel using the options given 
+       # Find the loglevel using the options given
        logging.getLogger().setLevel (find_loglevel (options))
 
        # Run recursively
@@ -233,7 +275,7 @@ def main ():
 
        # Print the results
        if logger.size () > 0:
-               print 'Log\n' + '=' * 80
+               print '\nLog\n' + '=' * 80
                logger.close ()
 
        # Done!