]>
Commit | Line | Data |
---|---|---|
4710c53d | 1 | """pyversioncheck - Module to help with checking versions"""\r |
2 | import types\r | |
3 | import rfc822\r | |
4 | import urllib\r | |
5 | import sys\r | |
6 | \r | |
7 | # Verbose options\r | |
8 | VERBOSE_SILENT=0 # Single-line reports per package\r | |
9 | VERBOSE_NORMAL=1 # Single-line reports per package, more info if outdated\r | |
10 | VERBOSE_EACHFILE=2 # Report on each URL checked\r | |
11 | VERBOSE_CHECKALL=3 # Check each URL for each package\r | |
12 | \r | |
13 | # Test directory\r | |
14 | ## urllib bug: _TESTDIR="ftp://ftp.cwi.nl/pub/jack/python/versiontestdir/"\r | |
15 | _TESTDIR="http://www.cwi.nl/~jack/versiontestdir/"\r | |
16 | \r | |
17 | def versioncheck(package, url, version, verbose=0):\r | |
18 | ok, newversion, fp = checkonly(package, url, version, verbose)\r | |
19 | if verbose > VERBOSE_NORMAL:\r | |
20 | return ok\r | |
21 | if ok < 0:\r | |
22 | print '%s: No correctly formatted current version file found'%(package)\r | |
23 | elif ok == 1:\r | |
24 | print '%s: up-to-date (version %s)'%(package, version)\r | |
25 | else:\r | |
26 | print '%s: version %s installed, version %s found:' % \\r | |
27 | (package, version, newversion)\r | |
28 | if verbose > VERBOSE_SILENT:\r | |
29 | while 1:\r | |
30 | line = fp.readline()\r | |
31 | if not line: break\r | |
32 | sys.stdout.write('\t'+line)\r | |
33 | return ok\r | |
34 | \r | |
35 | def checkonly(package, url, version, verbose=0):\r | |
36 | if verbose >= VERBOSE_EACHFILE:\r | |
37 | print '%s:'%package\r | |
38 | if type(url) == types.StringType:\r | |
39 | ok, newversion, fp = _check1version(package, url, version, verbose)\r | |
40 | else:\r | |
41 | for u in url:\r | |
42 | ok, newversion, fp = _check1version(package, u, version, verbose)\r | |
43 | if ok >= 0 and verbose < VERBOSE_CHECKALL:\r | |
44 | break\r | |
45 | return ok, newversion, fp\r | |
46 | \r | |
47 | def _check1version(package, url, version, verbose=0):\r | |
48 | if verbose >= VERBOSE_EACHFILE:\r | |
49 | print ' Checking %s'%url\r | |
50 | try:\r | |
51 | fp = urllib.urlopen(url)\r | |
52 | except IOError, arg:\r | |
53 | if verbose >= VERBOSE_EACHFILE:\r | |
54 | print ' Cannot open:', arg\r | |
55 | return -1, None, None\r | |
56 | msg = rfc822.Message(fp, seekable=0)\r | |
57 | newversion = msg.getheader('current-version')\r | |
58 | if not newversion:\r | |
59 | if verbose >= VERBOSE_EACHFILE:\r | |
60 | print ' No "Current-Version:" header in URL or URL not found'\r | |
61 | return -1, None, None\r | |
62 | version = version.lower().strip()\r | |
63 | newversion = newversion.lower().strip()\r | |
64 | if version == newversion:\r | |
65 | if verbose >= VERBOSE_EACHFILE:\r | |
66 | print ' Version identical (%s)'%newversion\r | |
67 | return 1, version, fp\r | |
68 | else:\r | |
69 | if verbose >= VERBOSE_EACHFILE:\r | |
70 | print ' Versions different (installed: %s, new: %s)'% \\r | |
71 | (version, newversion)\r | |
72 | return 0, newversion, fp\r | |
73 | \r | |
74 | \r | |
75 | def _test():\r | |
76 | print '--- TEST VERBOSE=1'\r | |
77 | print '--- Testing existing and identical version file'\r | |
78 | versioncheck('VersionTestPackage', _TESTDIR+'Version10.txt', '1.0', verbose=1)\r | |
79 | print '--- Testing existing package with new version'\r | |
80 | versioncheck('VersionTestPackage', _TESTDIR+'Version11.txt', '1.0', verbose=1)\r | |
81 | print '--- Testing package with non-existing version file'\r | |
82 | versioncheck('VersionTestPackage', _TESTDIR+'nonexistent.txt', '1.0', verbose=1)\r | |
83 | print '--- Test package with 2 locations, first non-existing second ok'\r | |
84 | versfiles = [_TESTDIR+'nonexistent.txt', _TESTDIR+'Version10.txt']\r | |
85 | versioncheck('VersionTestPackage', versfiles, '1.0', verbose=1)\r | |
86 | print '--- TEST VERBOSE=2'\r | |
87 | print '--- Testing existing and identical version file'\r | |
88 | versioncheck('VersionTestPackage', _TESTDIR+'Version10.txt', '1.0', verbose=2)\r | |
89 | print '--- Testing existing package with new version'\r | |
90 | versioncheck('VersionTestPackage', _TESTDIR+'Version11.txt', '1.0', verbose=2)\r | |
91 | print '--- Testing package with non-existing version file'\r | |
92 | versioncheck('VersionTestPackage', _TESTDIR+'nonexistent.txt', '1.0', verbose=2)\r | |
93 | print '--- Test package with 2 locations, first non-existing second ok'\r | |
94 | versfiles = [_TESTDIR+'nonexistent.txt', _TESTDIR+'Version10.txt']\r | |
95 | versioncheck('VersionTestPackage', versfiles, '1.0', verbose=2)\r | |
96 | \r | |
97 | if __name__ == '__main__':\r | |
98 | _test()\r |