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