/Tools/versioncheck/pyversioncheck.py

http://unladen-swallow.googlecode.com/ · Python · 98 lines · 86 code · 8 blank · 4 comment · 24 complexity · 625182e81f29beff0932febf49a5eb25 MD5 · raw file

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