blob: b6e50d318c04854bfc0968f50379748275d33862 [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
6import string
7
8# Verbose options
9VERBOSE_SILENT=0 # Single-line reports per package
10VERBOSE_NORMAL=1 # Single-line reports per package, more info if outdated
11VERBOSE_EACHFILE=2 # Report on each URL checked
12VERBOSE_CHECKALL=3 # Check each URL for each package
13
14# Test directory
15## urllib bug: _TESTDIR="ftp://ftp.cwi.nl/pub/jack/python/versiontestdir/"
16_TESTDIR="http://www.cwi.nl/~jack/versiontestdir/"
17
18def versioncheck(package, url, version, verbose=0):
19 ok, newversion, fp = checkonly(package, url, version, verbose)
20 if verbose > VERBOSE_NORMAL:
Guido van Rossume4e41061998-04-06 14:20:27 +000021 return ok
Guido van Rossum52910371997-12-23 18:43:55 +000022 if ok < 0:
Guido van Rossume4e41061998-04-06 14:20:27 +000023 print '%s: No correctly formatted current version file found'%(package)
Guido van Rossum52910371997-12-23 18:43:55 +000024 elif ok == 1:
Guido van Rossume4e41061998-04-06 14:20:27 +000025 print '%s: up-to-date (version %s)'%(package, version)
Guido van Rossum52910371997-12-23 18:43:55 +000026 else:
Guido van Rossume4e41061998-04-06 14:20:27 +000027 print '%s: version %s installed, version %s found:' % \
28 (package, version, newversion)
29 if verbose > VERBOSE_SILENT:
30 while 1:
31 line = fp.readline()
32 if not line: break
33 sys.stdout.write('\t'+line)
Guido van Rossum52910371997-12-23 18:43:55 +000034 return ok
Guido van Rossume4e41061998-04-06 14:20:27 +000035
Guido van Rossum52910371997-12-23 18:43:55 +000036def checkonly(package, url, version, verbose=0):
37 if verbose >= VERBOSE_EACHFILE:
Guido van Rossume4e41061998-04-06 14:20:27 +000038 print '%s:'%package
Guido van Rossum982209d1997-12-31 15:46:20 +000039 if type(url) == types.StringType:
Guido van Rossume4e41061998-04-06 14:20:27 +000040 ok, newversion, fp = _check1version(package, url, version, verbose)
Guido van Rossum52910371997-12-23 18:43:55 +000041 else:
Guido van Rossume4e41061998-04-06 14:20:27 +000042 for u in url:
43 ok, newversion, fp = _check1version(package, u, version, verbose)
44 if ok >= 0 and verbose < VERBOSE_CHECKALL:
45 break
Guido van Rossum52910371997-12-23 18:43:55 +000046 return ok, newversion, fp
Guido van Rossume4e41061998-04-06 14:20:27 +000047
Guido van Rossum52910371997-12-23 18:43:55 +000048def _check1version(package, url, version, verbose=0):
49 if verbose >= VERBOSE_EACHFILE:
Guido van Rossume4e41061998-04-06 14:20:27 +000050 print ' Checking %s'%url
Guido van Rossum52910371997-12-23 18:43:55 +000051 try:
Guido van Rossume4e41061998-04-06 14:20:27 +000052 fp = urllib.urlopen(url)
Guido van Rossum52910371997-12-23 18:43:55 +000053 except IOError, arg:
Guido van Rossume4e41061998-04-06 14:20:27 +000054 if verbose >= VERBOSE_EACHFILE:
55 print ' Cannot open:', arg
56 return -1, None, None
Guido van Rossum52910371997-12-23 18:43:55 +000057 msg = rfc822.Message(fp, seekable=0)
58 newversion = msg.getheader('current-version')
59 if not newversion:
Guido van Rossume4e41061998-04-06 14:20:27 +000060 if verbose >= VERBOSE_EACHFILE:
61 print ' No "Current-Version:" header in URL or URL not found'
62 return -1, None, None
Guido van Rossum52910371997-12-23 18:43:55 +000063 version = string.strip(string.lower(version))
64 newversion = string.strip(string.lower(newversion))
65 if version == newversion:
Guido van Rossume4e41061998-04-06 14:20:27 +000066 if verbose >= VERBOSE_EACHFILE:
67 print ' Version identical (%s)'%newversion
68 return 1, version, fp
Guido van Rossum52910371997-12-23 18:43:55 +000069 else:
Guido van Rossume4e41061998-04-06 14:20:27 +000070 if verbose >= VERBOSE_EACHFILE:
71 print ' Versions different (installed: %s, new: %s)'% \
72 (version, newversion)
73 return 0, newversion, fp
74
75
Guido van Rossum52910371997-12-23 18:43:55 +000076def _test():
77 print '--- TEST VERBOSE=1'
78 print '--- Testing existing and identical version file'
79 versioncheck('VersionTestPackage', _TESTDIR+'Version10.txt', '1.0', verbose=1)
80 print '--- Testing existing package with new version'
81 versioncheck('VersionTestPackage', _TESTDIR+'Version11.txt', '1.0', verbose=1)
82 print '--- Testing package with non-existing version file'
83 versioncheck('VersionTestPackage', _TESTDIR+'nonexistent.txt', '1.0', verbose=1)
84 print '--- Test package with 2 locations, first non-existing second ok'
85 versfiles = [_TESTDIR+'nonexistent.txt', _TESTDIR+'Version10.txt']
86 versioncheck('VersionTestPackage', versfiles, '1.0', verbose=1)
87 print '--- TEST VERBOSE=2'
88 print '--- Testing existing and identical version file'
89 versioncheck('VersionTestPackage', _TESTDIR+'Version10.txt', '1.0', verbose=2)
90 print '--- Testing existing package with new version'
91 versioncheck('VersionTestPackage', _TESTDIR+'Version11.txt', '1.0', verbose=2)
92 print '--- Testing package with non-existing version file'
93 versioncheck('VersionTestPackage', _TESTDIR+'nonexistent.txt', '1.0', verbose=2)
94 print '--- Test package with 2 locations, first non-existing second ok'
95 versfiles = [_TESTDIR+'nonexistent.txt', _TESTDIR+'Version10.txt']
96 versioncheck('VersionTestPackage', versfiles, '1.0', verbose=2)
97
98if __name__ == '__main__':
Guido van Rossume4e41061998-04-06 14:20:27 +000099 _test()
Guido van Rossum52910371997-12-23 18:43:55 +0000100
101