Browse Source

Opts.py: support multiline usage text

The MMGen Project 4 years ago
parent
commit
0d31bf84af
2 changed files with 27 additions and 9 deletions
  1. 4 3
      mmgen/opts.py
  2. 23 6
      mmgen/share/Opts.py

+ 4 - 3
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

+ 23 - 6
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)