Browse Source

opts.py: print help screen only after full initialization of opts

The MMGen Project 2 years ago
parent
commit
015afee89f
3 changed files with 18 additions and 20 deletions
  1. 2 2
      mmgen/help.py
  2. 12 13
      mmgen/opts.py
  3. 4 5
      mmgen/share/Opts.py

+ 2 - 2
mmgen/help.py

@@ -20,7 +20,7 @@
 help: help notes for MMGen suite commands
 """
 
-def help_notes_func(proto,po,k):
+def help_notes_func(proto,opt,k):
 	from .globalvars import g
 
 	def fee_spec_letters(use_quotes=False):
@@ -91,7 +91,7 @@ def help_notes_func(proto,po,k):
 			from .keygen import get_backends
 			from .addr import MMGenAddrType
 			backends = get_backends(
-				MMGenAddrType(proto,po.user_opts.get('type') or proto.dfl_mmtype).pubkey_type
+				MMGenAddrType(proto,opt.type or proto.dfl_mmtype).pubkey_type
 			)
 			return ' '.join( f'{n}:{k}{" [default]" if n==1 else ""}' for n,k in enumerate(backends,1) )
 

+ 12 - 13
mmgen/opts.py

@@ -55,14 +55,14 @@ def delete_data(opts_data):
 	del mmgen.share.Opts.parse_opts
 
 def post_init():
-	global po_save,opts_data_save,opt_filter_save
-	if po_save.user_opts.get('help') or po_save.user_opts.get('longhelp'):
-		print_help(po_save,opts_data_save,opt_filter_save)
+	global opts_data_save,opt_filter_save
+	if opt.help or opt.longhelp:
+		print_help(opt,opts_data_save,opt_filter_save)
 	else:
 		delete_data(opts_data_save)
-		del po_save,opts_data_save,opt_filter_save
+		del opts_data_save,opt_filter_save
 
-def print_help(po,opts_data,opt_filter):
+def print_help(opt,opts_data,opt_filter):
 	if not 'code' in opts_data:
 		opts_data['code'] = {}
 
@@ -82,7 +82,7 @@ def print_help(po,opts_data,opt_filter):
 	do_pager(
 		mmgen.share.Opts.make_help(
 			proto,
-			po,
+			opt,
 			opts_data,
 			opt_filter ))
 
@@ -408,11 +408,6 @@ def init(
 
 	# === end global var initialization === #
 
-	# print help screen only after global vars are initialized:
-	if getattr(opt,'help',None) or getattr(opt,'longhelp',None):
-		if not do_post_init:
-			print_help(po,opts_data,opt_filter) # exits
-
 	if need_proto:
 		from .protocol import warn_trustlevel
 		warn_trustlevel(g.coin)
@@ -441,9 +436,13 @@ def init(
 	g.lock()
 	opt.lock()
 
+	# print help screen only after globals and opts initialized and locked:
+	if opt.help or opt.longhelp:
+		if not do_post_init:
+			print_help(opt,opts_data,opt_filter) # exits
+
 	if do_post_init:
-		global po_save,opts_data_save,opt_filter_save
-		po_save = po
+		global opts_data_save,opt_filter_save
 		opts_data_save = opts_data
 		opt_filter_save = opt_filter
 	else:

+ 4 - 5
mmgen/share/Opts.py

@@ -49,7 +49,7 @@ def print_help(*args):
 	print(make_help(*args))
 	sys.exit(0)
 
-def make_help(proto,po,opts_data,opt_filter):
+def make_help(proto,opt,opts_data,opt_filter):
 
 	def parse_lines(text):
 		filtered = False
@@ -62,7 +62,7 @@ def make_help(proto,po,opts_data,opt_filter):
 			elif not filtered:
 				yield line
 
-	opts_type,fs = ('options','{:<3} --{} {}') if 'help' in po.user_opts else ('long_options','{}  --{} {}')
+	opts_type,fs = ('options','{:<3} --{} {}') if opt.help else ('long_options','{}  --{} {}')
 	t = opts_data['text']
 	c = opts_data['code']
 	nl = '\n  '
@@ -71,7 +71,7 @@ def make_help(proto,po,opts_data,opt_filter):
 
 	from mmgen.help import help_notes_func
 	def help_notes(k):
-		return help_notes_func(proto,po,k)
+		return help_notes_func(proto,opt,k)
 
 	def gen_arg_tuple(func,text):
 		d = {'proto': proto,'help_notes':help_notes}
@@ -166,8 +166,7 @@ def parse_opts(opts_data,opt_filter=None,parse_only=False):
 
 	uopts,uargs = process_uopts(opts_data,short_opts,long_opts)
 
-	po = namedtuple('parsed_cmd_opts',['user_opts','cmd_args','opts','skipped_opts'])
-	return po(
+	return namedtuple('parsed_cmd_opts',['user_opts','cmd_args','opts','skipped_opts'])(
 		uopts, # dict
 		uargs, # list, callers can pop
 		tuple(o.replace('-','_').rstrip('=') for o in long_opts),