uhugo.cmd — uHugo 1.1.10 documentation

# Source code for uhugo.cmd

    import logging
    import os
    from typing import Text, Union, List

    import click
    from packaging import version
    from rich.console import Console
    from rich.panel import Panel

    from . import __version__
    from .checks import check_hugo, get_latest_version_api
    from .download import download_hugo_zip
    from .install import install_hugo
    from .post_install.detect_providers import check_hugo_file, check_providers_fs, Provider
    from .post_install.update_providers import UpdateProvider
    from .utils import humanise_list

    log = logging.getLogger(__name__)
    console = Console()

    @click.group(name="uhugo", help="uhugo is a Hugo binary helper that downloads and set ups the environment.")
    @click.option("--debug", help="Use debug mode", default=False, is_flag=True)
    @click.version_option(__version__, package_name="uHugo", prog_name="uHugo")
    @click.pass_context
    def cli(ctx: click.core.Context, debug: bool):
        ctx.ensure_object(dict)
        ctx.obj["debug"] = debug

        if debug:
            logging.basicConfig(
                level="DEBUG", format="%(asctime)s %(name)s - %(levelname)s:'%(message)s'", datefmt="%d-%b-%y %H:%M:%S"
            )

    @cli.command(help="Install latest Hugo binary files")
    @click.option("--version", "-v", "ver", default=None, help="Hugo version to download")
    @click.option("--force", is_flag=True, default=False, help="Reinstall Hugo")
    def install(ver: Text, force: bool):
        hugo = check_hugo()
        if hugo.exists and not force:
            click.echo(console.print("Hugo has already been installed. Use 'uhugo update' to update.", style="red"))
            return

        if force:
            log.debug(f"Deleting existing Hugo at {hugo.path}")
            os.remove(hugo.path)

        with console.status("Fetching latest version", spinner="dots"):
            _ver = get_latest_version_api(ver)
        click.echo(console.print(f"- Latest version is v{_ver}", style="yellow bold"), color=True)

        download_path = download_hugo_zip(_ver)

        with console.status(f"Installing Hugo {_ver}", spinner="dots"):
            installed_path = install_hugo(download_path)

        console.print("\nHugo installed! :tada:\n", style="green bold")

        console.print(Panel.fit(f"[bold green]Make sure {installed_path!r} is in your $PATH", title="Note"))

    @cli.command(help="Updates Hugo binary files and any associated configurations")
    @click.option("--to", default=None, help="Updates to a specified version")
    @click.option("--local", "only_hugo", is_flag=True, help="Updates only local Hugo binary while ignoring providers")
    @click.option("--cloud", "only_cloud", is_flag=True, help="Updates only cloud providers while ignoring Hugo")
    def update(to: Union[Text, None], only_hugo: bool, only_cloud: bool) -> None:
        hugo = check_hugo()
        if not hugo.exists:
            click.echo(console.print("Hugo is not installed. Use 'uhugo install' to install.", style="red"))
            return

        with console.status("Fetching latest version", spinner="dots"):
            _ver = get_latest_version_api(to)
            log.debug(f"Latest version is {_ver}")

        if (hugo.version >= version.Version(_ver)) and not to and not only_cloud:
            console.print("Hugo is up to date :tada:", style="green")
            return

        if not to and not (hugo.version >= version.Version(_ver)):
            console.print(
                Panel.fit(f"New version available, v{hugo.version} -> v{_ver}", title=f"Hugo v{_ver}"), style="green"
            )

        if not only_cloud:
            download_path = download_hugo_zip(_ver)

            with console.status(f"Installing Hugo {_ver}", spinner="dots"):
                install_hugo(download_path)

            console.print("\nLocal Hugo updated! :tada:\n", style="green bold")

        if only_cloud:
            console.print("Updating only the cloud providers :sun_behind_cloud:\n", style="yellow")

        # ignore cloud provider updates with --hugo flag
        if only_hugo:
            return

        with console.status("Checking providers", spinner="dots") as s:
            providers: List[Provider] = []
            provider = check_hugo_file()
            if provider.name:
                providers.append(provider)
            provider = check_providers_fs()
            providers.extend(provider)

            if not providers:
                return
            console.print(f"{humanise_list([_provider.name for _provider in providers])} found\n")

            s.update("Updating providers")

            try:
                updater = UpdateProvider(providers, console, _ver)
                updater.update()
            except Exception as e:
                log.debug(e)
                s.stop()

    def main():
        cli(obj={})