X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fexternaltask.h;h=80796139da36d9bf27b62f731d3dbc5b3aea3233;hb=bde362811368647047f3ca13bdec596f092ecffe;hp=3028e74ddb998ae1db611a05285c3f2d7d635be5;hpb=b5ccba555f4985233532041c34e28d71dd58933f;p=builder.git diff --git a/source/externaltask.h b/source/externaltask.h index 3028e74..8079613 100644 --- a/source/externaltask.h +++ b/source/externaltask.h @@ -3,20 +3,77 @@ #include #include +#include #include +#include #include "task.h" +/** +Runs an external command. A zero exit status is translated to a SUCCESS status +for the task, and anything else is treated as an error. Output can optionally +be captured. +*/ class ExternalTask: public Task { +public: + enum StreamAction + { + PASSTHROUGH, //< Do not touch the stream + CAPTURE, //< Capture the stream + REDIRECT, //< Redirect the stream to/from a file + IGNORE //< Redirect the stream to oblivion + }; + + typedef Msp::Process::Arguments Arguments; + private: - int pid; + Arguments argv; + Msp::FS::Path work_dir; + Msp::Process *process; int exit_code; + StreamAction stdin_action; + Msp::FS::Path stdin_file; + StreamAction stdout_action; + Msp::FS::Path stdout_file; + StreamAction stderr_action; + Msp::IO::Pipe *capture_pipe; + std::string output; + +public: + /** Creates an ExternalTask with an argument array and an optional working + directory. The first element of the argument array should be the command + name. If the working directory is not specified, no chdir is done. */ + ExternalTask(const Arguments &, const Msp::FS::Path & = Msp::FS::Path()); + + ~ExternalTask(); + + std::string get_command() const override; + void start() override; + Status check() override; + Status wait() override; +private: + Status do_wait(bool); public: - ExternalTask(const std::vector &, const Msp::FS::Path &); + /// Redirect stdin from a file. Has no effect after the task is started. + void set_stdin(const Msp::FS::Path &); + + /// Sets destination for stdout. Has no effect after the task is started. + void set_stdout(StreamAction); + + /// Redirect stdout to a file. Has no effect after the task is started. + void set_stdout(const Msp::FS::Path &); + + /// Sets destination for stderr. Has no effect after the task is started. + void set_stderr(StreamAction); + + /** Returns captured output, if any. This may be called while the task is + still running, but it will always return all output. */ + const std::string &get_output() const { return output; } - virtual void start(); - virtual Status check(); + /** Executes a command and captures its output. If the command exits with + a nonzero status, an exception is thrown. */ + static std::string run_and_capture_output(const Arguments &, const Msp::FS::Path & = Msp::FS::Path(), bool = false); }; #endif