From 5cd3a86099ad0916de6ecc2a05ff8dbc167ab163 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Lebleu?= Date: Mon, 21 Dec 2015 12:40:50 +0100 Subject: [PATCH] [fix] Check app min_version with yunohost package (fixbug #113) --- src/yunohost/__init__.py | 11 +++++++++++ src/yunohost/app.py | 7 +++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/yunohost/__init__.py b/src/yunohost/__init__.py index 3a7dd37c9..fd8b653bd 100644 --- a/src/yunohost/__init__.py +++ b/src/yunohost/__init__.py @@ -24,15 +24,26 @@ ## Packages versions def get_version(package): + """Get the version of package""" from moulinette.utils import process return process.check_output( "dpkg-query -W -f='${{Version}}' {0}".format(package) ).strip() def get_versions(*args, **kwargs): + """Get the version of each YunoHost package""" from collections import OrderedDict return OrderedDict([ ('moulinette', get_version('moulinette')), ('yunohost', get_version('yunohost')), ('yunohost-admin', get_version('yunohost-admin')), ]) + +def has_min_version(min_version, package='yunohost', strict=False): + """Check if a package has minimum version""" + from distutils.version import LooseVersion, StrictVersion + cmp_cls = StrictVersion if strict else LooseVersion + version = cmp_cls(get_version(package)) + if version >= cmp_cls(min_version): + return True + return False diff --git a/src/yunohost/app.py b/src/yunohost/app.py index 0b3ad2a31..325a68bb3 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -39,6 +39,7 @@ import subprocess from moulinette.core import MoulinetteError from moulinette.utils.log import getActionLogger +from . import has_min_version from .service import service_log logger = getActionLogger('yunohost.app') @@ -344,7 +345,8 @@ def app_upgrade(auth, app=[], url=None, file=None): continue # Check min version - if 'min_version' in manifest and __version__ < manifest['min_version']: + if 'min_version' in manifest \ + and not has_min_version(manifest['min_version']): raise MoulinetteError(errno.EPERM, m18n.n('app_recent_version_required', app_id)) @@ -448,7 +450,8 @@ def app_install(auth, app, label=None, args=None): app_id = manifest['id'] # Check min version - if 'min_version' in manifest and __version__ < manifest['min_version']: + if 'min_version' in manifest \ + and not has_min_version(manifest['min_version']): raise MoulinetteError(errno.EPERM, m18n.n('app_recent_version_required', app_id))