From 0d31bf84af6af500ed1a5f49a6ed4a7288c3268b Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Mon, 15 Mar 2021 10:23:49 +0000 Subject: [PATCH] Opts.py: support multiline usage text --- mmgen/opts.py | 7 ++++--- mmgen/share/Opts.py | 29 +++++++++++++++++++++++------ 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/mmgen/opts.py b/mmgen/opts.py index 6260828b..4f9ee15a 100755 --- a/mmgen/opts.py +++ b/mmgen/opts.py @@ -35,7 +35,8 @@ opt = UserOpts() from .util import * def usage(): - Die(1,f'USAGE: {g.prog_name} {usage_txt}') + from mmgen.share import Opts + Die(1,Opts.make_usage_str(g.prog_name,'user',usage_data)) def version(): Die(0,fmt(""" @@ -268,8 +269,8 @@ def init(opts_data=None,add_opts=None,init_opts=None,opt_filter=None,parse_only= setattr(opt,o,po.user_opts[o] if o in po.user_opts else None) # Make this available to usage() - global usage_txt - usage_txt = opts_data['text']['usage'] + global usage_data + usage_data = opts_data['text'].get('usage2') or opts_data['text']['usage'] if opt.version: version() # exits diff --git a/mmgen/share/Opts.py b/mmgen/share/Opts.py index aa837229..cb7f6c12 100755 --- a/mmgen/share/Opts.py +++ b/mmgen/share/Opts.py @@ -25,9 +25,25 @@ from collections import namedtuple pat = re.compile(r'^-([a-zA-Z0-9-]), --([a-zA-Z0-9-]{2,64})(=| )(.+)') +def make_usage_str(prog_name,caller,data): + lines = [data.strip()] if type(data) == str else data + indent,col1_w = { + 'help': (2,len(prog_name)+1), + 'user': (0,len('USAGE:')), + }[caller] + def gen(): + ulbl = 'USAGE:' + for line in lines: + yield '{:{w}} {} {}'.format(ulbl,prog_name,line,w=col1_w) + ulbl = '' + return ('\n'+(' '*indent)).join(gen()) + def usage(opts_data): - print('USAGE: {} {}'.format(opts_data['prog_name'], opts_data['usage'])) - sys.exit(2) + print(make_usage_str( + prog_name = opts_data['prog_name'], + caller = 'user', + data = opts_data['text'].get('usage2') or opts_data['text']['usage'] )) + sys.exit(1) def print_help(proto,po,opts_data,opt_filter): @@ -59,8 +75,8 @@ def print_help(proto,po,opts_data,opt_filter): yield d[arg] if arg in d else text def gen_text(): - yield ' {:<{p}} {}'.format(pn.upper()+':',t['desc'].strip(),p=len(pn)+1) - yield '{:<{p}} {} {}'.format('USAGE:',pn,t['usage'].strip(),p=len(pn)+1) + yield ' {} {}'.format(pn.upper()+':',t['desc'].strip()) + yield make_usage_str(pn,'help',t.get('usage2') or t['usage']) yield opts_type.upper().replace('_',' ') + ':' # process code for options @@ -141,8 +157,9 @@ def parse_opts(opts_data,opt_filter=None,parse_only=False): short_opts.append(m[1] + ('',':')[m[3] == '=']) long_opts.append(m[2] + ('','=')[m[3] == '=']) - for opts_type in ('options','long_options'): - parse_lines(opts_type) + parse_lines('options') + if 'long_options' in opts_data['text']: + parse_lines('long_options') uopts,uargs = process_uopts(opts_data,short_opts,long_opts)