diff options
Diffstat (limited to 'testing/mycroft-core/0002-follow-xdg-for-skill-settings.patch')
-rw-r--r-- | testing/mycroft-core/0002-follow-xdg-for-skill-settings.patch | 204 |
1 files changed, 0 insertions, 204 deletions
diff --git a/testing/mycroft-core/0002-follow-xdg-for-skill-settings.patch b/testing/mycroft-core/0002-follow-xdg-for-skill-settings.patch deleted file mode 100644 index 6caf8370699..00000000000 --- a/testing/mycroft-core/0002-follow-xdg-for-skill-settings.patch +++ /dev/null @@ -1,204 +0,0 @@ -Upstream pull-request: https://github.com/MycroftAI/mycroft-core/pull/2559 - -diff --git a/mycroft/skills/mycroft_skill/mycroft_skill.py b/mycroft/skills/mycroft_skill/mycroft_skill.py -index 4f3b6d9da6..d60a3279d0 100644 ---- a/mycroft/skills/mycroft_skill/mycroft_skill.py -+++ b/mycroft/skills/mycroft_skill/mycroft_skill.py -@@ -21,8 +21,11 @@ import traceback - from itertools import chain - from os import walk - from os.path import join, abspath, dirname, basename, exists -+from pathlib import Path - from threading import Event, Timer - -+from xdg import BaseDirectory -+ - from adapt.intent import Intent, IntentBuilder - - from mycroft import dialog -@@ -113,6 +116,7 @@ class MycroftSkill: - bus (MycroftWebsocketClient): Optional bus connection - use_settings (bool): Set to false to not use skill settings at all - """ -+ - def __init__(self, name=None, bus=None, use_settings=True): - self.name = name or self.__class__.__name__ - self.resting_name = None -@@ -123,16 +127,6 @@ class MycroftSkill: - #: Member variable containing the absolute path of the skill's root - #: directory. E.g. /opt/mycroft/skills/my-skill.me/ - self.root_dir = dirname(abspath(sys.modules[self.__module__].__file__)) -- if use_settings: -- self.settings = get_local_settings(self.root_dir, self.name) -- self._initial_settings = deepcopy(self.settings) -- else: -- self.settings = None -- -- #: Set to register a callback method that will be called every time -- #: the skills settings are updated. The referenced method should -- #: include any logic needed to handle the updated settings. -- self.settings_change_callback = None - - self.gui = SkillGUI(self) - -@@ -141,6 +135,19 @@ class MycroftSkill: - self.bind(bus) - #: Mycroft global configuration. (dict) - self.config_core = Configuration.get() -+ -+ self.settings = None -+ self.settings_write_path = None -+ self.settings_read_path = None -+ -+ if use_settings: -+ self._init_settings() -+ -+ #: Set to register a callback method that will be called every time -+ #: the skills settings are updated. The referenced method should -+ #: include any logic needed to handle the updated settings. -+ self.settings_change_callback = None -+ - self.dialog_renderer = None - - #: Filesystem access to skill specific folder. -@@ -157,6 +164,42 @@ class MycroftSkill: - self.event_scheduler = EventSchedulerInterface(self.name) - self.intent_service = IntentServiceInterface() - -+ def _init_settings(self): -+ """Setup skill settings.""" -+ -+ # To not break existing setups, -+ # save to skill directory if the file exists already -+ self.settings_write_path = Path(self.root_dir) -+ -+ # Otherwise save to XDG_CONFIG_DIR -+ if not self.settings_write_path.joinpath('settings.json').exists(): -+ self.settings_write_path = Path(BaseDirectory.save_config_path( -+ 'mycroft', 'skills', basename(self.root_dir))) -+ -+ # To not break existing setups, -+ # read from skill directory if the settings file exists there -+ self.settings_read_path = Path(self.root_dir) -+ -+ # Then, check XDG_CONFIG_DIR -+ if not self.settings_read_path.joinpath('settings.json').exists(): -+ for dir in BaseDirectory.load_config_paths('mycroft', -+ 'skills', -+ basename( -+ self.root_dir)): -+ path = Path(dir) -+ #: If there is a settings file here, use it -+ if path.joinpath('settings.json').exists(): -+ self.settings_read_path = path -+ break -+ -+ # Lastly, check /etc/mycroft -+ if not self.settings_read_path.joinpath('settings.json').exists(): -+ self.settings_read_path = Path( -+ '/etc/mycroft/skills/').joinpath(basename(self.root_dir)) -+ -+ self.settings = get_local_settings(self.settings_read_path, self.name) -+ self._initial_settings = deepcopy(self.settings) -+ - @property - def enclosure(self): - if self._enclosure: -@@ -271,7 +314,7 @@ class MycroftSkill: - if remote_settings is not None: - LOG.info('Updating settings for skill ' + self.name) - self.settings.update(**remote_settings) -- save_settings(self.root_dir, self.settings) -+ save_settings(self.settings_write_path, self.settings) - if self.settings_change_callback is not None: - self.settings_change_callback() - -@@ -544,7 +587,7 @@ class MycroftSkill: - - if not voc or not exists(voc): - raise FileNotFoundError( -- 'Could not find {}.voc file'.format(voc_filename)) -+ 'Could not find {}.voc file'.format(voc_filename)) - # load vocab and flatten into a simple list - vocab = read_vocab_file(voc) - self.voc_match_cache[cache_key] = list(chain(*vocab)) -@@ -811,7 +854,7 @@ class MycroftSkill: - """Store settings and indicate that the skill handler has completed - """ - if self.settings != self._initial_settings: -- save_settings(self.root_dir, self.settings) -+ save_settings(self.settings_write_path, self.settings) - self._initial_settings = self.settings - if handler_info: - msg_type = handler_info + '.complete' -@@ -1233,7 +1276,7 @@ class MycroftSkill: - - # Store settings - if self.settings != self._initial_settings: -- save_settings(self.root_dir, self.settings) -+ save_settings(self.settings_write_path, self.settings) - - if self.settings_meta: - self.settings_meta.stop() -diff --git a/mycroft/skills/settings.py b/mycroft/skills/settings.py -index c210625f5b..f576b34c9e 100644 ---- a/mycroft/skills/settings.py -+++ b/mycroft/skills/settings.py -@@ -93,18 +93,22 @@ def get_local_settings(skill_dir, skill_name) -> dict: - def save_settings(skill_dir, skill_settings): - """Save skill settings to file.""" - settings_path = Path(skill_dir).joinpath('settings.json') -- if Path(skill_dir).exists(): -- with open(str(settings_path), 'w') as settings_file: -- try: -- json.dump(skill_settings, settings_file) -- except Exception: -- LOG.exception('error saving skill settings to ' -- '{}'.format(settings_path)) -- else: -- LOG.info('Skill settings successfully saved to ' -- '{}' .format(settings_path)) -- else: -- LOG.info('Skill folder no longer exists, can\'t save settings.') -+ -+ # Either the file already exists in /opt, or we are writing -+ # to XDG_CONFIG_DIR and always have the permission to make -+ # sure the file always exists -+ if not Path(settings_path).exists(): -+ settings_path.touch(mode=0o644) -+ -+ with open(str(settings_path), 'w') as settings_file: -+ try: -+ json.dump(skill_settings, settings_file) -+ except Exception: -+ LOG.exception('error saving skill settings to ' -+ '{}'.format(settings_path)) -+ else: -+ LOG.info('Skill settings successfully saved to ' -+ '{}' .format(settings_path)) - - - def get_display_name(skill_name: str): -diff --git a/mycroft/skills/skill_loader.py b/mycroft/skills/skill_loader.py -index 2402740188..b7e8186967 100644 ---- a/mycroft/skills/skill_loader.py -+++ b/mycroft/skills/skill_loader.py -@@ -259,7 +259,8 @@ class SkillLoader: - if first_run: - LOG.info("First run of " + self.skill_id) - self.instance.settings["__mycroft_skill_firstrun"] = False -- save_settings(self.skill_directory, self.instance.settings) -+ save_settings(self.instance.settings_write_path, -+ self.instance.settings) - intro = self.instance.get_intro_message() - if intro: - self.instance.speak(intro) -diff --git a/requirements.txt b/requirements.txt -index 509436fb89..c9358db687 100644 ---- a/requirements.txt -+++ b/requirements.txt -@@ -30,3 +30,4 @@ fann2==1.0.7 - padaos==0.1.9 - precise-runner==0.2.1 - petact==0.1.2 -+pyxdg==0.26 |