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