blob: 144665383e988073c7675193a9e46cdc66b3f029 [file] [log] [blame]
Guido van Rossum52910371997-12-23 18:43:55 +00001"""pyversioncheck - Module to help with checking versions"""
Guido van Rossum982209d1997-12-31 15:46:20 +00002import types
Guido van Rossum52910371997-12-23 18:43:55 +00003import rfc822
4import urllib
5import sys
Guido van Rossum52910371997-12-23 18:43:55 +00006
7# Verbose options
Martin v. Löwis23b44a32003-10-24 20:09:23 +00008VERBOSE_SILENT=0 # Single-line reports per package
9VERBOSE_NORMAL=1 # Single-line reports per package, more info if outdated
10VERBOSE_EACHFILE=2 # Report on each URL checked
11VERBOSE_CHECKALL=3 # Check each URL for each package
Guido van Rossum52910371997-12-23 18:43:55 +000012
13# Test directory
14## urllib bug: _TESTDIR="ftp://ftp.cwi.nl/pub/jack/python/versiontestdir/"
15_TESTDIR="http://www.cwi.nl/~jack/versiontestdir/"
16
17def versioncheck(package, url, version, verbose=0):
18 ok, newversion, fp = checkonly(package, url, version, verbose)
19 if verbose > VERBOSE_NORMAL:
Guido van Rossume4e41061998-04-06 14:20:27 +000020 return ok
Guido van Rossum52910371997-12-23 18:43:55 +000021 if ok < 0:
Guido van Rossume4e41061998-04-06 14:20:27 +000022 print '%s: No correctly formatted current version file found'%(package)
Guido van Rossum52910371997-12-23 18:43:55 +000023 elif ok == 1:
Guido van Rossume4e41061998-04-06 14:20:27 +000024 print '%s: up-to-date (version %s)'%(package, version)
Guido van Rossum52910371997-12-23 18:43:55 +000025 else:
Guido van Rossume4e41061998-04-06 14:20:27 +000026 print '%s: version %s installed, version %s found:' % \
27 (package, version, newversion)
28 if verbose > VERBOSE_SILENT:
29 while 1:
30 line = fp.readline()
31 if not line: break
32 sys.stdout.write('\t'+line)
Guido van Rossum52910371997-12-23 18:43:55 +000033 return ok
Guido van Rossume4e41061998-04-06 14:20:27 +000034
Guido van Rossum52910371997-12-23 18:43:55 +000035def checkonly(package, url, version, verbose=0):
36 if verbose >= VERBOSE_EACHFILE:
Guido van Rossume4e41061998-04-06 14:20:27 +000037 print '%s:'%package
Guido van Rossum982209d1997-12-31 15:46:20 +000038 if type(url) == types.StringType:
Guido van Rossume4e41061998-04-06 14:20:27 +000039 ok, newversion, fp = _check1version(package, url, version, verbose)
Guido van Rossum52910371997-12-23 18:43:55 +000040 else:
Guido van Rossume4e41061998-04-06 14:20:27 +000041 for u in url:
42 ok, newversion, fp = _check1version(package, u, version, verbose)
43 if ok >= 0 and verbose < VERBOSE_CHECKALL:
44 break
Guido van Rossum52910371997-12-23 18:43:55 +000045 return ok, newversion, fp
Guido van Rossume4e41061998-04-06 14:20:27 +000046
Guido van Rossum52910371997-12-23 18:43:55 +000047def _check1version(package, url, version, verbose=0):
48 if verbose >= VERBOSE_EACHFILE:
Guido van Rossume4e41061998-04-06 14:20:27 +000049 print ' Checking %s'%url
Guido van Rossum52910371997-12-23 18:43:55 +000050 try:
Guido van Rossume4e41061998-04-06 14:20:27 +000051 fp = urllib.urlopen(url)
Guido van Rossum52910371997-12-23 18:43:55 +000052 except IOError, arg:
Guido van Rossume4e41061998-04-06 14:20:27 +000053 if verbose >= VERBOSE_EACHFILE:
54 print ' Cannot open:', arg
55 return -1, None, None
Guido van Rossum52910371997-12-23 18:43:55 +000056 msg = rfc822.Message(fp, seekable=0)
57 newversion = msg.getheader('current-version')
58 if not newversion:
Guido van Rossume4e41061998-04-06 14:20:27 +000059 if verbose >= VERBOSE_EACHFILE:
60 print ' No "Current-Version:" header in URL or URL not found'
61 return -1, None, None
Walter Dörwaldaaab30e2002-09-11 20:36:02 +000062 version = version.lower().strip()
63 newversion = newversion.lower().strip()
Guido van Rossum52910371997-12-23 18:43:55 +000064 if version == newversion:
Guido van Rossume4e41061998-04-06 14:20:27 +000065 if verbose >= VERBOSE_EACHFILE:
66 print ' Version identical (%s)'%newversion
67 return 1, version, fp
Guido van Rossum52910371997-12-23 18:43:55 +000068 else:
Guido van Rossume4e41061998-04-06 14:20:27 +000069 if verbose >= VERBOSE_EACHFILE:
70 print ' Versions different (installed: %s, new: %s)'% \
71 (version, newversion)
72 return 0, newversion, fp
73
74
Guido van Rossum52910371997-12-23 18:43:55 +000075def _test():
76 print '--- TEST VERBOSE=1'
77 print '--- Testing existing and identical version file'
78 versioncheck('VersionTestPackage', _TESTDIR+'Version10.txt', '1.0', verbose=1)
79 print '--- Testing existing package with new version'
80 versioncheck('VersionTestPackage', _TESTDIR+'Version11.txt', '1.0', verbose=1)
81 print '--- Testing package with non-existing version file'
82 versioncheck('VersionTestPackage', _TESTDIR+'nonexistent.txt', '1.0', verbose=1)
83 print '--- Test package with 2 locations, first non-existing second ok'
84 versfiles = [_TESTDIR+'nonexistent.txt', _TESTDIR+'Version10.txt']
85 versioncheck('VersionTestPackage', versfiles, '1.0', verbose=1)
86 print '--- TEST VERBOSE=2'
87 print '--- Testing existing and identical version file'
88 versioncheck('VersionTestPackage', _TESTDIR+'Version10.txt', '1.0', verbose=2)
89 print '--- Testing existing package with new version'
90 versioncheck('VersionTestPackage', _TESTDIR+'Version11.txt', '1.0', verbose=2)
91 print '--- Testing package with non-existing version file'
92 versioncheck('VersionTestPackage', _TESTDIR+'nonexistent.txt', '1.0', verbose=2)
93 print '--- Test package with 2 locations, first non-existing second ok'
94 versfiles = [_TESTDIR+'nonexistent.txt', _TESTDIR+'Version10.txt']
95 versioncheck('VersionTestPackage', versfiles, '1.0', verbose=2)
96
97if __name__ == '__main__':
Guido van Rossume4e41061998-04-06 14:20:27 +000098 _test()