ENH: Create cmCTestVC::RunChild and parse helpers

This method will help VCS tool subclasses run child processes and log
the output while parsing it.
This commit is contained in:
Brad King 2009-02-24 12:49:57 -05:00
parent 1595b8e69e
commit 4e4f2a3a10
2 changed files with 40 additions and 2 deletions

View File

@ -18,6 +18,8 @@
#include "cmCTest.h" #include "cmCTest.h"
#include <cmsys/Process.h>
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
cmCTestVC::cmCTestVC(cmCTest* ct, std::ostream& log): CTest(ct), Log(log) cmCTestVC::cmCTestVC(cmCTest* ct, std::ostream& log): CTest(ct), Log(log)
{ {
@ -39,3 +41,32 @@ void cmCTestVC::SetSourceDirectory(std::string const& dir)
{ {
this->SourceDirectory = dir; this->SourceDirectory = dir;
} }
//----------------------------------------------------------------------------
bool cmCTestVC::RunChild(char const* const* cmd, OutputParser* out,
OutputParser* err, const char* workDir)
{
this->Log << this->ComputeCommandLine(cmd) << "\n";
cmsysProcess* cp = cmsysProcess_New();
cmsysProcess_SetCommand(cp, cmd);
workDir = workDir? workDir : this->SourceDirectory.c_str();
cmsysProcess_SetWorkingDirectory(cp, workDir);
this->RunProcess(cp, out, err);
int result = cmsysProcess_GetExitValue(cp);
cmsysProcess_Delete(cp);
return result == 0;
}
//----------------------------------------------------------------------------
std::string cmCTestVC::ComputeCommandLine(char const* const* cmd)
{
cmOStringStream line;
const char* sep = "";
for(const char* const* arg = cmd; *arg; ++arg)
{
line << sep << "\"" << *arg << "\"";
sep = " ";
}
return line.str();
}

View File

@ -17,7 +17,7 @@
#ifndef cmCTestVC_h #ifndef cmCTestVC_h
#define cmCTestVC_h #define cmCTestVC_h
#include "cmStandardIncludes.h" #include "cmProcessTools.h"
class cmCTest; class cmCTest;
@ -25,7 +25,7 @@ class cmCTest;
* \brief Base class for version control system handlers * \brief Base class for version control system handlers
* *
*/ */
class cmCTestVC class cmCTestVC: public cmProcessTools
{ {
public: public:
/** Construct with a CTest instance and update log stream. */ /** Construct with a CTest instance and update log stream. */
@ -41,6 +41,13 @@ public:
protected: protected:
/** Convert a list of arguments to a human-readable command line. */
static std::string ComputeCommandLine(char const* const* cmd);
/** Run a command line and send output to given parsers. */
bool RunChild(char const* const* cmd, OutputParser* out,
OutputParser* err, const char* workDir = 0);
// Instance of cmCTest running the script. // Instance of cmCTest running the script.
cmCTest* CTest; cmCTest* CTest;