mirror of
https://github.com/reactos/CMake.git
synced 2024-11-30 23:10:26 +00:00
bbfe241c6a
Git's diff-tree format has no '\n'-terminated blank line at the end of its commit message body block if there are no diff lines. Instead the message body is terminated by '\0' and there is no diff section. Teach CTest to parse the format in this case.
91 lines
2.5 KiB
C++
91 lines
2.5 KiB
C++
/*============================================================================
|
|
CMake - Cross Platform Makefile Generator
|
|
Copyright 2000-2009 Kitware, Inc., Insight Software Consortium
|
|
|
|
Distributed under the OSI-approved BSD License (the "License");
|
|
see accompanying file Copyright.txt for details.
|
|
|
|
This software is distributed WITHOUT ANY WARRANTY; without even the
|
|
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
See the License for more information.
|
|
============================================================================*/
|
|
#include "cmProcessTools.h"
|
|
|
|
#include <cmsys/Process.h>
|
|
|
|
//----------------------------------------------------------------------------
|
|
void cmProcessTools::RunProcess(struct cmsysProcess_s* cp,
|
|
OutputParser* out, OutputParser* err)
|
|
{
|
|
cmsysProcess_Execute(cp);
|
|
char* data = 0;
|
|
int length = 0;
|
|
int p;
|
|
while((out||err) && (p=cmsysProcess_WaitForData(cp, &data, &length, 0), p))
|
|
{
|
|
if(out && p == cmsysProcess_Pipe_STDOUT)
|
|
{
|
|
if(!out->Process(data, length))
|
|
{
|
|
out = 0;
|
|
}
|
|
}
|
|
else if(err && p == cmsysProcess_Pipe_STDERR)
|
|
{
|
|
if(!err->Process(data, length))
|
|
{
|
|
err = 0;
|
|
}
|
|
}
|
|
}
|
|
cmsysProcess_WaitForExit(cp, 0);
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
cmProcessTools::LineParser::LineParser(char sep, bool ignoreCR):
|
|
Separator(sep), IgnoreCR(ignoreCR), Log(0), Prefix(0), LineEnd('\0')
|
|
{
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void cmProcessTools::LineParser::SetLog(std::ostream* log, const char* prefix)
|
|
{
|
|
this->Log = log;
|
|
this->Prefix = prefix? prefix : "";
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool cmProcessTools::LineParser::ProcessChunk(const char* first, int length)
|
|
{
|
|
const char* last = first + length;
|
|
for(const char* c = first; c != last; ++c)
|
|
{
|
|
if(*c == this->Separator || *c == '\0')
|
|
{
|
|
this->LineEnd = *c;
|
|
|
|
// Log this line.
|
|
if(this->Log && this->Prefix)
|
|
{
|
|
*this->Log << this->Prefix << this->Line << "\n";
|
|
}
|
|
|
|
// Hand this line to the subclass implementation.
|
|
if(!this->ProcessLine())
|
|
{
|
|
this->Line = "";
|
|
return false;
|
|
}
|
|
|
|
this->Line = "";
|
|
}
|
|
else if(*c != '\r' || !this->IgnoreCR)
|
|
{
|
|
// Append this character to the line under construction.
|
|
this->Line.append(1, *c);
|
|
}
|
|
}
|
|
return true;
|
|
}
|