diff --git a/chatmaild/src/chatmaild/config.py b/chatmaild/src/chatmaild/config.py index ec323142..ae5f4423 100644 --- a/chatmaild/src/chatmaild/config.py +++ b/chatmaild/src/chatmaild/config.py @@ -33,7 +33,7 @@ class Config: self.password_min_length = int(params["password_min_length"]) self.passthrough_senders = params["passthrough_senders"].split() self.passthrough_recipients = params["passthrough_recipients"].split() - self.www_folder = params.get("www_folder") + self.www_folder = params.get("www_folder", "") self.filtermail_smtp_port = int(params["filtermail_smtp_port"]) self.filtermail_smtp_port_incoming = int( params["filtermail_smtp_port_incoming"] diff --git a/cmdeploy/src/cmdeploy/__init__.py b/cmdeploy/src/cmdeploy/__init__.py index 6aa7c5b0..4523be1d 100644 --- a/cmdeploy/src/cmdeploy/__init__.py +++ b/cmdeploy/src/cmdeploy/__init__.py @@ -618,7 +618,7 @@ def deploy_chatmail(config_path: Path, disable_mail: bool) -> None: check_config(config) mail_domain = config.mail_domain - from .www import build_webpages + from .www import build_webpages, get_paths server.group(name="Create vmail group", group="vmail", system=True) server.user(name="Create vmail user", user="vmail", group="vmail", system=True) @@ -751,24 +751,16 @@ def deploy_chatmail(config_path: Path, disable_mail: bool) -> None: packages=["fcgiwrap"], ) - reporoot = importlib.resources.files(__package__).joinpath("../../../").resolve() - www_path = Path(config.www_folder) - # if www_folder was not set, use default directory - if not config.www_folder: - www_path = reporoot.joinpath("www") + www_path, src_dir, build_dir = get_paths(config) # if www_folder was set to a non-existing folder, skip upload if not www_path.is_dir(): logger.warning("Building web pages is disabled in chatmail.ini, skipping") else: - build_dir = www_path.joinpath("build") - src_dir = www_path.joinpath("src") # if www_folder is a hugo page, build it - if src_dir.joinpath("index.md").is_file(): - build_webpages(src_dir, build_dir, config) + if build_dir: + www_path = build_webpages(src_dir, build_dir, config) # if it is not a hugo page, upload it as is - else: - build_dir = www_path - files.rsync(f"{build_dir}/", "/var/www/html", flags=["-avz"]) + files.rsync(f"{www_path}/", "/var/www/html", flags=["-avz"]) _install_remote_venv_with_chatmaild(config) debug = False diff --git a/cmdeploy/src/cmdeploy/tests/test_cmdeploy.py b/cmdeploy/src/cmdeploy/tests/test_cmdeploy.py index 3084c8ec..bdbc3db0 100644 --- a/cmdeploy/src/cmdeploy/tests/test_cmdeploy.py +++ b/cmdeploy/src/cmdeploy/tests/test_cmdeploy.py @@ -1,8 +1,10 @@ +import importlib import os import pytest from cmdeploy.cmdeploy import get_parser, main +from cmdeploy.www import get_paths @pytest.fixture(autouse=True) @@ -27,3 +29,28 @@ class TestCmdline: assert main(["init", "chat.example.org"]) == 1 out, err = capsys.readouterr() assert "path exists" in out.lower() + + +def test_www_folder(example_config, tmp_path): + reporoot = importlib.resources.files(__package__).joinpath("../../../../").resolve() + assert not example_config.www_folder + www_path, src_dir, build_dir = get_paths(example_config) + assert www_path.absolute() == reporoot.joinpath("www").absolute() + assert src_dir == reporoot.joinpath("www").joinpath("src") + assert build_dir == reporoot.joinpath("www").joinpath("build") + example_config.www_folder = "disabled" + www_path, _, _ = get_paths(example_config) + assert not www_path.is_dir() + example_config.www_folder = str(tmp_path) + www_path, src_dir, build_dir = get_paths(example_config) + assert www_path == tmp_path + assert not src_dir.exists() + assert not build_dir + src_path = tmp_path.joinpath("src") + os.mkdir(src_path) + with open(src_path / "index.md", "w") as f: + f.write("# Test") + www_path, src_dir, build_dir = get_paths(example_config) + assert www_path == tmp_path + assert src_dir == src_path + assert build_dir == tmp_path.joinpath("build") diff --git a/cmdeploy/src/cmdeploy/www.py b/cmdeploy/src/cmdeploy/www.py index 253cc527..c013d741 100644 --- a/cmdeploy/src/cmdeploy/www.py +++ b/cmdeploy/src/cmdeploy/www.py @@ -31,9 +31,25 @@ def prepare_template(source): return render_vars, page_layout -def build_webpages(src_dir, build_dir, config): +def get_paths(config) -> (Path, Path, Path): + reporoot = importlib.resources.files(__package__).joinpath("../../../").resolve() + www_path = Path(config.www_folder) + # if www_folder was not set, use default directory + if config.www_folder == "": + www_path = reporoot.joinpath("www") + src_dir = www_path.joinpath("src") + # if www_folder is a hugo page, build it + if src_dir.joinpath("index.md").is_file(): + build_dir = www_path.joinpath("build") + # if it is not a hugo page, upload it as is + else: + build_dir = None + return www_path, src_dir, build_dir + + +def build_webpages(src_dir, build_dir, config) -> Path: try: - _build_webpages(src_dir, build_dir, config) + return _build_webpages(src_dir, build_dir, config) except Exception: print(traceback.format_exc()) @@ -107,17 +123,11 @@ def main(): config = read_config(inipath) config.webdev = True assert config.mail_domain - www_path = Path(config.www_folder) - if not config.www_folder: - www_path = reporoot.joinpath("www") - src_path = www_path.joinpath("src") - stats = None - build_dir = www_path.joinpath("build") - src_dir = www_path.joinpath("src") - index_path = build_dir.joinpath("index.html") # start web page generation, open a browser and wait for changes - build_webpages(src_dir, build_dir, config) + www_path, src_path, build_dir = get_paths(config) + build_dir = build_webpages(src_path, build_dir, config) + index_path = build_dir.joinpath("index.html") webbrowser.open(str(index_path)) stats = snapshot_dir_stats(src_path) print(f"\nOpened URL: file://{index_path.resolve()}\n") @@ -138,7 +148,7 @@ def main(): changenum += 1 stats = newstats - build_webpages(src_dir, build_dir, config) + build_webpages(src_path, build_dir, config) print(f"[{changenum}] regenerated web pages at: {index_path}") print(f"URL: file://{index_path.resolve()}\n\n") count = 0