def uninstall(cls, args): import lodel.plugin.plugins from lodel.plugin.plugins import Plugin if len(args.archive) > 0: raise RuntimeError("Cannot uninstall plugin using -f --file \ options. Use -d --directory instead") to_delete = dict() # will contain all pathes of plugins to delete errors = dict() # Uninstall by pathes if len(args.directory) > 0: # processing & checking -d --directory arguments for path in args.directory: apath = os.path.abspath(path) # We assume plugins are in lodel/plugins if not apath.startswith(lodel.plugins.PLUGINS_PATH): errors[path] = "Not a subdir of %s" errors[path] %= lodel.plugins.PLUGINS_PATH continue try: pinfos = Plugin.dir_is_plugin(apath) except Exception as e: if not args.force: errors[path] = e continue to_delete[path] = pinfos # Uninstall by plugin's names # We retrieve the path of the plugin from its name if len(args.plugin_name) > 0: # Processing -n --plugin-name arguments plist = Plugin._discover(lodel.plugins.PLUGINS_PATH) for pinfos in plist: if pinfos['name'] in args.plugin_name: to_delete[pinfos['path']] = pinfos # Manage errors and exit if there is no force option if len(errors) > 0: msg = "Following errors detected before begining deletions :\n" for path, errmsg in errors.items(): msg += "\t- For %s : %s" % (path, errmsg) print(msg) if not args.force: exit(1) print("Begining deletion :") for path, pinfos in to_delete.items(): # shutil.rmtree(path) print("rm -R %s" % path) print("\t%s(%s) in %s deleted" % ( pinfos['name'], pinfos['version'], pinfos['path']))
def install(cls, args): import lodel.plugin.plugins from lodel.plugin.plugins import Plugin from lodel.plugin.exceptions import PluginError # We can't install a plugin with just its name, we have to know where # it is if len(args.plugin_name) > 0: raise RuntimeError("Unable to install a plugin from its name !\ We do not know where to find it...") plist = Plugin.discover() errors = dict() # For now we do not handle archive for plugins if len(args.archive) > 0: raise NotImplementedError("Not supported yet") plugins_infos = {} for cur_dir in args.directory: # Check that the directories obtained correspond to plugins try: res = Plugin.dir_is_plugin(cur_dir, assert_in_package=False) if res is False: errors[cur_dir] = PluginError("Not a plugin") else: plugins_infos[res['name']] = res except Exception as e: errors[cur_dir] = e # Abording because of previous errors if len(errors) > 0: msg = "Abording installation because of following errors :\n" for path, expt in errors.items(): msg += ("\t- For path '%s' : %s\n" % (path, expt)) raise RuntimeError(msg) # No errors continuing to install for pname, pinfos in plugins_infos.items(): if pname in plist: # Found an installed plugin with the same name # Checking both versions if plist[pname]['version'] == pinfos['version']: errors[pinfos['path']] = 'Abording installation of %s \ found in %s because it seems to be allready installed in %s' % ( pname, pinfos['path'], plist[pname]['path']) continue if plist[pname]['version'] > pinfos['version']: errors[pinfos['path']] = 'Abording installation of %s \ found in %s because the same plugins with a greater version seems to be \ installed in %s' % (pname, pinfos['path'], plist[pname]['path']) continue logger.info("Found a plugin with the same name but with an \ inferior version. Continuing to install") # Checking that we can safely copy our plugin dst_path = os.path.join(lodel.plugin.plugins.PLUGINS_PATH, os.path.basename(os.path.dirname(pinfos['path']))) orig_path = dst_path if os.path.isdir(dst_path): dst_path = tempfile.mkdtemp( prefix=os.path.basename(dst_path) + '_', dir=lodel.plugin.plugins.PLUGINS_PATH) logger.warning("A plugin already exists in %s. Installing \ in %s" % (orig_path, dst_path)) shutil.rmtree(dst_path) # Install the plugin shutil.copytree(pinfos['path'], dst_path, symlinks=False) print("%s(%s) installed in %s" % ( pname, pinfos['version'], dst_path)) if len(errors) > 0: msg = "Following errors occurs during installation process :\n" for path, error_msg in errors.items(): msg += "\t- For '%s' : %s" % (path, error_msg) print(msg)