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