aboutsummaryrefslogtreecommitdiffstats
path: root/nikola/plugins/command/plugin.py
diff options
context:
space:
mode:
authorLibravatarAgustin Henze <tin@sluc.org.ar>2015-08-26 07:57:04 -0300
committerLibravatarAgustin Henze <tin@sluc.org.ar>2015-08-26 07:57:04 -0300
commit8041475aab2b8efad7d2857027331bd626d26312 (patch)
tree3980e1763c067079a4cebb425d642ca9eac834bf /nikola/plugins/command/plugin.py
parentb0b24795b24ee6809397fbbadf42f31f310a219f (diff)
Imported Upstream version 7.6.4
Diffstat (limited to 'nikola/plugins/command/plugin.py')
-rw-r--r--nikola/plugins/command/plugin.py88
1 files changed, 59 insertions, 29 deletions
diff --git a/nikola/plugins/command/plugin.py b/nikola/plugins/command/plugin.py
index 56eb1d7..f892ee9 100644
--- a/nikola/plugins/command/plugin.py
+++ b/nikola/plugins/command/plugin.py
@@ -24,12 +24,14 @@
# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+"""Manage plugins."""
+
from __future__ import print_function
import io
import os
import shutil
import subprocess
-import sys
+import time
import requests
import pygments
@@ -43,6 +45,7 @@ LOGGER = utils.get_logger('plugin', utils.STDERR_HANDLER)
class CommandPlugin(Command):
+
"""Manage plugins."""
json = None
@@ -119,6 +122,7 @@ class CommandPlugin(Command):
upgrade = options.get('upgrade')
list_available = options.get('list')
list_installed = options.get('list_installed')
+ show_install_notes = options.get('show_install_notes', True)
command_count = [bool(x) for x in (
install,
uninstall,
@@ -127,37 +131,42 @@ class CommandPlugin(Command):
list_installed)].count(True)
if command_count > 1 or command_count == 0:
print(self.help())
- return
+ return 2
- if not self.site.configured and not user_mode and install:
- LOGGER.notice('No site found, assuming --user')
- user_mode = True
-
- if user_mode:
- self.output_dir = os.path.expanduser('~/.nikola/plugins')
+ if options.get('output_dir') is not None:
+ self.output_dir = options.get('output_dir')
else:
- self.output_dir = 'plugins'
+ if not self.site.configured and not user_mode and install:
+ LOGGER.notice('No site found, assuming --user')
+ user_mode = True
+
+ if user_mode:
+ self.output_dir = os.path.expanduser('~/.nikola/plugins')
+ else:
+ self.output_dir = 'plugins'
if list_available:
- self.list_available(url)
+ return self.list_available(url)
elif list_installed:
- self.list_installed()
+ return self.list_installed()
elif upgrade:
- self.do_upgrade(url)
+ return self.do_upgrade(url)
elif uninstall:
- self.do_uninstall(uninstall)
+ return self.do_uninstall(uninstall)
elif install:
- self.do_install(url, install)
+ return self.do_install(url, install, show_install_notes)
def list_available(self, url):
+ """List all available plugins."""
data = self.get_json(url)
print("Available Plugins:")
print("------------------")
for plugin in sorted(data.keys()):
print(plugin)
- return True
+ return 0
def list_installed(self):
+ """List installed plugins."""
plugins = []
for plugin in self.site.plugin_manager.getAllPlugins():
p = plugin.path
@@ -170,8 +179,10 @@ class CommandPlugin(Command):
plugins.sort()
for name, path in plugins:
print('{0} at {1}'.format(name, path))
+ return 0
def do_upgrade(self, url):
+ """Upgrade all installed plugins."""
LOGGER.warning('This is not very smart, it just reinstalls some plugins and hopes for the best')
data = self.get_json(url)
plugins = []
@@ -194,18 +205,29 @@ class CommandPlugin(Command):
break
elif tail == '':
LOGGER.error("Can't find the plugins folder for path: {0}".format(p))
- return False
+ return 1
else:
path = tail
self.do_install(url, name)
+ return 0
- def do_install(self, url, name):
+ def do_install(self, url, name, show_install_notes=True):
+ """Download and install a plugin."""
data = self.get_json(url)
if name in data:
utils.makedirs(self.output_dir)
- LOGGER.info('Downloading: ' + data[name])
+ url = data[name]
+ LOGGER.info("Downloading '{0}'".format(url))
+ try:
+ zip_data = requests.get(url).content
+ except requests.exceptions.SSLError:
+ LOGGER.warning("SSL error, using http instead of https (press ^C to abort)")
+ time.sleep(1)
+ url = url.replace('https', 'http', 1)
+ zip_data = requests.get(url).content
+
zip_file = io.BytesIO()
- zip_file.write(requests.get(data[name]).content)
+ zip_file.write(zip_data)
LOGGER.info('Extracting: {0} into {1}/'.format(name, self.output_dir))
utils.extract_all(zip_file, self.output_dir)
dest_path = os.path.join(self.output_dir, name)
@@ -214,13 +236,13 @@ class CommandPlugin(Command):
plugin_path = utils.get_plugin_path(name)
except:
LOGGER.error("Can't find plugin " + name)
- return False
+ return 1
utils.makedirs(self.output_dir)
dest_path = os.path.join(self.output_dir, name)
if os.path.exists(dest_path):
LOGGER.error("{0} is already installed".format(name))
- return False
+ return 1
LOGGER.info('Copying {0} into plugins'.format(plugin_path))
shutil.copytree(plugin_path, dest_path)
@@ -256,7 +278,7 @@ class CommandPlugin(Command):
print('You have to install those yourself or through a package '
'manager.')
confpypath = os.path.join(dest_path, 'conf.py.sample')
- if os.path.exists(confpypath):
+ if os.path.exists(confpypath) and show_install_notes:
LOGGER.notice('This plugin has a sample config file. Integrate it with yours in order to make this plugin work!')
print('Contents of the conf.py.sample file:\n')
with io.open(confpypath, 'r', encoding='utf-8') as fh:
@@ -266,9 +288,10 @@ class CommandPlugin(Command):
4 * ' '))
else:
print(utils.indent(fh.read(), 4 * ' '))
- return True
+ return 0
def do_uninstall(self, name):
+ """Uninstall a plugin."""
for plugin in self.site.plugin_manager.getAllPlugins(): # FIXME: this is repeated thrice
p = plugin.path
if os.path.isdir(p):
@@ -278,16 +301,23 @@ class CommandPlugin(Command):
if name == plugin.name: # Uninstall this one
LOGGER.warning('About to uninstall plugin: {0}'.format(name))
LOGGER.warning('This will delete {0}'.format(p))
- inpf = raw_input if sys.version_info[0] == 2 else input
- sure = inpf('Are you sure? [y/n] ')
- if sure.lower().startswith('y'):
+ sure = utils.ask_yesno('Are you sure?')
+ if sure:
LOGGER.warning('Removing {0}'.format(p))
shutil.rmtree(p)
- return True
+ return 0
+ return 1
LOGGER.error('Unknown plugin: {0}'.format(name))
- return False
+ return 1
def get_json(self, url):
+ """Download the JSON file with all plugins."""
if self.json is None:
- self.json = requests.get(url).json()
+ try:
+ self.json = requests.get(url).json()
+ except requests.exceptions.SSLError:
+ LOGGER.warning("SSL error, using http instead of https (press ^C to abort)")
+ time.sleep(1)
+ url = url.replace('https', 'http', 1)
+ self.json = requests.get(url).json()
return self.json