#!/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
# 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
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
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:
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):
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
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
# 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',
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',
# 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
# Print the results
if logger.size () > 0:
- print 'Log\n' + '=' * 80
+ print '\nLog\n' + '=' * 80
logger.close ()
# Done!