VMM/common: improved version_hex() in order to convert also
alpha, beta and release candidate versions.
# -*- coding: UTF-8 -*-# Copyright (c) 2010, Pascal Volk# See COPYING for distribution information.""" VirtualMailManager.common Some common functions"""importosimportrefromVirtualMailManagerimportENCODINGfromVirtualMailManager.constants.ERRORimport \NOT_EXECUTABLE,NO_SUCH_BINARY,NO_SUCH_DIRECTORYfromVirtualMailManager.errorsimportVMMError_=lambdamsg:msgdefexpand_path(path):"""Expands paths, starting with ``.`` or ``~``, to an absolute path."""ifpath.startswith('.'):returnos.path.abspath(path)ifpath.startswith('~'):returnos.path.expanduser(path)returnpathdefget_unicode(string):"""Converts `string` to `unicode`, if necessary."""ifisinstance(string,unicode):returnstringreturnunicode(string,ENCODING,'replace')defis_dir(path):"""Checks if `path` is a directory. Throws a `VMMError` if `path` is not a directory. """path=expand_path(path)ifnotos.path.isdir(path):raiseVMMError(_(u"'%s' is not a directory")%get_unicode(path),NO_SUCH_DIRECTORY)returnpathdefexec_ok(binary):"""Checks if the `binary` exists and if it is executable. Throws a `VMMError` if the `binary` isn't a file or is not executable. """binary=expand_path(binary)ifnotos.path.isfile(binary):raiseVMMError(_(u"'%s' is not a file")%get_unicode(binary),NO_SUCH_BINARY)ifnotos.access(binary,os.X_OK):raiseVMMError(_(u"File is not executable: '%s'")%get_unicode(binary),NOT_EXECUTABLE)returnbinarydefversion_hex(version_string):"""Convert a Dovecot version, e.g.: '1.2.3' or '2.0.beta4', to an int. Returns 0 if the *version_string* has the wrong™ format. version_hex('1.2.3') -> 16909296 hex(version_hex('1.2.3')) -> '0x10203f0' """version=0version_re=r'^(\d+)\.(\d+)\.(?:(\d+)|(alpha|beta|rc)(\d+))$'version_level=dict(alpha=0xA,beta=0xB,rc=0xC)version_mo=re.match(version_re,version_string)ifversion_mo:major,minor,patch,level,serial=version_mo.groups()version+=int(major)<<24version+=int(minor)<<16ifpatch:version+=int(patch)<<8version+=version_level.get(level,0xF)<<4ifserial:version+=int(serial)returnversiondel_