adding ability to edit storage meta with default editor

pull/6/head
deadc0de6 7 years ago
parent 2e5424a337
commit 6e80026fcb

@ -19,6 +19,7 @@ from .logger import Logger
from .catalog import Catalog from .catalog import Catalog
from .walker import Walker from .walker import Walker
from .noder import Noder from .noder import Noder
from .utils import *
NAME = 'catcli' NAME = 'catcli'
CUR = os.path.dirname(os.path.abspath(__file__)) CUR = os.path.dirname(os.path.abspath(__file__))
@ -41,6 +42,7 @@ Usage:
{1} rm [--catalog=<path>] [-fV] <storage> {1} rm [--catalog=<path>] [-fV] <storage>
{1} tree [--catalog=<path>] [-V] [<path>] {1} tree [--catalog=<path>] [-V] [<path>]
{1} rename [--catalog=<path>] [-fV] <storage> <name> {1} rename [--catalog=<path>] [-fV] <storage> <name>
{1} edit [--catalog=<path>] [-fV] <storage>
{1} graph [--catalog=<path>] [-V] [<path>] {1} graph [--catalog=<path>] [-V] [<path>]
{1} help {1} help
{1} --help {1} --help
@ -73,7 +75,8 @@ def cmd_index(args, noder, catalog, top):
return False return False
start = datetime.datetime.now() start = datetime.datetime.now()
walker = Walker(noder, nohash=nohash) walker = Walker(noder, nohash=nohash)
root = noder.storage_node(name, path, parent=top, attr=args['--meta']) attr = noder.clean_storage_attr(args['--meta'])
root = noder.storage_node(name, path, parent=top, attr=attr)
_, cnt = walker.index(path, name, parent=root, parentpath=path) _, cnt = walker.index(path, name, parent=root, parentpath=path)
if subsize: if subsize:
noder.rec_size(root) noder.rec_size(root)
@ -104,8 +107,8 @@ def cmd_rm(args, noder, catalog, top):
if what in storages: if what in storages:
node = next(filter(lambda x: x.name == what, top.children)) node = next(filter(lambda x: x.name == what, top.children))
node.parent = None node.parent = None
catalog.save(top) if catalog.save(top):
Logger.info('Storage \"{}\" removed'.format(what)) Logger.info('Storage \"{}\" removed'.format(what))
else: else:
Logger.err('Storage named \"{}\" does not exist'.format(what)) Logger.err('Storage named \"{}\" does not exist'.format(what))
return top return top
@ -139,8 +142,25 @@ def cmd_rename(args, noder, catalog, top):
if storage in storages: if storage in storages:
node = next(filter(lambda x: x.name == storage, top.children)) node = next(filter(lambda x: x.name == storage, top.children))
node.name = new node.name = new
catalog.save(top) if catalog.save(top):
Logger.info('Storage \"{}\" renamed to \"{}\"'.format(storage, new)) Logger.info('Storage \"{}\" renamed to \"{}\"'.format(storage, new))
else:
Logger.err('Storage named \"{}\" does not exist'.format(storage))
return top
def cmd_edit(args, noder, catalog, top):
storage = args['<storage>']
storages = list(x.name for x in top.children)
if storage in storages:
node = next(filter(lambda x: x.name == storage, top.children))
attr = node.attr
if not attr:
attr = ''
new = edit(attr)
node.attr = noder.clean_storage_attr(new)
if catalog.save(top):
Logger.info('Storage \"{}\" edited'.format(storage))
else: else:
Logger.err('Storage named \"{}\" does not exist'.format(storage)) Logger.err('Storage named \"{}\" does not exist'.format(storage))
return top return top
@ -190,6 +210,8 @@ def main():
cmd_graph(args, noder, top) cmd_graph(args, noder, top)
elif args['rename']: elif args['rename']:
cmd_rename(args, noder, catalog, top) cmd_rename(args, noder, catalog, top)
elif args['edit']:
cmd_edit(args, noder, catalog, top)
return True return True

@ -32,7 +32,7 @@ class Logger:
''' print a storage node ''' ''' print a storage node '''
end = '' end = ''
if attr: if attr:
end = ' {}({}){}'.format(Logger.GRAY, ','.join(attr), Logger.RESET) end = ' {}({}){}'.format(Logger.GRAY, attr, Logger.RESET)
s = '{}{}storage{}:'.format(pre, Logger.UND, Logger.RESET) s = '{}{}storage{}:'.format(pre, Logger.UND, Logger.RESET)
s += ' {}{}{}{}'.format(Logger.PURPLE, name, Logger.RESET, end) s += ' {}{}{}{}'.format(Logger.PURPLE, name, Logger.RESET, end)
sys.stdout.write(s+'\n') sys.stdout.write(s+'\n')

@ -45,6 +45,11 @@ class Noder:
''' return a list of all storage names ''' ''' return a list of all storage names '''
return [x.name for x in list(top.children)] return [x.name for x in list(top.children)]
def clean_storage_attr(self, attr):
if not attr:
return ''
return ', '.join(attr.splitlines())
def get_node(self, top, path): def get_node(self, top, path):
''' get the node at path ''' ''' get the node at path '''
r = anytree.resolver.Resolver('name') r = anytree.resolver.Resolver('name')

@ -7,6 +7,9 @@ helpers
import os import os
import hashlib import hashlib
import sys
import tempfile
import subprocess
# local imports # local imports
from catcli.logger import Logger from catcli.logger import Logger
@ -49,3 +52,16 @@ def ask(question):
''' ask the user what to do ''' ''' ask the user what to do '''
resp = input('{} [y|N] ? '.format(question)) resp = input('{} [y|N] ? '.format(question))
return resp.lower() == 'y' return resp.lower() == 'y'
def edit(string):
''' edit the information with the default EDITOR '''
string = string.encode('utf-8')
EDITOR = os.environ.get('EDITOR','vim')
with tempfile.NamedTemporaryFile(prefix='catcli', suffix='.tmp') as f:
f.write(string)
f.flush()
subprocess.call([EDITOR, f.name])
f.seek(0)
new = f.read()
return new.decode('utf-8')

Loading…
Cancel
Save