Skip to content

Ability to print action before executing it. #390

@Jasha10

Description

@Jasha10

Feature request: ability to print some data about each action before it gets executed.

Motivation:

If my task has multiple actions (and verbosity==2), I can't tell which output came from which action (assuming that the actions all succeed). Some way to tell which output comes from which action would be great. Printing e.g. the shell command that will be run, before running it, would be a good way to achieve this.

If you write echo 123 as part of a recipe in a Makefile (using GNU make), the following is printed:

+ echo 123
123

This is great for debugging purposes, so that you will know what command has produced the output you are seeing. The + symbol prefix makes it easy to tell what is the command, and what is the output from the command.

Possible API design:

Perhaps this could be verbosity level 3?

For CmdAction, it should be easy to print the action that will be executed by Popen, just before it gets executed.

For PythonAction, it is not as clear what should be the output. Perhaps a str representation of the python-action and it's args and kwargs...

Describe alternatives you've considered

I have tried using the title keyword for the task, with a custom title printer:

# dodo.py
import doit

def show_cmd(task):
    result = "EXECUTING " + task.name
    for action in task.actions:
        if isinstance(action, doit.action.CmdAction):
            result += "\n+ " + action.expand_action()
        if isinstance(action, doit.action.PythonAction):
            result += f"\n+ {action.py_callable.__name__}(*{action.args}, **{action._prepare_kwargs()})"
    return result

def py_action(a=1, b=3):
    print(f"in py_action: {a=}, {b=}")

def task_custom_display():
    return {"actions": ["echo abc efg", (py_action, (2,), {"b": 4})], "title": show_cmd}

However, when I run doit --verbosity 2 on this dodo.py file, the results are out of order:

$ doit --verbosity 2
.  EXECUTING custom_display
+ echo abc efg
+ py_action(*(2,), **{'b': 4})
abc efg
in py_action: a=2, b=4

I still cannot tell where the stdout from the first action ("abc efg") end, and the stdout from the second action ("in py_action: a=2, b=4") begins. This is why I'm requesting this feature.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions