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