mirror of
https://github.com/saltstack/salt.git
synced 2025-04-17 10:10:20 +00:00
Merge pull request #34531 from terminalmage/issue34397
Support ignore_epoch argument in version comparisons
This commit is contained in:
commit
91e0656d44
7 changed files with 65 additions and 20 deletions
|
@ -1263,21 +1263,27 @@ def upgrade_available(name):
|
|||
return latest_version(name) != ''
|
||||
|
||||
|
||||
def version_cmp(pkg1, pkg2):
|
||||
def version_cmp(pkg1, pkg2, ignore_epoch=False):
|
||||
'''
|
||||
Do a cmp-style comparison on two packages. Return -1 if pkg1 < pkg2, 0 if
|
||||
pkg1 == pkg2, and 1 if pkg1 > pkg2. Return None if there was a problem
|
||||
making the comparison.
|
||||
|
||||
ignore_epoch : False
|
||||
Set to ``True`` to ignore the epoch when comparing versions
|
||||
|
||||
.. versionadded:: 2015.8.10,2016.3.2
|
||||
|
||||
CLI Example:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
salt '*' pkg.version_cmp '0.2.4-0ubuntu1' '0.2.4.1-0ubuntu1'
|
||||
'''
|
||||
normalize = lambda x: str(x).split(':', 1)[-1] if ignore_epoch else str(x)
|
||||
# both apt_pkg.version_compare and _cmd_quote need string arguments.
|
||||
pkg1 = str(pkg1)
|
||||
pkg2 = str(pkg2)
|
||||
pkg1 = normalize(pkg1)
|
||||
pkg2 = normalize(pkg2)
|
||||
|
||||
# if we have apt_pkg, this will be quickier this way
|
||||
# and also do not rely on shell.
|
||||
|
|
|
@ -953,7 +953,7 @@ def depclean(name=None, slot=None, fromrepo=None, pkgs=None):
|
|||
return salt.utils.compare_dicts(old, new)
|
||||
|
||||
|
||||
def version_cmp(pkg1, pkg2):
|
||||
def version_cmp(pkg1, pkg2, **kwargs):
|
||||
'''
|
||||
Do a cmp-style comparison on two packages. Return -1 if pkg1 < pkg2, 0 if
|
||||
pkg1 == pkg2, and 1 if pkg1 > pkg2. Return None if there was a problem
|
||||
|
@ -965,6 +965,16 @@ def version_cmp(pkg1, pkg2):
|
|||
|
||||
salt '*' pkg.version_cmp '0.2.4-0' '0.2.4.1-0'
|
||||
'''
|
||||
# ignore_epoch is not supported here, but has to be included for API
|
||||
# compatibility. Rather than putting this argument into the function
|
||||
# definition (and thus have it show up in the docs), we just pop it out of
|
||||
# the kwargs dict and then raise an exception if any kwargs other than
|
||||
# ignore_epoch were passed.
|
||||
kwargs = salt.utils.clean_kwargs(**kwargs)
|
||||
kwargs.pop('ignore_epoch', None)
|
||||
if kwargs:
|
||||
salt.utils.invalid_kwargs(kwargs)
|
||||
|
||||
regex = r'^~?([^:\[]+):?[^\[]*\[?.*$'
|
||||
ver1 = re.match(regex, pkg1)
|
||||
ver2 = re.match(regex, pkg2)
|
||||
|
|
|
@ -571,7 +571,7 @@ def info(*packages, **attr):
|
|||
return ret
|
||||
|
||||
|
||||
def version_cmp(ver1, ver2):
|
||||
def version_cmp(ver1, ver2, ignore_epoch=False):
|
||||
'''
|
||||
.. versionadded:: 2015.8.9
|
||||
|
||||
|
@ -579,12 +579,21 @@ def version_cmp(ver1, ver2):
|
|||
ver1 == ver2, and 1 if ver1 > ver2. Return None if there was a problem
|
||||
making the comparison.
|
||||
|
||||
ignore_epoch : False
|
||||
Set to ``True`` to ignore the epoch when comparing versions
|
||||
|
||||
.. versionadded:: 2015.8.10,2016.3.2
|
||||
|
||||
CLI Example:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
salt '*' pkg.version_cmp '0.2-001' '0.2.0.1-002'
|
||||
'''
|
||||
normalize = lambda x: str(x).split(':', 1)[-1] if ignore_epoch else str(x)
|
||||
ver1 = normalize(ver1)
|
||||
ver2 = normalize(ver2)
|
||||
|
||||
try:
|
||||
cmp_func = None
|
||||
if HAS_RPM:
|
||||
|
@ -657,7 +666,10 @@ def version_cmp(ver1, ver2):
|
|||
ver1, ver2, exc
|
||||
)
|
||||
|
||||
return salt.utils.version_cmp(ver1, ver2)
|
||||
# We would already have normalized the versions at the beginning of this
|
||||
# function if ignore_epoch=True, so avoid unnecessary work and just pass
|
||||
# False for this value.
|
||||
return salt.utils.version_cmp(ver1, ver2, ignore_epoch=False)
|
||||
|
||||
|
||||
def checksum(*paths):
|
||||
|
|
|
@ -654,7 +654,7 @@ def version(*names, **kwargs):
|
|||
return __salt__['pkg_resource.version'](*names, **kwargs)
|
||||
|
||||
|
||||
def version_cmp(pkg1, pkg2):
|
||||
def version_cmp(pkg1, pkg2, ignore_epoch=False):
|
||||
'''
|
||||
.. versionadded:: 2015.5.4
|
||||
|
||||
|
@ -662,6 +662,11 @@ def version_cmp(pkg1, pkg2):
|
|||
pkg1 == pkg2, and 1 if pkg1 > pkg2. Return None if there was a problem
|
||||
making the comparison.
|
||||
|
||||
ignore_epoch : False
|
||||
Set to ``True`` to ignore the epoch when comparing versions
|
||||
|
||||
.. versionadded:: 2015.8.10,2016.3.2
|
||||
|
||||
CLI Example:
|
||||
|
||||
.. code-block:: bash
|
||||
|
@ -669,7 +674,7 @@ def version_cmp(pkg1, pkg2):
|
|||
salt '*' pkg.version_cmp '0.2-001' '0.2.0.1-002'
|
||||
'''
|
||||
|
||||
return __salt__['lowpkg.version_cmp'](pkg1, pkg2)
|
||||
return __salt__['lowpkg.version_cmp'](pkg1, pkg2, ignore_epoch=ignore_epoch)
|
||||
|
||||
|
||||
def list_pkgs(versions_as_list=False, **kwargs):
|
||||
|
|
|
@ -525,7 +525,7 @@ def version(*names, **kwargs):
|
|||
return __salt__['pkg_resource.version'](*names, **kwargs) or {}
|
||||
|
||||
|
||||
def version_cmp(ver1, ver2):
|
||||
def version_cmp(ver1, ver2, ignore_epoch=False):
|
||||
'''
|
||||
.. versionadded:: 2015.5.4
|
||||
|
||||
|
@ -533,13 +533,18 @@ def version_cmp(ver1, ver2):
|
|||
ver1 == ver2, and 1 if ver1 > ver2. Return None if there was a problem
|
||||
making the comparison.
|
||||
|
||||
ignore_epoch : False
|
||||
Set to ``True`` to ignore the epoch when comparing versions
|
||||
|
||||
.. versionadded:: 2015.8.10,2016.3.2
|
||||
|
||||
CLI Example:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
salt '*' pkg.version_cmp '0.2-001' '0.2.0.1-002'
|
||||
'''
|
||||
return __salt__['lowpkg.version_cmp'](str(ver1), str(ver2))
|
||||
return __salt__['lowpkg.version_cmp'](ver1, ver2, ignore_epoch=ignore_epoch)
|
||||
|
||||
|
||||
def list_pkgs(versions_as_list=False, **kwargs):
|
||||
|
|
|
@ -151,13 +151,13 @@ def _fulfills_version_spec(versions, oper, desired_version,
|
|||
Returns True if any of the installed versions match the specified version,
|
||||
otherwise returns False
|
||||
'''
|
||||
normalize = lambda x: x.split(':', 1)[-1] if ignore_epoch else x
|
||||
cmp_func = __salt__.get('pkg.version_cmp')
|
||||
for ver in versions:
|
||||
if salt.utils.compare_versions(ver1=normalize(ver),
|
||||
if salt.utils.compare_versions(ver1=ver,
|
||||
oper=oper,
|
||||
ver2=normalize(desired_version),
|
||||
cmp_func=cmp_func):
|
||||
ver2=desired_version,
|
||||
cmp_func=cmp_func,
|
||||
ignore_epoch=ignore_epoch):
|
||||
return True
|
||||
return False
|
||||
|
||||
|
|
|
@ -2279,7 +2279,7 @@ def kwargs_warn_until(kwargs,
|
|||
)
|
||||
|
||||
|
||||
def version_cmp(pkg1, pkg2):
|
||||
def version_cmp(pkg1, pkg2, ignore_epoch=False):
|
||||
'''
|
||||
Compares two version strings using distutils.version.LooseVersion. This is
|
||||
a fallback for providers which don't have a version comparison utility
|
||||
|
@ -2287,6 +2287,10 @@ def version_cmp(pkg1, pkg2):
|
|||
version2, and 1 if version1 > version2. Return None if there was a problem
|
||||
making the comparison.
|
||||
'''
|
||||
normalize = lambda x: str(x).split(':', 1)[-1] if ignore_epoch else str(x)
|
||||
pkg1 = normalize(pkg1)
|
||||
pkg2 = normalize(pkg2)
|
||||
|
||||
try:
|
||||
# pylint: disable=no-member
|
||||
if distutils.version.LooseVersion(pkg1) < \
|
||||
|
@ -2303,22 +2307,25 @@ def version_cmp(pkg1, pkg2):
|
|||
return None
|
||||
|
||||
|
||||
def compare_versions(ver1='', oper='==', ver2='', cmp_func=None):
|
||||
def compare_versions(ver1='',
|
||||
oper='==',
|
||||
ver2='',
|
||||
cmp_func=None,
|
||||
ignore_epoch=False):
|
||||
'''
|
||||
Compares two version numbers. Accepts a custom function to perform the
|
||||
cmp-style version comparison, otherwise uses version_cmp().
|
||||
'''
|
||||
cmp_map = {'<': (-1,), '<=': (-1, 0), '==': (0,),
|
||||
'>=': (0, 1), '>': (1,)}
|
||||
if oper not in ['!='] and oper not in cmp_map:
|
||||
log.error('Invalid operator "{0}" for version '
|
||||
'comparison'.format(oper))
|
||||
if oper not in ('!=',) and oper not in cmp_map:
|
||||
log.error('Invalid operator \'%s\' for version comparison', oper)
|
||||
return False
|
||||
|
||||
if cmp_func is None:
|
||||
cmp_func = version_cmp
|
||||
|
||||
cmp_result = cmp_func(ver1, ver2)
|
||||
cmp_result = cmp_func(ver1, ver2, ignore_epoch=ignore_epoch)
|
||||
if cmp_result is None:
|
||||
return False
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue