# -*- python -*-
#
# Copyright (C) 1998 by the Free Software Foundation, Inc.
#
# 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.

"""Start interacting with a mailing list.

This is useful for playing with a list from Python's interactive interpreter.
Run this script as follows:

%% python -i bin/withlist [options] listname

This will load the list object named by <listname> into an object called `m'
in the global namespace.  It also loads the class MailList into the global
namespace.

Options:

    -l
    --lock
        Lock the list when opening.  Normally the list is opened unlocked
        (e.g. for read-only operations).  You can always lock the file after
        the fact by typing `m.Lock()'

    --run [module.]callable
    -r [module.]callable
        This can be used to run a script with the opened MailList object.
        This works by attempting to import `module' (which must already be
        accessible on your sys.path), and then calling `callable' from the
        module.  callable can be a class or function; it is called with a
        single argument, the MailList object.

        Note that `module.' is optional; if it is omitted then a module with
        the name `callable' will be imported.

        The global variable `r' will be set to the results of this call.

    --help
    -h
        Print this message and exit

"""

import sys
import getopt
import string
import paths
from Mailman.MailList import MailList

m = None
r = None


def usage(msg='', code=1):
    print __doc__ % globals()
    if msg:
        print msg
    sys.exit(code)



def main():
    global m
    global r
    try:
        opts, args = getopt.getopt(sys.argv[1:], 'hlr:',
                                   ['help', 'lock', 'run='])
    except getopt.error, m:
        usage(m)

    if len(args) <> 1:
        usage('No list name supplied.')

    listname = args[0]
    lock = 0
    run = None

    for opt, arg in opts:
        if opt in ('-h', '--help'):
            usage(code=0)
        elif opt in ('-l', '--lock'):
            lock = 1
        elif opt in ('-r', '--run'):
            run = arg

    # first try to open mailing list
    print 'Loading list:', listname,
    if lock: print '(locked)'
    else: print '(unlocked)'

    m = MailList(listname, lock=lock)

    # try to import the module and run the callable
    if run:
        i = string.find(run, '.')
        if i < 0:
            module = run
            callable = run
        else:
            module = run[:i]
            callable = run[i+1:]
        print 'Importing', module, '...'
        mod = __import__(module)
        print 'Running %s.%s()' % (module, callable), '...'
        r = getattr(mod, callable)(m)

main()
