CTest: Disallow problem chars in build and site names (#11792)
Also, use "(empty)" rather than actually sending an empty string if build or site name is not set properly.
This commit is contained in:
parent
8e1bbee4d9
commit
92af1dad06
|
@ -1440,6 +1440,43 @@ int cmCTest::RunTest(std::vector<const char*> argv,
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
std::string cmCTest::SafeBuildIdField(const std::string& value)
|
||||||
|
{
|
||||||
|
std::string safevalue(value);
|
||||||
|
|
||||||
|
if (safevalue != "")
|
||||||
|
{
|
||||||
|
// Disallow non-filename and non-space whitespace characters.
|
||||||
|
// If they occur, replace them with ""
|
||||||
|
//
|
||||||
|
const char *disallowed = "\\/:*?\"<>|\n\r\t\f\v";
|
||||||
|
|
||||||
|
if (safevalue.find_first_of(disallowed) != value.npos)
|
||||||
|
{
|
||||||
|
std::string::size_type i = 0;
|
||||||
|
std::string::size_type n = strlen(disallowed);
|
||||||
|
char replace[2];
|
||||||
|
replace[1] = 0;
|
||||||
|
|
||||||
|
for (i= 0; i<n; ++i)
|
||||||
|
{
|
||||||
|
replace[0] = disallowed[i];
|
||||||
|
cmSystemTools::ReplaceString(safevalue, replace, "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
safevalue = cmXMLSafe(safevalue).str();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (safevalue == "")
|
||||||
|
{
|
||||||
|
safevalue = "(empty)";
|
||||||
|
}
|
||||||
|
|
||||||
|
return safevalue;
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
void cmCTest::StartXML(std::ostream& ostr, bool append)
|
void cmCTest::StartXML(std::ostream& ostr, bool append)
|
||||||
{
|
{
|
||||||
|
@ -1450,19 +1487,27 @@ void cmCTest::StartXML(std::ostream& ostr, bool append)
|
||||||
" NightlStartTime was not set correctly." << std::endl);
|
" NightlStartTime was not set correctly." << std::endl);
|
||||||
cmSystemTools::SetFatalErrorOccured();
|
cmSystemTools::SetFatalErrorOccured();
|
||||||
}
|
}
|
||||||
|
|
||||||
// find out about the system
|
// find out about the system
|
||||||
cmsys::SystemInformation info;
|
cmsys::SystemInformation info;
|
||||||
info.RunCPUCheck();
|
info.RunCPUCheck();
|
||||||
info.RunOSCheck();
|
info.RunOSCheck();
|
||||||
info.RunMemoryCheck();
|
info.RunMemoryCheck();
|
||||||
|
|
||||||
|
std::string buildname = cmCTest::SafeBuildIdField(
|
||||||
|
this->GetCTestConfiguration("BuildName"));
|
||||||
|
std::string stamp = cmCTest::SafeBuildIdField(
|
||||||
|
this->CurrentTag + "-" + this->GetTestModelString());
|
||||||
|
std::string site = cmCTest::SafeBuildIdField(
|
||||||
|
this->GetCTestConfiguration("Site"));
|
||||||
|
|
||||||
ostr << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
|
ostr << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
|
||||||
<< "<Site BuildName=\"" << this->GetCTestConfiguration("BuildName")
|
<< "<Site BuildName=\"" << buildname << "\"\n"
|
||||||
<< "\"\n\tBuildStamp=\"" << this->CurrentTag << "-"
|
<< "\tBuildStamp=\"" << stamp << "\"\n"
|
||||||
<< this->GetTestModelString() << "\"\n\tName=\""
|
<< "\tName=\"" << site << "\"\n"
|
||||||
<< this->GetCTestConfiguration("Site") << "\"\n\tGenerator=\"ctest-"
|
<< "\tGenerator=\"ctest-" << cmVersion::GetCMakeVersion() << "\"\n"
|
||||||
<< cmVersion::GetCMakeVersion() << "\"\n"
|
|
||||||
<< (append? "\tAppend=\"true\"\n":"")
|
<< (append? "\tAppend=\"true\"\n":"")
|
||||||
<< "\tCompilerName=\"" << this->GetCTestConfiguration("Compiler")
|
<< "\tCompilerName=\"" << this->GetCTestConfiguration("Compiler")
|
||||||
<< "\"\n"
|
<< "\"\n"
|
||||||
#ifdef _COMPILER_VERSION
|
#ifdef _COMPILER_VERSION
|
||||||
<< "\tCompilerVersion=\"_COMPILER_VERSION\"\n"
|
<< "\tCompilerVersion=\"_COMPILER_VERSION\"\n"
|
||||||
|
|
|
@ -259,6 +259,10 @@ public:
|
||||||
std::string* stdOut, std::string* stdErr,
|
std::string* stdOut, std::string* stdErr,
|
||||||
int* retVal = 0, const char* dir = 0, double timeout = 0.0);
|
int* retVal = 0, const char* dir = 0, double timeout = 0.0);
|
||||||
|
|
||||||
|
//! Clean/make safe for xml the given value such that it may be used as
|
||||||
|
// one of the key fields by CDash when computing the buildid.
|
||||||
|
static std::string SafeBuildIdField(const std::string& value);
|
||||||
|
|
||||||
//! Start CTest XML output file
|
//! Start CTest XML output file
|
||||||
void StartXML(std::ostream& ostr, bool append);
|
void StartXML(std::ostream& ostr, bool append);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue