home *** CD-ROM | disk | FTP | other *** search
/ H4CK3R 14 / hacker14.iso / programacao / pythonwin / python.exe / PYVERSIONCHECK.PY < prev    next >
Encoding:
Python Source  |  2002-09-11  |  4.0 KB  |  101 lines

  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()
  99.     
  100.     
  101.