"""pyversioncheck - Module to help with checking versions"""
import Types
import rfc822
import urllib
import sys
import string

# 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 = string.strip(string.lower(version))
    newversion = string.strip(string.lower(newversion))
    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()
	
    
