Files
bake/bashf/cli.py
T
2019-09-15 10:20:38 -04:00

132 lines
3.1 KiB
Python

import sys
import click
import crayons
from .bashfile import Bashfile
def indent(line):
return f'{" " * 4}{line}'
@click.command()
@click.argument(
"task",
type=click.STRING,
default="__LIST_ALL__",
envvar="BASHFILE_TASK",
# required=False,
)
@click.option(
"--bashfile",
"-b",
default="__BASHFILE__",
envvar="BASHFILE_PATH",
nargs=1,
type=click.Path(),
)
@click.option("--list", "-l", "_list", default=False, is_flag=True)
@click.option("--debug", default=False, is_flag=True, hidden=True)
@click.option("--shellcheck", default=False, is_flag=True, hidden=True)
@click.option(
"--environ",
"-e",
nargs=2,
type=click.STRING,
multiple=True,
help="task environment variable (can be passed multiple times).",
)
@click.option(
"--fail",
"-x",
is_flag=True,
type=click.BOOL,
help="Fail immediately, if any task fails.",
)
@click.option(
"--arg",
"-a",
nargs=1,
type=click.STRING,
multiple=True,
help="task ARGV arguments (can be passed multiple times).",
)
@click.option("--quiet", "-q", is_flag=True, type=click.BOOL, help="Reduce output.")
@click.option(
"--environ-json",
"-j",
nargs=1,
type=click.STRING,
help="environment variables, in JSON format.",
)
def task(
*, task, bashfile, arg, _list, environ, fail, environ_json, shellcheck, debug, quiet
):
"""bashf — Bashfile runner (the familiar Bash/Make hybrid)."""
# Default to list behavior, when no task is provided.
if task == "__LIST_ALL__":
_list = True
task = None
if bashfile == "__BASHFILE__":
bashfile = Bashfile.find(root=".")
if environ_json:
bashfile.add_environ_json(environ_json)
for env in environ:
key, value = env[:]
if debug:
click.echo(
f" Setting environ: {crayons.red(key)} {crayons.white('=')} {value}.",
err=True,
)
bashfile.add_environ(key, value)
if _list:
for task in bashfile.tasks:
print(f" - {task}")
sys.exit(0)
if task:
try:
task = bashfile[task]
except KeyError:
click.echo(crayons.red(f"Task {task!r} does not exist!"))
sys.exit(1)
def execute_task(task):
if not quiet:
click.echo(
crayons.white(" · ")
+ crayons.yellow(f"Executing task {task.name!r}")
+ crayons.white("")
)
return_code = task.execute()
if fail:
if not return_code == 0:
click.echo(f"Task {task.name!r} failed!")
sys.exit(return_code)
for task in task.depends_on(recursive=True) + [task]:
execute_task(task)
click.echo(crayons.white(" · ") + crayons.green("Done") + crayons.white("!"))
sys.exit(0)
def entrypoint():
try:
main()
except KeyboardInterrupt:
print("ool beans.")
def main():
task()
if __name__ == "__main__":
entrypoint()