kolibri
kolibri copied to clipboard
Version logic does not handle non-tripartite version strings
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'