Philipp Hörist pushed to branch master at gajim / gajim

Commits:
00c8e5c0 by Yann Leboulanger at 2018-10-12T20:17:34Z
Ability to update plugins on startup from a download folder

- - - - -


2 changed files:

- gajim/common/configpaths.py
- gajim/plugins/pluginmanager.py


Changes:

=====================================
gajim/common/configpaths.py
=====================================
@@ -214,6 +214,7 @@ class ConfigPaths:
             # Data paths
             ('LOG_DB', 'logs.db', PathLocation.DATA, PathType.FILE),
             ('MY_CACERTS', 'cacerts.pem', PathLocation.DATA, PathType.FILE),
+            ('PLUGINS_DOWNLOAD', 'plugins_download', PathLocation.CACHE, 
PathType.FOLDER),
             ('PLUGINS_USER', 'plugins', PathLocation.DATA, PathType.FOLDER),
             ('MY_EMOTS',
              'emoticons', PathLocation.DATA, PathType.FOLDER_OPTIONAL),


=====================================
gajim/plugins/pluginmanager.py
=====================================
@@ -27,7 +27,7 @@ import os
 import sys
 import fnmatch
 import zipfile
-from shutil import rmtree
+from shutil import rmtree, move
 import configparser
 from pkg_resources import parse_version
 
@@ -109,6 +109,8 @@ class PluginManager(metaclass=Singleton):
         Registered names with instances of encryption Plugins.
         '''
 
+        self.update_plugins()
+
         for path in reversed(configpaths.get_plugin_dirs()):
             pc = self.scan_dir_for_plugins(path)
             self.add_plugins(pc)
@@ -126,6 +128,47 @@ class PluginManager(metaclass=Singleton):
     def _remove_plugin_entry_in_global_config(self, plugin):
         app.config.del_per('plugins', plugin.short_name)
 
+    @log_calls('PluginManager')
+    def update_plugins(self, replace=True, activate=False, plugin_name=None):
+        '''
+        Move plugins from the downloaded folder to the user plugin folder
+
+        :param replace: replace plugin files if they already exist.
+        :type replace: boolean
+        :param activate: load and activate the plugin
+        :type activate: boolean
+        :param plugin_name: if provided, update only this plugin
+        :type plugin_name: str
+        :return: list of updated plugins (files have been installed)
+        :rtype: [] of str
+        '''
+        updated_plugins = []
+        user_dir = configpaths.get('PLUGINS_USER')
+        dl_dir = configpaths.get('PLUGINS_DOWNLOAD')
+        to_update = [plugin_name] if plugin_name else next(os.walk(dl_dir))[1]
+        for directory in to_update:
+            src_dir = os.path.join(dl_dir, directory)
+            dst_dir = os.path.join(user_dir, directory)
+            try:
+                if os.path.exists(dst_dir):
+                    if not replace:
+                        continue
+                    self.delete_plugin_files(dst_dir)
+                move(src_dir, dst_dir)
+            except Exception:
+                log.exception('Upgrade of plugin %s failed. Impossible to move 
'
+                    'files from "%s" to "%s"', directory, src_dir, dst_dir)
+                continue
+            updated_plugins.append(directory)
+            if activate:
+                pc = self.scan_dir_for_plugins(dst_dir, scan_dirs=True,
+                    package=True)
+                self.add_plugin(pc[0])
+                plugin = self.plugins[-1]
+                self.activate_plugin(plugin)
+        return updated_plugins
+
+
     @log_calls('PluginManager')
     def init_plugins(self):
         self._activate_all_plugins_from_global_config()
@@ -725,10 +768,7 @@ class PluginManager(metaclass=Singleton):
         plugin = self.plugins[-1]
         return plugin
 
-    def uninstall_plugin(self, plugin):
-        '''
-        Deactivate and remove plugin from `plugins` list
-        '''
+    def delete_plugin_files(self, plugin_path):
         def on_error(func, path, error):
             if func == os.path.islink:
             # if symlink
@@ -737,9 +777,15 @@ class PluginManager(metaclass=Singleton):
             # access is denied or other
             raise PluginsystemError(error[1][1])
 
+        rmtree(plugin_path, False, on_error)
+
+    def uninstall_plugin(self, plugin):
+        '''
+        Deactivate and remove plugin from `plugins` list
+        '''
         if plugin:
             self.remove_plugin(plugin)
-            rmtree(plugin.__path__, False, on_error)
+            self.delete_plugin_files(plugin.__path__)
             if self._plugin_has_entry_in_global_config(plugin):
                 self._remove_plugin_entry_in_global_config(plugin)
 



View it on GitLab: 
https://dev.gajim.org/gajim/gajim/commit/00c8e5c01dd92f54505fef6e96117e5710d118a2

-- 
View it on GitLab: 
https://dev.gajim.org/gajim/gajim/commit/00c8e5c01dd92f54505fef6e96117e5710d118a2
You're receiving this email because of your account on dev.gajim.org.
_______________________________________________
Commits mailing list
Commits@gajim.org
https://lists.gajim.org/cgi-bin/listinfo/commits

Reply via email to