| """pyversioncheck - Module to help with checking versions""" |
| import urllib.request |
| import email |
| 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 isinstance(url, str): |
| 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.request.urlopen(url) |
| except IOError as arg: |
| if verbose >= VERBOSE_EACHFILE: |
| print(' Cannot open:', arg) |
| return -1, None, None |
| msg = email.message_from_file(fp) |
| newversion = msg.get('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() |