From 46711ce365dfd78bcbb4bcf1fcfcd0a98af46ce5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gina=20H=C3=A4u=C3=9Fge?= Date: Wed, 10 Jun 2015 19:34:33 +0200 Subject: [PATCH] pluginmanager: Support installing plugins that need --process-dependency-links This might be necessary when plugins depend on (patched) library versions that are not yet released on PyPI --- src/octoprint/plugins/pluginmanager/__init__.py | 17 ++++++++++++++--- .../pluginmanager/static/js/pluginmanager.js | 17 +++++++++++++---- .../templates/pluginmanager_settings.jinja2 | 15 +++++++++++++++ 3 files changed, 42 insertions(+), 7 deletions(-) diff --git a/src/octoprint/plugins/pluginmanager/__init__.py b/src/octoprint/plugins/pluginmanager/__init__.py index c84bddd6..9dd14b8d 100644 --- a/src/octoprint/plugins/pluginmanager/__init__.py +++ b/src/octoprint/plugins/pluginmanager/__init__.py @@ -59,7 +59,8 @@ class PluginManagerPlugin(octoprint.plugin.SimpleApiPlugin, def get_settings_defaults(self): return dict( repository="http://plugins.octoprint.org/plugins.json", - pip=None + pip=None, + dependency_links=False ) ##~~ AssetPlugin @@ -143,7 +144,10 @@ class PluginManagerPlugin(octoprint.plugin.SimpleApiPlugin, if command == "install": url = data["url"] plugin_name = data["plugin"] if "plugin" in data else None - return self.command_install(url=url, force="force" in data and data["force"] in valid_boolean_trues, reinstall=plugin_name) + return self.command_install(url=url, + force="force" in data and data["force"] in valid_boolean_trues, + dependency_links="dependency_links" in data and data["dependency_links"] in valid_boolean_trues, + reinstall=plugin_name) elif command == "uninstall": plugin_name = data["plugin"] @@ -165,7 +169,7 @@ class PluginManagerPlugin(octoprint.plugin.SimpleApiPlugin, self._repository_available = self._refresh_repository() return jsonify(repository=dict(available=self._repository_available, plugins=self._repository_plugins)) - def command_install(self, url=None, path=None, force=False, reinstall=None): + def command_install(self, url=None, path=None, force=False, reinstall=None, dependency_links=False): if url is not None: pip_args = ["install", sarge.shell_quote(url)] elif path is not None: @@ -173,6 +177,9 @@ class PluginManagerPlugin(octoprint.plugin.SimpleApiPlugin, else: raise ValueError("Either url or path must be provided") + if dependency_links or self._settings.get_boolean(["dependency_links"]): + pip_args.append("--process-dependency-links") + all_plugins_before = self._plugin_manager.find_plugins() success_string = "Successfully installed" @@ -489,6 +496,10 @@ class PluginManagerPlugin(octoprint.plugin.SimpleApiPlugin, def map_repository_entry(entry): result = dict(entry) + + if not "follow_dependency_links" in result: + result["follow_dependency_links"] = False + result["is_compatible"] = dict( octoprint=True, os=True diff --git a/src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js b/src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js index 81b0cb92..ca7eaae9 100644 --- a/src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js +++ b/src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js @@ -69,6 +69,8 @@ $(function() { self.loglines = ko.observableArray([]); self.installedPlugins = ko.observableArray([]); + self.followDependencyLinks = ko.observable(false); + self.working = ko.observable(false); self.workingTitle = ko.observable(); self.workingDialog = undefined; @@ -108,6 +110,9 @@ $(function() { self.uploadButton.unbind("click"); self.uploadButton.bind("click", function() { self._markWorking(gettext("Installing plugin..."), gettext("Installing plugin from uploaded archive...")); + data.formData = { + dependency_links: self.followDependencyLinks() + }; data.submit(); return false; }); @@ -213,13 +218,13 @@ $(function() { } if (self.installed(data)) { - self.installPlugin(data.archive, data.title, data.id); + self.installPlugin(data.archive, data.title, data.id, data.follow_dependency_links || self.followDependencyLinks()); } else { - self.installPlugin(data.archive, data.title); + self.installPlugin(data.archive, data.title, undefined, data.follow_dependency_links || self.followDependencyLinks()); } }; - self.installPlugin = function(url, name, reinstall) { + self.installPlugin = function(url, name, reinstall, followDependencyLinks) { if (!self.loginState.isAdmin()) { return; } @@ -229,6 +234,10 @@ $(function() { } if (!url) return; + if (followDependencyLinks === undefined) { + followDependencyLinks = self.followDependencyLinks(); + } + var workTitle, workText; if (!reinstall) { workTitle = gettext("Installing plugin..."); @@ -244,7 +253,7 @@ $(function() { self._markWorking(workTitle, workText); var command = "install"; - var payload = {url: url}; + var payload = {url: url, dependency_links: followDependencyLinks}; if (reinstall) { payload["plugin"] = reinstall; payload["force"] = true; diff --git a/src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2 b/src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2 index 2f436ad8..f9710de0 100644 --- a/src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2 +++ b/src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2 @@ -138,6 +138,21 @@ {{ _('This does not look like a valid plugin archive. Valid plugin archives should be either zip files or tarballs and have the extension ".zip", ".tar.gz", ".tgz" or ".tar"') }} + +
+
{{ _('Advanced options') }}
+
+
+
+
+ +
+
+
+
+