"""Checkversions - recursively search a directory (default: sys.prefix) 
for _checkversion.py files, and run each of them. This will tell you of
new versions available for any packages you have installed."""

import os
import getopt
import sys
import pyversioncheck

CHECKNAME="_checkversion.py"

VERBOSE=1

USAGE="""Usage: checkversions [-v verboselevel] [dir ...]
Recursively examine a tree (default: sys.prefix) and for each package
with a _checkversion.py file compare the installed version against the current
version.

Values for verboselevel:
0 - Minimal output, one line per package
1 - Also print descriptions for outdated packages (default)
2 - Print information on each URL checked
3 - Check every URL for packages with multiple locations"""

def check1dir(dummy, dir, files):
    if CHECKNAME in files:
        fullname = os.path.join(dir, CHECKNAME)
        try:
            execfile(fullname)
        except:
            print '** Exception in', fullname
            
def walk1tree(tree):
    os.path.walk(tree, check1dir, None)

def main():
    global VERBOSE
    try:
        options, arguments = getopt.getopt(sys.argv[1:], 'v:')
    except getopt.error:
        print USAGE
        sys.exit(1)
    for o, a in options:
        if o == '-v':
            VERBOSE = int(a)
    if not arguments:
        arguments = [sys.prefix]
    for dir in arguments:
        walk1tree(dir)

if __name__ == '__main__':
    main()


