]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/python/contrib/Tools/versioncheck/pyversioncheck.py
Inital import
[l4.git] / l4 / pkg / python / contrib / Tools / versioncheck / pyversioncheck.py
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()