"""pyversioncheck - Module to help with checking versions"""
import types
import rfc822
import urllib
import sys

# Verbose options
VERBOSE_SILENT=0        # Single-line reports per package
VERBOSE_NORMAL=1        # Single-line reports per package, more info if outdated
VERBOSE_EACHFILE=2      # Report on each URL checked
VERBOSE_CHECKALL=3      # Check each URL for each package

# Test directory
## urllib bug: _TESTDIR="ftp://ftp.cwi.nl/pub/jack/python/versiontestdir/"
_TESTDIR="http://www.cwi.nl/~jack/versiontestdir/"

def versioncheck(package, url, version, verbose=0):
    ok, newversion, fp = checkonly(package, url, version, verbose)
    if verbose > VERBOSE_NORMAL:
        return ok
    if ok < 0:
        print '%s: No correctly formatted current version file found'%(package)
    elif ok == 1:
        print '%s: up-to-date (version %s)'%(package, version)
    else:
        print '%s: version %s installed, version %s found:' % \
                        (package, version, newversion)
        if verbose > VERBOSE_SILENT:
            while 1:
                line = fp.readline()
                if not line: break
                sys.stdout.write('\t'+line)
    return ok

def checkonly(package, url, version, verbose=0):
    if verbose >= VERBOSE_EACHFILE:
        print '%s:'%package
    if type(url) == types.StringType:
        ok, newversion, fp = _check1version(package, url, version, verbose)
    else:
        for u in url:
            ok, newversion, fp = _check1version(package, u, version, verbose)
            if ok >= 0 and verbose < VERBOSE_CHECKALL:
                break
    return ok, newversion, fp

def _check1version(package, url, version, verbose=0):
    if verbose >= VERBOSE_EACHFILE:
        print '  Checking %s'%url
    try:
        fp = urllib.urlopen(url)
    except IOError, arg:
        if verbose >= VERBOSE_EACHFILE:
            print '    Cannot open:', arg
        return -1, None, None
    msg = rfc822.Message(fp, seekable=0)
    newversion = msg.getheader('current-version')
    if not newversion:
        if verbose >= VERBOSE_EACHFILE:
            print '    No "Current-Version:" header in URL or URL not found'
        return -1, None, None
    version = version.lower().strip()
    newversion = newversion.lower().strip()
    if version == newversion:
        if verbose >= VERBOSE_EACHFILE:
            print '    Version identical (%s)'%newversion
        return 1, version, fp
    else:
        if verbose >= VERBOSE_EACHFILE:
            print '    Versions different (installed: %s, new: %s)'% \
                        (version, newversion)
        return 0, newversion, fp


def _test():
    print '--- TEST VERBOSE=1'
    print '--- Testing existing and identical version file'
    versioncheck('VersionTestPackage', _TESTDIR+'Version10.txt', '1.0', verbose=1)
    print '--- Testing existing package with new version'
    versioncheck('VersionTestPackage', _TESTDIR+'Version11.txt', '1.0', verbose=1)
    print '--- Testing package with non-existing version file'
    versioncheck('VersionTestPackage', _TESTDIR+'nonexistent.txt', '1.0', verbose=1)
    print '--- Test package with 2 locations, first non-existing second ok'
    versfiles = [_TESTDIR+'nonexistent.txt', _TESTDIR+'Version10.txt']
    versioncheck('VersionTestPackage', versfiles, '1.0', verbose=1)
    print '--- TEST VERBOSE=2'
    print '--- Testing existing and identical version file'
    versioncheck('VersionTestPackage', _TESTDIR+'Version10.txt', '1.0', verbose=2)
    print '--- Testing existing package with new version'
    versioncheck('VersionTestPackage', _TESTDIR+'Version11.txt', '1.0', verbose=2)
    print '--- Testing package with non-existing version file'
    versioncheck('VersionTestPackage', _TESTDIR+'nonexistent.txt', '1.0', verbose=2)
    print '--- Test package with 2 locations, first non-existing second ok'
    versfiles = [_TESTDIR+'nonexistent.txt', _TESTDIR+'Version10.txt']
    versioncheck('VersionTestPackage', versfiles, '1.0', verbose=2)

if __name__ == '__main__':
    _test()
