cinap_lenrekadd hg and python4bb9e2215 years agoHistory
98 lines · 4.0 KB · Python
RawDownload
"""pyversioncheck - Module to help with checking versions"""import typesimport rfc822import urllibimport sys # Verbose optionsVERBOSE_SILENT=0        # Single-line reports per packageVERBOSE_NORMAL=1        # Single-line reports per package, more info if outdatedVERBOSE_EACHFILE=2      # Report on each URL checkedVERBOSE_CHECKALL=3      # Check each URL for each package # Test directory## urllib bug: _TESTDIR="ftp://ftp.cwi.nl/pub/jack/python/versiontestdir/"_TESTDIR="http://www.cwi.nl/~jack/versiontestdir/" def versioncheck(package, url, version, verbose=0):    ok, newversion, fp = checkonly(package, url, version, verbose)    if verbose > VERBOSE_NORMAL:        return ok    if ok < 0:        print '%s: No correctly formatted current version file found'%(package)    elif ok == 1:        print '%s: up-to-date (version %s)'%(package, version)    else:        print '%s: version %s installed, version %s found:' % \                        (package, version, newversion)        if verbose > VERBOSE_SILENT:            while 1:                line = fp.readline()                if not line: break                sys.stdout.write('\t'+line)    return ok def checkonly(package, url, version, verbose=0):    if verbose >= VERBOSE_EACHFILE:        print '%s:'%package    if type(url) == types.StringType:        ok, newversion, fp = _check1version(package, url, version, verbose)    else:        for u in url:            ok, newversion, fp = _check1version(package, u, version, verbose)            if ok >= 0 and verbose < VERBOSE_CHECKALL:                break    return ok, newversion, fp def _check1version(package, url, version, verbose=0):    if verbose >= VERBOSE_EACHFILE:        print '  Checking %s'%url    try:        fp = urllib.urlopen(url)    except IOError, arg:        if verbose >= VERBOSE_EACHFILE:            print '    Cannot open:', arg        return -1, None, None    msg = rfc822.Message(fp, seekable=0)    newversion = msg.getheader('current-version')    if not newversion:        if verbose >= VERBOSE_EACHFILE:            print '    No "Current-Version:" header in URL or URL not found'        return -1, None, None    version = version.lower().strip()    newversion = newversion.lower().strip()    if version == newversion:        if verbose >= VERBOSE_EACHFILE:            print '    Version identical (%s)'%newversion        return 1, version, fp    else:        if verbose >= VERBOSE_EACHFILE:            print '    Versions different (installed: %s, new: %s)'% \                        (version, newversion)        return 0, newversion, fp  def _test():    print '--- TEST VERBOSE=1'    print '--- Testing existing and identical version file'    versioncheck('VersionTestPackage', _TESTDIR+'Version10.txt', '1.0', verbose=1)    print '--- Testing existing package with new version'    versioncheck('VersionTestPackage', _TESTDIR+'Version11.txt', '1.0', verbose=1)    print '--- Testing package with non-existing version file'    versioncheck('VersionTestPackage', _TESTDIR+'nonexistent.txt', '1.0', verbose=1)    print '--- Test package with 2 locations, first non-existing second ok'    versfiles = [_TESTDIR+'nonexistent.txt', _TESTDIR+'Version10.txt']    versioncheck('VersionTestPackage', versfiles, '1.0', verbose=1)    print '--- TEST VERBOSE=2'    print '--- Testing existing and identical version file'    versioncheck('VersionTestPackage', _TESTDIR+'Version10.txt', '1.0', verbose=2)    print '--- Testing existing package with new version'    versioncheck('VersionTestPackage', _TESTDIR+'Version11.txt', '1.0', verbose=2)    print '--- Testing package with non-existing version file'    versioncheck('VersionTestPackage', _TESTDIR+'nonexistent.txt', '1.0', verbose=2)    print '--- Test package with 2 locations, first non-existing second ok'    versfiles = [_TESTDIR+'nonexistent.txt', _TESTDIR+'Version10.txt']    versioncheck('VersionTestPackage', versfiles, '1.0', verbose=2) if __name__ == '__main__':    _test()