diff --git a/CHANGELOG.md b/CHANGELOG.md index 2de32241..24118dda 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,9 @@ - Add startup for `fcgiwrap.service` because sometimes it did not start automatically. ([#657](https://github.com/chatmail/relay/pull/657)) +- Add `cmdeploy init --force` command for recreating chatmail.ini + ([#656](https://github.com/chatmail/relay/pull/656)) + - Increase maxproc for reinjecting ports from 10 to 100 ([#646](https://github.com/chatmail/relay/pull/646)) diff --git a/cmdeploy/src/cmdeploy/cmdeploy.py b/cmdeploy/src/cmdeploy/cmdeploy.py index 180296a9..66e37c04 100644 --- a/cmdeploy/src/cmdeploy/cmdeploy.py +++ b/cmdeploy/src/cmdeploy/cmdeploy.py @@ -25,6 +25,9 @@ from .sshexec import SSHExec # cmdeploy sub commands and options # +def is_pytest(): + return "PYTEST_CURRENT_TEST" in os.environ + def init_cmd_options(parser): parser.add_argument( @@ -32,18 +35,28 @@ def init_cmd_options(parser): action="store", help="fully qualified DNS domain name for your chatmail instance", ) + parser.add_argument( + "--force", + dest="recreate_ini", + action="store_true", + help="force reacreate ini file", + ) def init_cmd(args, out): """Initialize chatmail config file.""" mail_domain = args.chatmail_domain + inipath = args.inipath if args.inipath.exists(): - print(f"Path exists, not modifying: {args.inipath}") - return 1 - else: - write_initial_config(args.inipath, mail_domain, overrides={}) - out.green(f"created config file for {mail_domain} in {args.inipath}") + if not args.recreate_ini: + out.green(f"[WARNING] Path exists, not modifying: {inipath}") + return 1 + else: + out.yellow(f"[WARNING] Force argument was provided, deleting config file: {inipath}") + inipath.unlink() + write_initial_config(inipath, mail_domain, overrides={}) + out.green(f"created config file for {mail_domain} in {inipath}") def run_cmd_options(parser): parser.add_argument( @@ -263,11 +276,20 @@ class Out: def red(self, msg, file=sys.stderr): print(colored(msg, "red"), file=file) - def green(self, msg, file=sys.stderr): + def green(self, msg, file=sys.stdout): print(colored(msg, "green"), file=file) - def __call__(self, msg, red=False, green=False, file=sys.stdout): - color = "red" if red else ("green" if green else None) + def yellow(self, msg, file=sys.stdout): + print(colored(msg, "yellow"), file=file) + + def __call__(self, msg, red=False, green=False, yellow=False, file=sys.stdout): + color = None + if red: + color = "red" + elif green: + color = "green" + elif yellow: + color = "yellow" print(colored(msg, color), file=file) def check_call(self, arg, env=None, quiet=False): @@ -352,6 +374,12 @@ def main(args=None): args.get_sshexec = get_sshexec out = Out() + if is_pytest(): ## issue: https://github.com/chatmail/relay/issues/622 + out.green = print + out.red = print + out.yellow = print + out.__call__ = print + kwargs = {} if args.func.__name__ not in ("init_cmd", "fmt_cmd"): if not args.inipath.exists(): diff --git a/cmdeploy/src/cmdeploy/tests/test_cmdeploy.py b/cmdeploy/src/cmdeploy/tests/test_cmdeploy.py index bdbc3db0..d72f427d 100644 --- a/cmdeploy/src/cmdeploy/tests/test_cmdeploy.py +++ b/cmdeploy/src/cmdeploy/tests/test_cmdeploy.py @@ -25,11 +25,17 @@ class TestCmdline: def test_init_not_overwrite(self, capsys): assert main(["init", "chat.example.org"]) == 0 - capsys.readouterr() + out, err = capsys.readouterr() + assert "created config file" in out.lower() + assert main(["init", "chat.example.org"]) == 1 out, err = capsys.readouterr() assert "path exists" in out.lower() + assert main(["init", "chat.example.org", "--force"]) == 0 + out, err = capsys.readouterr() + assert "deleting config file" in out.lower() + def test_www_folder(example_config, tmp_path): reporoot = importlib.resources.files(__package__).joinpath("../../../../").resolve()