kolibri icon indicating copy to clipboard operation
kolibri copied to clipboard

Version logic does not handle non-tripartite version strings

Open rtibbles opened this issue 4 years ago • 0 comments

While our internal version strings for kolibri user major, minor, patch - some of our plugins, for simplicity, just use major, minor.

This breaks when we try to use some of our internal semantic version logic parsing to parse these versions for our plugin upgrade logic. Resulting in errors like this:

Traceback (most recent call last):
  File "/home/richard/.virtualenvs/kolibripy3/bin/kolibri", line 11, in <module>
    load_entry_point('kolibri', 'console_scripts', 'kolibri')()
  File "/home/richard/.virtualenvs/kolibripy3/lib/python3.6/site-packages/pkg_resources/__init__.py", line 489, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/home/richard/.virtualenvs/kolibripy3/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2843, in load_entry_point
    return ep.load()
  File "/home/richard/.virtualenvs/kolibripy3/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2434, in load
    return self.resolve()
  File "/home/richard/.virtualenvs/kolibripy3/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2440, in resolve
    module = __import__(self.module_name, fromlist=['__name__'], level=0)
  File "/home/richard/github/kolibri/kolibri/utils/cli.py", line 29, in <module>
    from . import sanity_checks
  File "/home/richard/github/kolibri/kolibri/utils/sanity_checks.py", line 14, in <module>
    from .server import get_status
  File "/home/richard/github/kolibri/kolibri/utils/server.py", line 20, in <module>
    from kolibri.core.deviceadmin.utils import schedule_vacuum
  File "/home/richard/github/kolibri/kolibri/core/deviceadmin/utils.py", line 13, in <module>
    from kolibri.core.tasks.main import scheduler
  File "/home/richard/github/kolibri/kolibri/core/tasks/main.py", line 11, in <module>
    from kolibri.core.tasks.queue import Queue
  File "/home/richard/github/kolibri/kolibri/core/tasks/queue.py", line 1, in <module>
    from kolibri.core.tasks.job import Job
  File "/home/richard/github/kolibri/kolibri/core/tasks/job.py", line 7, in <module>
    from kolibri.core.tasks.utils import current_state_tracker
  File "/home/richard/github/kolibri/kolibri/core/tasks/utils.py", line 123, in <module>
    db_task_write_lock = ProcessLock("db_task_write_lock")
  File "/home/richard/github/kolibri/kolibri/core/utils/cache.py", line 34, in __init__
    self.expire = expire if expire else OPTIONS["Cache"]["CACHE_LOCK_TTL"]
  File "/home/richard/.virtualenvs/kolibripy3/lib/python3.6/site-packages/django/utils/functional.py", line 238, in inner
    self._setup()
  File "/home/richard/.virtualenvs/kolibripy3/lib/python3.6/site-packages/django/utils/functional.py", line 386, in _setup
    self._wrapped = self._setupfunc()
  File "/home/richard/github/kolibri/kolibri/utils/conf.py", line 54, in __initialize_options
    return read_options_file(KOLIBRI_HOME)
  File "/home/richard/github/kolibri/kolibri/utils/options.py", line 465, in read_options_file
    conf = ConfigObj(ini_path, configspec=get_configspec())
  File "/home/richard/github/kolibri/kolibri/utils/options.py", line 429, in get_configspec
    for section, opts in option_spec.items():
  File "/home/richard/.virtualenvs/kolibripy3/lib/python3.6/site-packages/django/utils/functional.py", line 238, in inner
    self._setup()
  File "/home/richard/.virtualenvs/kolibripy3/lib/python3.6/site-packages/django/utils/functional.py", line 386, in _setup
    self._wrapped = self._setupfunc()
  File "/home/richard/github/kolibri/kolibri/utils/options.py", line 415, in _get_option_spec
    return extend_config_spec(base_option_spec)
  File "/home/richard/github/kolibri/kolibri/plugins/utils/options.py", line 110, in extend_config_spec
    for plugin_instance in registered_plugins:
  File "/home/richard/.virtualenvs/kolibripy3/lib/python3.6/site-packages/django/utils/functional.py", line 238, in inner
    self._setup()
  File "/home/richard/.virtualenvs/kolibripy3/lib/python3.6/site-packages/django/utils/functional.py", line 386, in _setup
    self._wrapped = self._setupfunc()
  File "/home/richard/github/kolibri/kolibri/plugins/registry.py", line 146, in __initialize
    registry.register_plugins(config.ACTIVE_PLUGINS)
  File "/home/richard/github/kolibri/kolibri/plugins/registry.py", line 87, in register_plugins
    if is_plugin_updated(app):
  File "/home/richard/github/kolibri/kolibri/plugins/utils/__init__.py", line 245, in is_plugin_updated
    normalize_version_to_semver(config["PLUGIN_VERSIONS"][plugin_name])
  File "/home/richard/github/kolibri/kolibri/utils/version.py", line 469, in normalize_version_to_semver
    numeric, after = re.match(r"(\d+\.\d+\.\d+)([^\d].*)?", version).groups()
AttributeError: 'NoneType' object has no attribute 'groups'

rtibbles avatar Nov 09 '20 22:11 rtibbles