"""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()
