|
1 """pyversioncheck - Module to help with checking versions""" |
|
2 import types |
|
3 import rfc822 |
|
4 import urllib |
|
5 import sys |
|
6 |
|
7 # Verbose options |
|
8 VERBOSE_SILENT=0 # Single-line reports per package |
|
9 VERBOSE_NORMAL=1 # Single-line reports per package, more info if outdated |
|
10 VERBOSE_EACHFILE=2 # Report on each URL checked |
|
11 VERBOSE_CHECKALL=3 # Check each URL for each package |
|
12 |
|
13 # Test directory |
|
14 ## urllib bug: _TESTDIR="ftp://ftp.cwi.nl/pub/jack/python/versiontestdir/" |
|
15 _TESTDIR="http://www.cwi.nl/~jack/versiontestdir/" |
|
16 |
|
17 def versioncheck(package, url, version, verbose=0): |
|
18 ok, newversion, fp = checkonly(package, url, version, verbose) |
|
19 if verbose > VERBOSE_NORMAL: |
|
20 return ok |
|
21 if ok < 0: |
|
22 print '%s: No correctly formatted current version file found'%(package) |
|
23 elif ok == 1: |
|
24 print '%s: up-to-date (version %s)'%(package, version) |
|
25 else: |
|
26 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) |
|
33 return ok |
|
34 |
|
35 def checkonly(package, url, version, verbose=0): |
|
36 if verbose >= VERBOSE_EACHFILE: |
|
37 print '%s:'%package |
|
38 if type(url) == types.StringType: |
|
39 ok, newversion, fp = _check1version(package, url, version, verbose) |
|
40 else: |
|
41 for u in url: |
|
42 ok, newversion, fp = _check1version(package, u, version, verbose) |
|
43 if ok >= 0 and verbose < VERBOSE_CHECKALL: |
|
44 break |
|
45 return ok, newversion, fp |
|
46 |
|
47 def _check1version(package, url, version, verbose=0): |
|
48 if verbose >= VERBOSE_EACHFILE: |
|
49 print ' Checking %s'%url |
|
50 try: |
|
51 fp = urllib.urlopen(url) |
|
52 except IOError, arg: |
|
53 if verbose >= VERBOSE_EACHFILE: |
|
54 print ' Cannot open:', arg |
|
55 return -1, None, None |
|
56 msg = rfc822.Message(fp, seekable=0) |
|
57 newversion = msg.getheader('current-version') |
|
58 if not newversion: |
|
59 if verbose >= VERBOSE_EACHFILE: |
|
60 print ' No "Current-Version:" header in URL or URL not found' |
|
61 return -1, None, None |
|
62 version = version.lower().strip() |
|
63 newversion = newversion.lower().strip() |
|
64 if version == newversion: |
|
65 if verbose >= VERBOSE_EACHFILE: |
|
66 print ' Version identical (%s)'%newversion |
|
67 return 1, version, fp |
|
68 else: |
|
69 if verbose >= VERBOSE_EACHFILE: |
|
70 print ' Versions different (installed: %s, new: %s)'% \ |
|
71 (version, newversion) |
|
72 return 0, newversion, fp |
|
73 |
|
74 |
|
75 def _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 |
|
97 if __name__ == '__main__': |
|
98 _test() |