Exemplo n.º 1
0
def is_plugin_updated(plugin_name):
    try:
        old_version = VersionInfo.parse(
            normalize_version_to_semver(
                config["PLUGIN_VERSIONS"][plugin_name]))
        new_version = VersionInfo.parse(
            normalize_version_to_semver(_get_plugin_version(plugin_name)))
        return new_version != old_version
    except KeyError:
        # We have no previous record of this plugin, so it is updated
        return True
Exemplo n.º 2
0
def matches_version(version, version_range):
    if version_range is None or not version:
        return True
    # For the purposes of upgrade comparison, treat dev versions as alphas
    version = normalize_version_to_semver(version).replace("dev", "a")
    version_range = "".join(get_version_and_operator_from_range(version_range))
    return match(version, version_range)
Exemplo n.º 3
0
    def _update_plugin(self, plugin_name):
        # Import here to prevent circular import
        from kolibri.plugins.registry import registered_plugins

        app_configs = []
        plugin_instance = registered_plugins.get(plugin_name)
        if plugin_instance is None:
            logger.error(
                "Tried to run upgrades for plugin {} but it doesn't exist".
                format(plugin_name))
            return
        for app in plugin_instance.INSTALLED_APPS:
            if not isinstance(app, AppConfig) and isinstance(app, str):
                app = apps.get_containing_app_config(app)
            app_configs.append(app)
        old_version = config["PLUGIN_VERSIONS"].get(plugin_name, "")
        new_version = _get_plugin_version(plugin_name)
        try:
            self._migrate_plugin(plugin_name, app_configs)
        except Exception as e:
            logger.error(
                "Unhandled exception while migrating {}, exception was:\n\n{}".
                format(plugin_name, e))
            return
        if old_version:
            if VersionInfo.parse(normalize_version_to_semver(
                    old_version)) < VersionInfo.parse(
                        normalize_version_to_semver(new_version)):
                logger.info(
                    "Running upgrade routines for {}, upgrading from {} to {}".
                    format(plugin_name, old_version, new_version))
            else:
                logger.info(
                    "Running downgrade routines for {}, downgrading from {} to {}"
                    .format(plugin_name, old_version, new_version))
        else:
            logger.info(
                "Running installation routines for {}, installing {}".format(
                    plugin_name, new_version))
        try:
            run_upgrades(old_version, new_version, app_configs=app_configs)
        except Exception as e:
            logger.error(
                "An exception occured running upgrades for plugin {}: {}".
                format(plugin_name, e))
            return
        return new_version
Exemplo n.º 4
0
from importlib import import_module

from django.apps import apps
from semver import match
from semver import VersionInfo

import kolibri
from kolibri.utils.version import get_version_and_operator_from_range
from kolibri.utils.version import normalize_version_to_semver

CURRENT_VERSION = VersionInfo.parse(
    normalize_version_to_semver(kolibri.__version__))


class VersionUpgrade(object):
    """
    Class for version upgrade operations
    """

    __slots__ = ["OLD_VERSION", "NEW_VERSION", "upgrade", "module"]

    def __init__(self, old_version=None, new_version=None, upgrade=None):
        # Semver version range specification for the previous version
        # of Kolibri when this should be applied.
        # If None - should be applied to all.
        self.OLD_VERSION = old_version
        try:
            assert self._old
        except AssertionError:
            raise TypeError(
                "Unparseable semver version or range passed to upgrade object for old_version"
Exemplo n.º 5
0
def matches_version(version, version_range):
    if version_range is None or not version:
        return True
    version = normalize_version_to_semver(version)
    version_range = "".join(get_version_and_operator_from_range(version_range))
    return match(version, version_range)