cli: pretty++

This commit is contained in:
Torrie Fischer 2023-07-01 14:46:34 +02:00
parent 3c77a3ef33
commit 44c7fb5f03
4 changed files with 102 additions and 26 deletions

View File

@ -15,13 +15,25 @@ def list_(ctx):
for repo in ctx.obj['config'].repositories():
click.echo("{} ({})".format(click.style(repo.name,bold=True), repo.path))
rows = []
currentPlugin = None
pluginVersions = []
for plugin in sorted(repo.plugins()):
if currentPlugin != plugin.name:
if currentPlugin is not None:
rows.append([
click.style(plugin.name, fg='green'),
click.style(str(plugin.version), fg='yellow')
click.style(currentPlugin, fg='green'),
click.style(', '.join(pluginVersions), fg='yellow')
])
currentPlugin = plugin.name
pluginVersions = []
pluginVersions.append(str(plugin.version))
if currentPlugin is not None:
rows.append([
click.style(currentPlugin, fg='green'),
click.style(', '.join(pluginVersions), fg='yellow')
])
if len(rows) > 0:
click.echo(columnar(rows, ['Plugin', 'Version'], no_borders=True))
click.echo(columnar(rows, ['Plugin', 'Versions'], no_borders=True))
else:
click.echo("No plugins found.")
for badFile in sorted(repo.badFiles()):

View File

@ -2,6 +2,7 @@ import click
from mpm.model import *
import pathlib
from mpm.config import ServerParamType
from columnar import columnar
@click.group(help='Add, remove, and synchronize Servers')
def server():
@ -18,8 +19,11 @@ def add(ctx, name, path):
@server.command('list', help='List configured servers')
@click.pass_context
def list_(ctx):
for server in ctx.obj['config'].servers():
@click.argument('servers', type=ServerParamType(), nargs=-1)
def list_(ctx, servers):
if len(servers) == 0:
servers = ctx.obj['config'].servers()
for server in servers:
click.echo('{} ({}):'.format(server.name, server.path))
serverPath = pathlib.Path(server.path)
if not serverPath.exists():
@ -46,22 +50,50 @@ def list_(ctx):
elif isinstance(state, SymlinkConflict):
conflicts.append(state)
click.echo("Installed plugins:")
rows = []
for state in sorted(installed):
click.echo("\t{} {}: {}".format(state.plugin.name, state.plugin.versionSpec, state.currentVersion))
click.echo("Oudated symlinks:")
rows.append([
state.plugin.name,
str(state.plugin.versionSpec),
str(state.currentVersion),
str(state.currentVersion),
])
for state in sorted(outdatedLinks):
click.echo("\t{} {}: Current: {} Wanted: {}".format(state.plugin.name, state.plugin.versionSpec, state.currentVersion, state.wantedVersion))
click.echo("Missing plugins:")
rows.append([
state.plugin.name,
click.style(str(state.wantedVersion), fg='green'),
click.style(str(state.currentVersion), fg='yellow'),
click.style(str(state.plugin.versionSpec), fg='green')
])
for state in sorted(missing):
click.echo("\t{}: {}".format(state.plugin.name, state.plugin.versionSpec))
click.echo("Unmanaged files:")
rows.append([
click.style(state.plugin.name, fg='red'),
click.style(str(state.plugin.versionSpec), fg='yellow'),
click.style('Missing', fg='red'),
click.style('Missing', fg='red')
])
for state in sorted(unmanaged):
click.echo("\t{}".format(state.filename))
click.echo("Symlink Conflicts:")
rows.append([
click.style(state.filename, fg='yellow'),
'?',
click.style('Unmanaged', fg='yellow', bold=True),
''
])
for state in sorted(conflicts):
rows.append([
state.plugin.name,
click.style(str(state.plugin.versionSpec), fg='yellow'),
click.style('Symlink Conflict', fg='red', bold=True),
click.style(str(state.plugin.versionSpec), fg='yellow'),
])
click.echo("\t{}.jar".format(state.plugin.name))
if len(rows) > 0:
click.echo(columnar(rows, ['Plugin', 'Wanted', 'Installed',
'Available'], no_borders=True))
else:
click.echo(click.style('No plugins configured!', fg='yellow'))
@server.command(help='Add a plugin to a server')
@click.pass_context
@click.argument('server', type=ServerParamType())
@ -100,10 +132,9 @@ def add_plugin(ctx, server, plugins):
else:
click.echo("Cancelled.")
@server.command(help="Synchronize a server's plugins")
@click.pass_context
@click.argument('servers', type=ServerParamType, nargs=-1)
@click.argument('servers', type=ServerParamType(), nargs=-1)
def sync(ctx, servers):
allServers = ctx.obj['config'].servers()
if len(servers) > 0:
@ -121,17 +152,37 @@ def sync(ctx, servers):
elif isinstance(state, MissingVersions):
missing.append(state)
click.echo("Plugins to update:")
rows = []
for state in sorted(outdatedLinks):
click.echo("\t{} {}: Current: {} Wanted: {}".format(state.plugin.name, state.plugin.versionSpec, state.currentVersion, state.wantedVersion))
click.echo("New plugins to install:")
rows.append([
state.plugin.name,
click.style(str(state.wantedVersion), fg='green'),
click.style(str(state.currentVersion), fg='yellow'),
click.style(str(state.plugin.versionSpec), fg='green')
])
for state in sorted(available):
click.echo("\t{}: {}".format(state.plugin.name, state.plugin.version))
rows.append([
state.plugin.name,
click.style(str(state.wantedVersion), fg='green'),
click.style('Missing', fg='red'),
click.style(str(state.plugin.version), fg='green')
])
click.echo("Missing plugins:")
for state in sorted(missing):
click.echo("\t{} {}".format(click.style(state.plugin.name, fg='red'),
click.style(str(state.plugin.versionSpec),
fg='yellow')))
rows.append([
click.style(state.plugin.name, fg='red'),
click.style(str(state.plugin.versionSpec), fg='yellow'),
click.style('Missing', fg='red'),
click.style('Missing', fg='red')
])
if len(rows) > 0:
click.echo(columnar(rows, ['Plugin', 'Wanted', 'Installed',
'Available'], no_borders=True))
if len(outdatedLinks) > 0 or len(available) > 0:
click.echo("Apply changes? [y/N]", nl=False)
answer = click.getchar().lower()

