From 609e4a04d22163f71ac3465e305affea854badf1 Mon Sep 17 00:00:00 2001 From: MMGen Date: Thu, 28 Feb 2019 10:48:20 +0000 Subject: [PATCH] opts.init(): delay creation of data dir, add 'parse_only' option --- mmgen/common.py | 6 ------ mmgen/opts.py | 53 ++++++++++++++++++++++++++----------------------- 2 files changed, 28 insertions(+), 31 deletions(-) diff --git a/mmgen/common.py b/mmgen/common.py index 4da32718..e2969c7a 100755 --- a/mmgen/common.py +++ b/mmgen/common.py @@ -27,12 +27,6 @@ import mmgen.opts as opts from mmgen.opts import opt from mmgen.util import * -def set_debug_all(): - if os.getenv('MMGEN_DEBUG_ALL'): - for name in g.env_opts: - if name[:11] == 'MMGEN_DEBUG': - os.environ[name] = '1' - def help_notes(k): from mmgen.seed import SeedSource from mmgen.tx import MMGenTX diff --git a/mmgen/opts.py b/mmgen/opts.py index a176fe40..a7a7a5e9 100755 --- a/mmgen/opts.py +++ b/mmgen/opts.py @@ -75,10 +75,6 @@ def opt_postproc_initializations(): from mmgen.term import set_terminal_vars set_terminal_vars() - # testnet data_dir differs from data_dir_root, so check or create - from mmgen.util import msg,die,check_or_create_dir - check_or_create_dir(g.data_dir) # dies on error - from mmgen.color import init_color init_color(enable_color=g.color,num_colors=('auto',256)[bool(g.force_256_color)]) @@ -187,13 +183,10 @@ Are you sure you want to continue? if not keypress_confirm(m,default_yes=True): sys.exit(0) -def init(opts_f,add_opts=[],opt_filter=None): - - from mmgen.protocol import CoinProtocol,BitcoinProtocol,init_genonly_altcoins - g.proto = BitcoinProtocol # this must be initialized to something before opts_f is called - +def get_common_opts_data(): # most, but not all, of these set the corresponding global var - common_opts_data = """ + from mmgen.protocol import CoinProtocol + return """ --, --accept-defaults Accept defaults at all prompts --, --coin=c Choose coin unit. Default: {cu_dfl}. Options: {cu_all} --, --token=t Specify an ERC20 token by address or symbol @@ -216,18 +209,20 @@ def init(opts_f,add_opts=[],opt_filter=None): cu_dfl=g.coin, cu_all=' '.join(CoinProtocol.coins)) - opts_data = opts_f() - opts_data['long_options'] = common_opts_data +def init(opts_f,add_opts=[],opt_filter=None,parse_only=False): - version_info = """ - {pgnm_uc} version {g.version} - Part of the {pnm} suite, an online/offline cryptocoin wallet for the command line. - Copyright (C) {g.Cdates} {g.author} {g.email} - """.format(pnm=g.proj_name, g=g, pgnm_uc=g.prog_name.upper()).strip() + from mmgen.protocol import CoinProtocol,BitcoinProtocol,init_genonly_altcoins + g.proto = BitcoinProtocol # this must be initialized to something before opts_f is called + + opts_data = opts_f() + opts_data['long_options'] = get_common_opts_data() uopts,args,short_opts,long_opts,skipped_opts,do_help = \ mmgen.share.Opts.parse_opts(sys.argv,opts_data,opt_filter=opt_filter,skip_help=True) + if parse_only: + return uopts,args,short_opts,long_opts,skipped_opts,do_help + if g.debug_opts: opt_preproc_debug(short_opts,long_opts,skipped_opts,uopts,args) # Save this for usage() @@ -239,10 +234,17 @@ def init(opts_f,add_opts=[],opt_filter=None): g.required_opts + g.common_opts: setattr(opt,o,uopts[o] if o in uopts else None) - if opt.version: Die(0,version_info) + if opt.version: Die(0,""" + {pn} version {g.version} + Part of the {g.proj_name} suite, an online/offline cryptocoin wallet for the command line. + Copyright (C) {g.Cdates} {g.author} {g.email} + """.format(g=g,pn=g.prog_name.upper()).lstrip('\n').rstrip()) - from mmgen.common import set_debug_all - set_debug_all() + + if os.getenv('MMGEN_DEBUG_ALL'): + for name in g.env_opts: + if name[:11] == 'MMGEN_DEBUG': + os.environ[name] = '1' # === Interaction with global vars begins here === @@ -294,31 +296,32 @@ def init(opts_f,add_opts=[],opt_filter=None): if do_help: # print help screen only after global vars are initialized opts_data = opts_f() - opts_data['long_options'] = common_opts_data + opts_data['long_options'] = get_common_opts_data() if g.debug_utf8: for k in opts_data: if type(opts_data[k]) == str: opts_data[k] += '-α' - mmgen.share.Opts.parse_opts(sys.argv,opts_data,opt_filter=opt_filter) + mmgen.share.Opts.parse_opts(sys.argv,opts_data,opt_filter=opt_filter) # exits if g.bob or g.alice: g.testnet = True g.regtest = True g.proto = CoinProtocol(g.coin,g.testnet) g.data_dir = os.path.join(g.data_dir_root,'regtest',g.coin.lower(),('alice','bob')[g.bob]) - check_or_create_dir(g.data_dir) from . import regtest as rt g.rpc_host = 'localhost' g.rpc_port = rt.rpc_port g.rpc_user = rt.rpc_user g.rpc_password = rt.rpc_password + check_or_create_dir(g.data_dir) # g.data_dir is finalized, so now we can do this + if g.regtest and hasattr(g.proto,'bech32_hrp_rt'): g.proto.bech32_hrp = g.proto.bech32_hrp_rt # Check user-set opts without modifying them if not check_opts(uopts): - sys.exit(1) + die(1,'Options checking failed') if hasattr(g,'cfg_options_changed'): ymsg("Warning: config file options have changed! See '{}' for details".format(g.cfg_file+'.sample')) @@ -510,7 +513,7 @@ def check_opts(usr_opts): # Returns false if any check fails except: die(1,m.format(g.proj_name.lower())) elif key == 'locktime': if not opt_is_int(val,desc): return False - if not opt_compares(val,'>',0,desc): return False + if not opt_compares(int(val),'>',0,desc): return False elif key == 'token': if not 'token' in g.proto.caps: msg("Coin '{}' does not support the --token option".format(g.coin))