diff --git a/mmgen/data/version b/mmgen/data/version index 7b3b6e02..3de2fb1e 100644 --- a/mmgen/data/version +++ b/mmgen/data/version @@ -1 +1 @@ -14.1.0 +15.0.dev0 diff --git a/test/clean.py b/test/clean.py new file mode 100755 index 00000000..9ed13cc9 --- /dev/null +++ b/test/clean.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python3 +# +# mmgen = Multi-Mode GENerator, a command-line cryptocurrency wallet +# Copyright (C)2013-2024 The MMGen Project +# Licensed under the GNU General Public License, Version 3: +# https://www.gnu.org/licenses +# Public project repositories: +# https://github.com/mmgen/mmgen-wallet +# https://gitlab.com/mmgen/mmgen-wallet + +""" +test/clean.py: Clean the test directory +""" + +import sys, os + +from mmgen.cfg import Config + +opts_data = { + 'text': { + 'desc': 'Clean the test directory', + 'usage':'[options]', + 'options': """ +-h, --help Print this help message +--, --longhelp Print help message for long options (common options) +""", + }, +} + +cfg = Config(opts_data=opts_data) + +repo_root = os.path.normpath(os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]), os.pardir))) +os.chdir(repo_root) +sys.path[0] = repo_root + +from test.overlay import get_overlay_tree_dir +overlay_tree_dir = get_overlay_tree_dir(repo_root) +if os.path.exists(overlay_tree_dir): + from shutil import rmtree + rmtree(overlay_tree_dir, ignore_errors=True) + print(f'Removed {os.path.relpath(overlay_tree_dir)!r}') + +from test.include.common import clean, set_globals + +set_globals(cfg) + +from test.include.cfg import clean_cfgs + +data_dir = Config.test_datadir +trash_dir = os.path.join('test', 'trash') +trash_dir2 = os.path.join('test', 'trash2') + +clean(clean_cfgs, extra_dirs=[data_dir, trash_dir, trash_dir2]) diff --git a/test/cmdtest.py b/test/cmdtest.py index a6885c14..9e074942 100755 --- a/test/cmdtest.py +++ b/test/cmdtest.py @@ -75,23 +75,11 @@ def create_shm_dir(data_dir,trash_dir): import sys, os, time, asyncio -if sys.argv[-1] == 'clean': - os.environ['MMGEN_TEST_SUITE'] = '1' - repo_root = os.path.normpath(os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]),os.pardir))) - os.chdir(repo_root) - sys.path[0] = repo_root - - from shutil import rmtree - from test.overlay import get_overlay_tree_dir - overlay_tree_dir = get_overlay_tree_dir(repo_root) - rmtree(overlay_tree_dir,ignore_errors=True) - print(f'Removed {os.path.relpath(overlay_tree_dir)!r}') -else: - # overlay must be set up before importing mmgen mods! - try: - from include.test_init import repo_root - except ImportError: - from test.include.test_init import repo_root +# overlay must be set up before importing mmgen mods! +try: + from include.test_init import repo_root +except ImportError: + from test.include.test_init import repo_root from mmgen.cfg import Config,gc from mmgen.color import red,yellow,green,blue,cyan,gray,nocolor,init_color @@ -102,7 +90,6 @@ from test.include.common import ( cmdtest_py_log_fn, cmdtest_py_error_fn, mk_tmpdir, - cleandir, iqmsg, omsg, omsg_r, @@ -110,6 +97,7 @@ from test.include.common import ( start_test_daemons, stop_test_daemons, init_coverage, + clean, ) try: @@ -267,17 +255,7 @@ else: if cfg.skipping_deps: cfg.no_daemon_autostart = True -from test.cmdtest_py_d.cfg import cfgs,fixup_cfgs - -for k in cfgs: - cfgs[k]['tmpdir'] = os.path.join('test','tmp',str(k)) - -fixup_cfgs() - -utils = { -# 'check_deps': 'check dependencies for specified command (WIP)', # TODO - 'clean': 'clean specified tmp dir(s) (specify by integer, no arg = all dirs)', -} +from test.cmdtest_py_d.cfg import cfgs def list_cmds(): @@ -303,13 +281,6 @@ def list_cmds(): (data if isinstance(data,str) else data[1]), w = cw ) - w = max(map(len,utils)) - - yield '\n'+green('AVAILABLE UTILITIES:') - - for cmd in sorted(utils): - yield f' {cmd:{w}} - {utils[cmd]}' - from mmgen.ui import do_pager do_pager('\n'.join(gen_output())) @@ -321,34 +292,6 @@ def do_between(): elif (cfg.verbose or cfg.exact_output) and not cfg.skipping_deps: sys.stderr.write('\n') -def list_tmpdirs(): - return {k:cfgs[k]['tmpdir'] for k in cfgs} - -def clean(usr_dirs=None,clean_overlay=True): - if cfg.skipping_deps: - return - all_dirs = list_tmpdirs() - dirnums = map(int,(usr_dirs if usr_dirs is not None else all_dirs)) - dirlist = list(map(str,sorted(dirnums))) - for d in dirlist: - if d in all_dirs: - cleandir(all_dirs[d]) - else: - die(1,f'{d}: invalid directory number') - if dirlist: - iqmsg(green('Cleaned tmp director{} {}'.format( - suf(dirlist,'ies'), - ' '.join(dirlist)) - )) - cleandir(data_dir) - cleandir(trash_dir) - cleandir(trash_dir2) - iqmsg(green(f'Cleaned directories {data_dir!r} {trash_dir!r} {trash_dir2!r}')) - - if clean_overlay: - cleandir(overlay_tree_dir) - iqmsg(green(f'Cleaned directory {os.path.relpath(overlay_tree_dir)!r}')) - def create_tmp_dirs(shm_dir): if sys.platform == 'win32': for cfg in sorted(cfgs): @@ -753,8 +696,8 @@ class CmdTestRunner: iqmsg(gray(f'INFO → skipping {m} (network={nw})')) return None - if do_clean: - clean(ct_cls.tmpdir_nums,clean_overlay=False) + if do_clean and not cfg.skipping_deps: + clean(cfgs, tmpdir_ids=ct_cls.tmpdir_nums, extra_dirs=[data_dir, trash_dir, trash_dir2]) if not quiet: bmsg('Executing ' + m) @@ -1042,9 +985,6 @@ if __name__ == '__main__': CmdGroupMgr().list_cmd_groups() elif cfg.list_cmds: list_cmds() - elif cmd_args and cmd_args[0] in utils: - globals()[cmd_args[0]](*cmd_args[1:]) - sys.exit(0) if cfg.pause: set_restore_term_at_exit() diff --git a/test/cmdtest_py_d/cfg.py b/test/cmdtest_py_d/cfg.py index 51afe850..c320e93a 100755 --- a/test/cmdtest_py_d/cfg.py +++ b/test/cmdtest_py_d/cfg.py @@ -231,6 +231,10 @@ cfgs = { # addr_idx_lists (except 31,32,33,34) must contain exactly 8 addresses def fixup_cfgs(): import os + + for k in cfgs: + cfgs[k]['tmpdir'] = os.path.join('test', 'tmp', str(k)) + for src,target in ( ('6','11'), ('7','12'), @@ -248,3 +252,5 @@ def fixup_cfgs(): if cfg.debug_utf8: for k in cfgs: cfgs[k]['tmpdir'] += '-α' + +fixup_cfgs() diff --git a/test/include/cfg.py b/test/include/cfg.py new file mode 100755 index 00000000..d66dfe43 --- /dev/null +++ b/test/include/cfg.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python3 +# +# mmgen = Multi-Mode GENerator, a command-line cryptocurrency wallet +# Copyright (C)2013-2024 The MMGen Project +# Licensed under the GNU General Public License, Version 3: +# https://www.gnu.org/licenses +# Public project repositories: +# https://github.com/mmgen/mmgen-wallet +# https://gitlab.com/mmgen/mmgen-wallet + +""" +test.include.cfg: Configuration for test scripts +""" + +from ..cmdtest_py_d.cfg import cfgs as clean_cfgs diff --git a/test/include/common.py b/test/include/common.py index acbdf2d8..86f12c95 100755 --- a/test/include/common.py +++ b/test/include/common.py @@ -25,7 +25,7 @@ from subprocess import run,PIPE from mmgen.cfg import gv from mmgen.color import yellow,green,orange -from mmgen.util import msg,msg_r,Msg,Msg_r,gmsg,die +from mmgen.util import msg, msg_r, Msg, Msg_r, gmsg, die, suf, fmt_list from mmgen.fileutil import write_data_to_file,get_data_from_file def noop(*args,**kwargs): @@ -127,16 +127,19 @@ def cleandir(d,do_msg=False): try: files = os.listdir(d_enc) except: - return + return None - from shutil import rmtree - if do_msg: - gmsg(f'Cleaning directory {d!r}') - for f in files: - try: - os.unlink(os.path.join(d_enc,f)) - except: - rmtree(os.path.join(d_enc,f),ignore_errors=True) + if files: + from shutil import rmtree + if do_msg: + gmsg(f'Cleaning directory {d!r}') + for f in files: + try: + os.unlink(os.path.join(d_enc, f)) + except: + rmtree(os.path.join(d_enc,f), ignore_errors=True) + + return files def mk_tmpdir(d): try: @@ -147,6 +150,34 @@ def mk_tmpdir(d): else: vmsg(f'Created directory {d!r}') +def clean(cfgs, tmpdir_ids=None, extra_dirs=[]): + + def clean_tmpdirs(): + cfg_tmpdirs = {k:cfgs[k]['tmpdir'] for k in cfgs} + for d in map(str, sorted(map(int, (tmpdir_ids or cfg_tmpdirs)))): + if d in cfg_tmpdirs: + if cleandir(cfg_tmpdirs[d]): + yield d + else: + die(1, f'{d}: invalid directory number') + + def clean_extra_dirs(): + for d in extra_dirs: + if os.path.exists(d): + if cleandir(d): + yield os.path.relpath(d) + + for clean_func, list_fmt in ( + (clean_tmpdirs, 'no_quotes'), + (clean_extra_dirs, 'dfl') + ): + if cleaned := list(clean_func()): + iqmsg(green('Cleaned director{} {}'.format( + suf(cleaned, 'ies'), + fmt_list(cleaned, fmt=list_fmt) + ))) + + def get_tmpfile(cfg,fn): return os.path.join(cfg['tmpdir'],fn) diff --git a/test/test-release.sh b/test/test-release.sh index fac8b535..b6c73020 100755 --- a/test/test-release.sh +++ b/test/test-release.sh @@ -396,7 +396,7 @@ remove_skipped_tests check_tests -test/cmdtest.py clean +test/clean.py start_time=$(date +%s)