View File

@ -83,6 +83,9 @@ class OutdatedSymlink(PluginState):
self.currentVersion = currentVersion
self.wantedVersion = wantedVersion
def __str__(self):
return 'OutdatedSymlink({})'.format(self.plugin)
class SymlinkConflict(PluginState):
pass
@ -90,10 +93,17 @@ class MissingVersions(PluginState):
pass
class Available(PluginState):
def __init__(self, repoPlugin):
def __init__(self, repoPlugin, wantedVersion):
super().__init__(repoPlugin)
self.wantedVersion = wantedVersion
def __str__(self):
return 'Available({})'.format(self.plugin)
class Installed(PluginState):
def __init__(self, plugin, currentVersion):
super().__init__(plugin)
self.currentVersion = currentVersion
def __str__(self):
return 'Installed({} @ )'.format(self.plugin, self.currentVersion)

View File

@ -42,7 +42,7 @@ class Server:
yield MissingVersions(plugin)
else:
preferredVersion = list(reversed(sorted(compatibleVersions)))[0]
yield Available(preferredVersion)
yield Available(preferredVersion, plugin.versionSpec)
else:
preferredVersion = list(reversed(sorted(compatibleVersions)))[0]
currentVersion = self.currentVersionForPlugin(plugin.name)
@ -97,4 +97,7 @@ class Server:
if not os.path.exists(os.path.join(self.pluginPath, 'versions')):
os.path.mkdir(os.path.join(self.pluginPath, 'versions'))
dest = os.path.join(self.pluginPath, 'versions/{}-{}.jar'.format(plugin.name, plugin.version))
try:
os.link(plugin.path, dest)
except Exception:
shutil.copyfile(plugin.path, dest)