pydoit / doit

CLI task management & automation tool
http://pydoit.org
MIT License
1.87k stars 175 forks source link

Feature Request: Version of LongRunning that returns TaskError on non zero return code? #453

Open eddieparker opened 1 year ago

eddieparker commented 1 year ago

I'd love if there was a version of doit.tools.LongRunning that had it return TaskError if return code was non zero. I tend to use this for a light build system for tasks that have dependencies, and having it not stop at the first error requires a bunch of scrolling and buries problems.

I tend to unroll it in my own dodo.py scripts, but it'd be nice if it was inbuilt. I ended up hacking my own locally in my dodo.py and it works quite nicely:

class LongRunningTask(doit.tools.CmdAction):
    ' Run a command and wait for it to finish, and fail if it fails.'

    def execute(self, out=None, err=None):
        action = self.expand_action()
        process = subprocess.Popen(
            action, shell=self.shell, stdout=out, stderr=err, **self.pkwargs,)
        try:
            return_value = process.wait()

            if return_value != 0:
                return doit.exceptions.TaskError(f'Command failed with return code {return_value}')

        except KeyboardInterrupt:
            # normal way to stop interactive process
            pass

Fund with Polar

schettino72 commented 1 year ago

The "Interactive" checks the return code. does that work for you?

The problem of having too many features/API is that people dont find them! So providing the building blocks to allow users to code their own solution is a good compromise. So I would tend to reject this...

eddieparker commented 1 year ago

I can respect having too many features/API - a big surface area means a lot more to maintain. :)

Interactive is close to what I want, but it doesn't capture output, unfortunately.