99 lines
4 KiB
Python
99 lines
4 KiB
Python
|
"""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()
|