summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CTestConfig.cmake4
-rw-r--r--Source/CMakeLists.txt4
-rw-r--r--Source/CTest/cmCTestBuildHandler.cxx4
-rw-r--r--Source/CTest/cmCTestScriptHandler.cxx4
-rw-r--r--Source/CTest/cmCTestSubmitCommand.cxx54
-rw-r--r--Source/CTest/cmCTestSubmitCommand.h78
-rw-r--r--Source/CTest/cmCTestSubmitHandler.cxx (renamed from Source/CTest/cmCTestSubmit.cxx)195
-rw-r--r--Source/CTest/cmCTestSubmitHandler.h (renamed from Source/CTest/cmCTestSubmit.h)30
-rw-r--r--Source/CTest/cmCTestTestCommand.cxx52
-rw-r--r--Source/CTest/cmCTestTestCommand.h79
-rw-r--r--Source/cmCTest.cxx174
-rw-r--r--Source/cmCTest.h21
12 files changed, 488 insertions, 211 deletions
diff --git a/CTestConfig.cmake b/CTestConfig.cmake
index 602e08bb11..06226a7382 100644
--- a/CTestConfig.cmake
+++ b/CTestConfig.cmake
@@ -1,7 +1,7 @@
SET (CTEST_PROJECT_NAME "CMake")
SET (CTEST_NIGHTLY_START_TIME "21:00:00 EDT")
+SET (CTEST_DROP_METHOD "http")
SET (CTEST_DROP_SITE "public.kitware.com")
SET (CTEST_DROP_LOCATION "/cgi-bin/HTTPUploadDartFile.cgi")
-SET (CTEST_TRIGGER_SITE
- "http://${DROP_SITE}/cgi-bin/Submit-CMake-TestingResults.cgi")
+SET (CTEST_TRIGGER_SITE "http://${CTEST_DROP_SITE}/cgi-bin/Submit-CMake-TestingResults.cgi")
diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt
index f3fdbeb959..b8d0afc617 100644
--- a/Source/CMakeLists.txt
+++ b/Source/CMakeLists.txt
@@ -163,7 +163,9 @@ SET(CMTEST_SRCS cmCTest.cxx
CTest/cmCTestScriptHandler.cxx
CTest/cmCTestSleepCommand.cxx
CTest/cmCTestStartCommand.cxx
- CTest/cmCTestSubmit.cxx
+ CTest/cmCTestSubmitCommand.cxx
+ CTest/cmCTestSubmitHandler.cxx
+ CTest/cmCTestTestCommand.cxx
CTest/cmCTestTestHandler.cxx
CTest/cmCTestUpdateCommand.cxx
CTest/cmCTestUpdateHandler.cxx
diff --git a/Source/CTest/cmCTestBuildHandler.cxx b/Source/CTest/cmCTestBuildHandler.cxx
index 66f4f98971..a0e2ee746d 100644
--- a/Source/CTest/cmCTestBuildHandler.cxx
+++ b/Source/CTest/cmCTestBuildHandler.cxx
@@ -197,13 +197,13 @@ void cmCTestBuildHandler::PopulateCustomVectors(cmMakefile *mf)
int cmCTestBuildHandler::ProcessHandler()
{
std::cout << "Build project" << std::endl;
- std::string makeCommand = m_CTest->GetDartConfiguration("MakeCommand");
+ const std::string &makeCommand = m_CTest->GetDartConfiguration("MakeCommand");
if ( makeCommand.size() == 0 )
{
std::cerr << "Cannot find MakeCommand key in the DartConfiguration.tcl" << std::endl;
return -1;
}
- std::string buildDirectory = m_CTest->GetDartConfiguration("BuildDirectory");
+ const std::string &buildDirectory = m_CTest->GetDartConfiguration("BuildDirectory");
if ( buildDirectory.size() == 0 )
{
std::cerr << "Cannot find BuildDirectory key in the DartConfiguration.tcl" << std::endl;
diff --git a/Source/CTest/cmCTestScriptHandler.cxx b/Source/CTest/cmCTestScriptHandler.cxx
index 37034184f6..71c4bb095f 100644
--- a/Source/CTest/cmCTestScriptHandler.cxx
+++ b/Source/CTest/cmCTestScriptHandler.cxx
@@ -49,6 +49,8 @@
#include "cmCTestSleepCommand.h"
#include "cmCTestStartCommand.h"
#include "cmCTestUpdateCommand.h"
+#include "cmCTestTestCommand.h"
+#include "cmCTestSubmitCommand.h"
#define CTEST_INITIAL_CMAKE_OUTPUT_FILE_NAME "CTestInitialCMakeOutput.log"
@@ -229,6 +231,8 @@ int cmCTestScriptHandler::ReadInScript(const std::string& total_script_arg)
this->AddCTestCommand(new cmCTestRunScriptCommand);
this->AddCTestCommand(new cmCTestSleepCommand);
this->AddCTestCommand(new cmCTestStartCommand);
+ this->AddCTestCommand(new cmCTestSubmitCommand);
+ this->AddCTestCommand(new cmCTestTestCommand);
this->AddCTestCommand(new cmCTestUpdateCommand);
// add the script arg if defined
diff --git a/Source/CTest/cmCTestSubmitCommand.cxx b/Source/CTest/cmCTestSubmitCommand.cxx
new file mode 100644
index 0000000000..d21ade0dde
--- /dev/null
+++ b/Source/CTest/cmCTestSubmitCommand.cxx
@@ -0,0 +1,54 @@
+/*=========================================================================
+
+ Program: CMake - Cross-Platform Makefile Generator
+ Module: $RCSfile$
+ Language: C++
+ Date: $Date$
+ Version: $Revision$
+
+ Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved.
+ See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
+
+ This software is distributed WITHOUT ANY WARRANTY; without even
+ the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ PURPOSE. See the above copyright notices for more information.
+
+=========================================================================*/
+#include "cmCTestSubmitCommand.h"
+
+#include "cmCTest.h"
+#include "cmCTestGenericHandler.h"
+
+bool cmCTestSubmitCommand::InitialPass(
+ std::vector<std::string> const& args)
+{
+ if (args.size() != 1)
+ {
+ this->SetError("called with incorrect number of arguments");
+ return false;
+ }
+
+ const char* res_var = args[0].c_str();
+
+ m_CTest->SetDartConfigurationFromCMakeVariable(m_Makefile, "DropMethod", "CTEST_DROP_METHOD");
+ m_CTest->SetDartConfigurationFromCMakeVariable(m_Makefile, "DropSite", "CTEST_DROP_SITE");
+ m_CTest->SetDartConfigurationFromCMakeVariable(m_Makefile, "DropLocation", "CTEST_DROP_LOCATION");
+ m_CTest->SetDartConfigurationFromCMakeVariable(m_Makefile, "DropSiteUser", "CTEST_DROP_SITE_USER");
+ m_CTest->SetDartConfigurationFromCMakeVariable(m_Makefile, "DropSitePassword", "CTEST_DROP_SITE_PASSWORD");
+ m_CTest->SetDartConfigurationFromCMakeVariable(m_Makefile, "TriggerSite", "CTEST_TRIGGER_SITE");
+ m_CTest->SetDartConfigurationFromCMakeVariable(m_Makefile, "ScpCommand", "CTEST_SCP_COMMAND");
+
+ cmCTestGenericHandler* handler = m_CTest->GetHandler("submit");
+ if ( !handler )
+ {
+ this->SetError("internal CTest error. Cannot instantiate submit handler");
+ return false;
+ }
+ int res = handler->ProcessHandler();
+ cmOStringStream str;
+ str << res;
+ m_Makefile->AddDefinition(res_var, str.str().c_str());
+ return true;
+}
+
+
diff --git a/Source/CTest/cmCTestSubmitCommand.h b/Source/CTest/cmCTestSubmitCommand.h
new file mode 100644
index 0000000000..e71d34ca81
--- /dev/null
+++ b/Source/CTest/cmCTestSubmitCommand.h
@@ -0,0 +1,78 @@
+/*=========================================================================
+
+ Program: CMake - Cross-Platform Makefile Generator
+ Module: $RCSfile$
+ Language: C++
+ Date: $Date$
+ Version: $Revision$
+
+ Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved.
+ See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
+
+ This software is distributed WITHOUT ANY WARRANTY; without even
+ the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ PURPOSE. See the above copyright notices for more information.
+
+=========================================================================*/
+#ifndef cmCTestSubmitCommand_h
+#define cmCTestSubmitCommand_h
+
+#include "cmCTestCommand.h"
+
+/** \class cmCTestSubmit
+ * \brief Run a ctest script
+ *
+ * cmCTestSubmitCommand defineds the command to submit the test results for the project.
+ */
+class cmCTestSubmitCommand : public cmCTestCommand
+{
+public:
+
+ cmCTestSubmitCommand() {}
+
+ /**
+ * This is a virtual constructor for the command.
+ */
+ virtual cmCommand* Clone()
+ {
+ cmCTestSubmitCommand* ni = new cmCTestSubmitCommand;
+ ni->m_CTest = this->m_CTest;
+ ni->m_CTestScriptHandler = this->m_CTestScriptHandler;
+ return ni;
+ }
+
+ /**
+ * This is called when the command is first encountered in
+ * the CMakeLists.txt file.
+ */
+ virtual bool InitialPass(std::vector<std::string> const& args);
+
+ /**
+ * The name of the command as specified in CMakeList.txt.
+ */
+ virtual const char* GetName() { return "CTEST_SUBMIT";}
+
+ /**
+ * Succinct documentation.
+ */
+ virtual const char* GetTerseDocumentation()
+ {
+ return "Submits the repository.";
+ }
+
+ /**
+ * More documentation.
+ */
+ virtual const char* GetFullDocumentation()
+ {
+ return
+ " CTEST_SUBMIT(res)\n"
+ "Submits the test results for the project.";
+ }
+
+ cmTypeMacro(cmCTestSubmitCommand, cmCTestCommand);
+
+};
+
+
+#endif
diff --git a/Source/CTest/cmCTestSubmit.cxx b/Source/CTest/cmCTestSubmitHandler.cxx
index bab03b3614..bac3125c1a 100644
--- a/Source/CTest/cmCTestSubmit.cxx
+++ b/Source/CTest/cmCTestSubmitHandler.cxx
@@ -14,22 +14,27 @@ the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
+#include "cmCTestSubmitHandler.h"
-#include "cmCTestSubmit.h"
#include "cmSystemTools.h"
#include "cmVersion.h"
+#include "cmGeneratedFileStream.h"
+#include "cmCTest.h"
#include <cmsys/Process.h>
#include <cmsys/Base64.h>
+
+// For XML-RPC submission
#include "xmlrpc.h"
#include "xmlrpc_client.h"
+// For curl submission
#include "CTest/Curl/curl/curl.h"
#include <sys/stat.h>
//----------------------------------------------------------------------------
-cmCTestSubmit::cmCTestSubmit() : m_HTTPProxy(), m_FTPProxy()
+cmCTestSubmitHandler::cmCTestSubmitHandler() : m_HTTPProxy(), m_FTPProxy()
{
m_Verbose = false;
m_HTTPProxy = "";
@@ -111,7 +116,7 @@ cmCTestSubmit::cmCTestSubmit() : m_HTTPProxy(), m_FTPProxy()
}
//----------------------------------------------------------------------------
-bool cmCTestSubmit::SubmitUsingFTP(const cmStdString& localprefix,
+bool cmCTestSubmitHandler::SubmitUsingFTP(const cmStdString& localprefix,
const std::vector<cmStdString>& files,
const cmStdString& remoteprefix,
const cmStdString& url)
@@ -208,7 +213,7 @@ bool cmCTestSubmit::SubmitUsingFTP(const cmStdString& localprefix,
//----------------------------------------------------------------------------
// Uploading files is simpler
-bool cmCTestSubmit::SubmitUsingHTTP(const cmStdString& localprefix,
+bool cmCTestSubmitHandler::SubmitUsingHTTP(const cmStdString& localprefix,
const std::vector<cmStdString>& files,
const cmStdString& remoteprefix,
const cmStdString& url)
@@ -343,7 +348,7 @@ bool cmCTestSubmit::SubmitUsingHTTP(const cmStdString& localprefix,
}
//----------------------------------------------------------------------------
-bool cmCTestSubmit::TriggerUsingHTTP(const std::vector<cmStdString>& files,
+bool cmCTestSubmitHandler::TriggerUsingHTTP(const std::vector<cmStdString>& files,
const cmStdString& remoteprefix,
const cmStdString& url)
{
@@ -443,7 +448,7 @@ bool cmCTestSubmit::TriggerUsingHTTP(const std::vector<cmStdString>& files,
}
//----------------------------------------------------------------------------
-bool cmCTestSubmit::SubmitUsingSCP(
+bool cmCTestSubmitHandler::SubmitUsingSCP(
const cmStdString& scp_command,
const cmStdString& localprefix,
const std::vector<cmStdString>& files,
@@ -552,7 +557,7 @@ bool cmCTestSubmit::SubmitUsingSCP(
}
//----------------------------------------------------------------------------
-bool cmCTestSubmit::SubmitUsingXMLRPC(const cmStdString& localprefix,
+bool cmCTestSubmitHandler::SubmitUsingXMLRPC(const cmStdString& localprefix,
const std::vector<cmStdString>& files,
const cmStdString& remoteprefix,
const cmStdString& url)
@@ -610,7 +615,7 @@ bool cmCTestSubmit::SubmitUsingXMLRPC(const cmStdString& localprefix,
std::cerr << " Submission problem: " << env.fault_string << " (" << env.fault_code << ")" << std::endl;
xmlrpc_env_clean(&env);
xmlrpc_client_cleanup();
- return 0;
+ return false;
}
@@ -622,7 +627,7 @@ bool cmCTestSubmit::SubmitUsingXMLRPC(const cmStdString& localprefix,
xmlrpc_DECREF(result);
xmlrpc_env_clean(&env);
xmlrpc_client_cleanup();
- return 0;
+ return false;
}
/* Dispose of our result value. */
@@ -634,5 +639,175 @@ bool cmCTestSubmit::SubmitUsingXMLRPC(const cmStdString& localprefix,
/* Shutdown our XML-RPC client library. */
xmlrpc_client_cleanup();
- return 1;
+ return true;
+}
+
+//----------------------------------------------------------------------------
+int cmCTestSubmitHandler::ProcessHandler()
+{
+ const std::string &buildDirectory = m_CTest->GetDartConfiguration("BuildDirectory");
+ if ( buildDirectory.size() == 0 )
+ {
+ std::cerr << "Cannot find BuildDirectory key in the DartConfiguration.tcl" << std::endl;
+ return -1;
+ }
+
+ cmGeneratedFileStream ofs;
+ m_CTest->OpenOutputFile("Temporary", "LastSubmit.log", ofs);
+
+ cmCTest::tm_VectorOfStrings files;
+ std::string prefix = this->GetSubmitResultsPrefix();
+ // TODO:
+ // Check if test is enabled
+ m_CTest->AddIfExists(files, "Update.xml");
+ m_CTest->AddIfExists(files, "Configure.xml");
+ m_CTest->AddIfExists(files, "Build.xml");
+ m_CTest->AddIfExists(files, "Test.xml");
+ if ( m_CTest->AddIfExists(files, "Coverage.xml") )
+ {
+ cmCTest::tm_VectorOfStrings gfiles;
+ std::string gpath = buildDirectory + "/Testing/" + m_CTest->GetCurrentTag();
+ std::string::size_type glen = gpath.size() + 1;
+ gpath = gpath + "/CoverageLog*";
+ //std::cout << "Globbing for: " << gpath.c_str() << std::endl;
+ if ( cmSystemTools::SimpleGlob(gpath, gfiles, 1) )
+ {
+ size_t cc;
+ for ( cc = 0; cc < gfiles.size(); cc ++ )
+ {
+ gfiles[cc] = gfiles[cc].substr(glen);
+ //std::cout << "Glob file: " << gfiles[cc].c_str() << std::endl;
+ files.push_back(gfiles[cc]);
+ }
+ }
+ else
+ {
+ std::cerr << "Problem globbing" << std::endl;
+ }
+ }
+ m_CTest->AddIfExists(files, "DynamicAnalysis.xml");
+ m_CTest->AddIfExists(files, "Purify.xml");
+ m_CTest->AddIfExists(files, "Notes.xml");
+
+ if ( ofs )
+ {
+ ofs << "Upload files:" << std::endl;
+ int cnt = 0;
+ cmCTest::tm_VectorOfStrings::iterator it;
+ for ( it = files.begin(); it != files.end(); ++ it )
+ {
+ ofs << cnt << "\t" << it->c_str() << std::endl;
+ cnt ++;
+ }
+ }
+ std::cout << "Submit files (using " << m_CTest->GetDartConfiguration("DropMethod") << ")"
+ << std::endl;
+ this->SetLogFile(&ofs);
+ if ( m_CTest->GetDartConfiguration("DropMethod") == "" ||
+ m_CTest->GetDartConfiguration("DropMethod") == "ftp" )
+ {
+ ofs << "Using drop method: FTP" << std::endl;
+ std::cout << " Using FTP submit method" << std::endl;
+ std::string url = "ftp://";
+ url += cmCTest::MakeURLSafe(m_CTest->GetDartConfiguration("DropSiteUser")) + ":" +
+ cmCTest::MakeURLSafe(m_CTest->GetDartConfiguration("DropSitePassword")) + "@" +
+ m_CTest->GetDartConfiguration("DropSite") +
+ cmCTest::MakeURLSafe(m_CTest->GetDartConfiguration("DropLocation"));
+ if ( !this->SubmitUsingFTP(buildDirectory+"/Testing/"+m_CTest->GetCurrentTag(),
+ files, prefix, url) )
+ {
+ std::cerr << " Problems when submitting via FTP" << std::endl;
+ ofs << " Problems when submitting via FTP" << std::endl;
+ return -1;
+ }
+ if ( !this->TriggerUsingHTTP(files, prefix, m_CTest->GetDartConfiguration("TriggerSite")) )
+ {
+ std::cerr << " Problems when triggering via HTTP" << std::endl;
+ ofs << " Problems when triggering via HTTP" << std::endl;
+ return -1;
+ }
+ std::cout << " Submission successful" << std::endl;
+ ofs << " Submission successful" << std::endl;
+ return 0;
+ }
+ else if ( m_CTest->GetDartConfiguration("DropMethod") == "http" )
+ {
+ ofs << "Using drop method: HTTP" << std::endl;
+ std::cout << " Using HTTP submit method" << std::endl;
+ std::string url = "http://";
+ if ( m_CTest->GetDartConfiguration("DropSiteUser").size() > 0 )
+ {
+ url += m_CTest->GetDartConfiguration("DropSiteUser");
+ if ( m_CTest->GetDartConfiguration("DropSitePassword").size() > 0 )
+ {
+ url += ":" + m_CTest->GetDartConfiguration("DropSitePassword");
+ }
+ url += "@";
+ }
+ url += m_CTest->GetDartConfiguration("DropSite") + m_CTest->GetDartConfiguration("DropLocation");
+ if ( !this->SubmitUsingHTTP(buildDirectory +"/Testing/"+m_CTest->GetCurrentTag(), files, prefix, url) )
+ {
+ std::cerr << " Problems when submitting via HTTP" << std::endl;
+ ofs << " Problems when submitting via HTTP" << std::endl;
+ return -1;
+ }
+ if ( !this->TriggerUsingHTTP(files, prefix, m_CTest->GetDartConfiguration("TriggerSite")) )
+ {
+ std::cerr << " Problems when triggering via HTTP" << std::endl;
+ ofs << " Problems when triggering via HTTP" << std::endl;
+ return -1;
+ }
+ std::cout << " Submission successful" << std::endl;
+ ofs << " Submission successful" << std::endl;
+ return 0;
+ }
+ else if ( m_CTest->GetDartConfiguration("DropMethod") == "xmlrpc" )
+ {
+ ofs << "Using drop method: XML-RPC" << std::endl;
+ std::cout << " Using XML-RPC submit method" << std::endl;
+ std::string url = m_CTest->GetDartConfiguration("DropSite");
+ prefix = m_CTest->GetDartConfiguration("DropLocation");
+ if ( !this->SubmitUsingXMLRPC(buildDirectory+"/Testing/"+m_CTest->GetCurrentTag(), files, prefix, url) )
+ {
+ std::cerr << " Problems when submitting via XML-RPC" << std::endl;
+ ofs << " Problems when submitting via XML-RPC" << std::endl;
+ return -1;
+ }
+ std::cout << " Submission successful" << std::endl;
+ ofs << " Submission successful" << std::endl;
+ return 0;
+ }
+ else if ( m_CTest->GetDartConfiguration("DropMethod") == "scp" )
+ {
+ std::string url;
+ if ( m_CTest->GetDartConfiguration("DropSiteUser").size() > 0 )
+ {
+ url += m_CTest->GetDartConfiguration("DropSiteUser") + "@";
+ }
+ url += m_CTest->GetDartConfiguration("DropSite") + ":" + m_CTest->GetDartConfiguration("DropLocation");
+
+ if ( !this->SubmitUsingSCP(m_CTest->GetDartConfiguration("ScpCommand"),
+ buildDirectory+"/Testing/"+m_CTest->GetCurrentTag(), files, prefix, url) )
+ {
+ std::cerr << " Problems when submitting via SCP" << std::endl;
+ ofs << " Problems when submitting via SCP" << std::endl;
+ return -1;
+ }
+ std::cout << " Submission successful" << std::endl;
+ ofs << " Submission successful" << std::endl;
+ }
+ std::cout << " Unknown submission method: \"" << m_CTest->GetDartConfiguration("DropMethod") << "\"" << std::endl;
+ return -1;
}
+
+//----------------------------------------------------------------------------
+std::string cmCTestSubmitHandler::GetSubmitResultsPrefix()
+{
+ std::string name = m_CTest->GetDartConfiguration("Site") +
+ "___" + m_CTest->GetDartConfiguration("BuildName") +
+ "___" + m_CTest->GetCurrentTag() + "-" +
+ m_CTest->GetTestModelString() + "___XML___";
+ return name;
+}
+
+
diff --git a/Source/CTest/cmCTestSubmit.h b/Source/CTest/cmCTestSubmitHandler.h
index 5e3a329d62..45d8f30188 100644
--- a/Source/CTest/cmCTestSubmit.h
+++ b/Source/CTest/cmCTestSubmitHandler.h
@@ -14,32 +14,32 @@
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
-#ifndef cmCTestSubmit_h
-#define cmCTestSubmit_h
+#ifndef cmCTestSubmitHandler_h
+#define cmCTestSubmitHandler_h
-#include "cmStandardIncludes.h"
+#include "cmCTestGenericHandler.h"
-/** \class cmCTestSubmit
+/** \class cmCTestSubmitHandler
* \brief Helper class for CTest
*
* Submit testing results
*
*/
-class cmCTestSubmit
+class cmCTestSubmitHandler : public cmCTestGenericHandler
{
public:
- cmCTestSubmit();
- ~cmCTestSubmit() { m_LogFile = 0; }
+ cmCTestSubmitHandler();
+ ~cmCTestSubmitHandler() { m_LogFile = 0; }
- /**
- * Set verbosity of send
+ /*
+ * The main entry point for this class
*/
- void SetVerbose(bool i) { m_Verbose = i; }
- void VerboseOn() { this->SetVerbose(1); }
- void VerboseOff() { this->SetVerbose(0); }
+ int ProcessHandler();
- void SetLogFile(std::ostream* ost) { m_LogFile = ost; }
+private:
+ void SetLogFile(std::ostream* ost) { m_LogFile = ost; }
+
/**
* Submit file using various ways
*/
@@ -66,13 +66,13 @@ public:
const cmStdString& remoteprefix,
const cmStdString& url);
-private:
+ std::string GetSubmitResultsPrefix();
+
cmStdString m_HTTPProxy;
int m_HTTPProxyType;
cmStdString m_HTTPProxyAuth;
cmStdString m_FTPProxy;
int m_FTPProxyType;
- bool m_Verbose;
std::ostream* m_LogFile;
};
diff --git a/Source/CTest/cmCTestTestCommand.cxx b/Source/CTest/cmCTestTestCommand.cxx
new file mode 100644
index 0000000000..7588135c21
--- /dev/null
+++ b/Source/CTest/cmCTestTestCommand.cxx
@@ -0,0 +1,52 @@
+/*=========================================================================
+
+ Program: CMake - Cross-Platform Makefile Generator
+ Module: $RCSfile$
+ Language: C++
+ Date: $Date$
+ Version: $Revision$
+
+ Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved.
+ See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
+
+ This software is distributed WITHOUT ANY WARRANTY; without even
+ the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ PURPOSE. See the above copyright notices for more information.
+
+=========================================================================*/
+#include "cmCTestTestCommand.h"
+
+#include "cmCTest.h"
+#include "cmCTestGenericHandler.h"
+
+bool cmCTestTestCommand::InitialPass(
+ std::vector<std::string> const& args)
+{
+ if (args.size() != 2)
+ {
+ this->SetError("called with incorrect number of arguments");
+ return false;
+ }
+
+ const char* build_dir = args[0].c_str();
+ const char* res_var = args[1].c_str();
+
+ m_CTest->SetDartConfiguration("BuildDirectory", build_dir);
+
+ cmCTestGenericHandler* handler = m_CTest->GetHandler("test");
+ if ( !handler )
+ {
+ this->SetError("internal CTest error. Cannot instantiate test handler");
+ return false;
+ }
+ std::string current_dir = cmSystemTools::GetCurrentWorkingDirectory();
+ cmSystemTools::ChangeDirectory(build_dir);
+ int res = handler->ProcessHandler();
+ cmSystemTools::ChangeDirectory(current_dir.c_str());
+ cmOStringStream str;
+ str << res;
+ m_Makefile->AddDefinition(res_var, str.str().c_str());
+ return true;
+}
+
+
diff --git a/Source/CTest/cmCTestTestCommand.h b/Source/CTest/cmCTestTestCommand.h
new file mode 100644
index 0000000000..907cb543e0
--- /dev/null
+++ b/Source/CTest/cmCTestTestCommand.h
@@ -0,0 +1,79 @@
+/*=========================================================================
+
+ Program: CMake - Cross-Platform Makefile Generator
+ Module: $RCSfile$
+ Language: C++
+ Date: $Date$
+ Version: $Revision$
+
+ Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved.
+ See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
+
+ This software is distributed WITHOUT ANY WARRANTY; without even
+ the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ PURPOSE. See the above copyright notices for more information.
+
+=========================================================================*/
+#ifndef cmCTestTestCommand_h
+#define cmCTestTestCommand_h
+
+#include "cmCTestCommand.h"
+
+/** \class cmCTestTest
+ * \brief Run a ctest script
+ *
+ * cmCTestTestCommand defineds the command to test the project.
+ */
+class cmCTestTestCommand : public cmCTestCommand
+{
+public:
+
+ cmCTestTestCommand() {}
+
+ /**
+ * This is a virtual constructor for the command.
+ */
+ virtual cmCommand* Clone()
+ {
+ cmCTestTestCommand* ni = new cmCTestTestCommand;
+ ni->m_CTest = this->m_CTest;
+ ni->m_CTestScriptHandler = this->m_CTestScriptHandler;
+ return ni;
+ }
+
+ /**
+ * This is called when the command is first encountered in
+ * the CMakeLists.txt file.
+ */
+ virtual bool InitialPass(std::vector<std::string> const& args);
+
+ /**
+ * The name of the command as specified in CMakeList.txt.
+ */
+ virtual const char* GetName() { return "CTEST_TEST";}
+
+ /**
+ * Succinct documentation.
+ */
+ virtual const char* GetTerseDocumentation()
+ {
+ return "Tests the repository.";
+ }
+
+ /**
+ * More documentation.
+ */
+ virtual const char* GetFullDocumentation()
+ {
+ return
+ " CTEST_TEST(build_dir res)\n"
+ "Tests the given build directory and stores results in Test.xml. The "
+ "second argument is a variable that will hold value.";
+ }
+
+ cmTypeMacro(cmCTestTestCommand, cmCTestCommand);
+
+};
+
+
+#endif
diff --git a/Source/cmCTest.cxx b/Source/cmCTest.cxx
index e75efd40b6..53ea1594a1 100644
--- a/Source/cmCTest.cxx
+++ b/Source/cmCTest.cxx
@@ -33,8 +33,8 @@
#include "cmCTestScriptHandler.h"
#include "cmCTestTestHandler.h"
#include "cmCTestUpdateHandler.h"
+#include "cmCTestSubmitHandler.h"
-#include "cmCTestSubmit.h"
#include "cmVersion.h"
#include <cmsys/RegularExpression.hxx>
@@ -250,6 +250,7 @@ cmCTest::cmCTest()
m_TestingHandlers["update"] = new cmCTestUpdateHandler;
m_TestingHandlers["configure"] = new cmCTestConfigureHandler;
m_TestingHandlers["memcheck"] = new cmCTestMemCheckHandler;
+ m_TestingHandlers["submit"] = new cmCTestSubmitHandler;
cmCTest::t_TestingHandlers::iterator it;
for ( it = m_TestingHandlers.begin(); it != m_TestingHandlers.end(); ++ it )
@@ -575,163 +576,6 @@ bool cmCTest::AddIfExists(tm_VectorOfStrings& files, const char* file)
return true;
}
-int cmCTest::SubmitResults()
-{
- cmGeneratedFileStream ofs;
- this->OpenOutputFile("Temporary", "LastSubmit.log", ofs);
-
- cmCTest::tm_VectorOfStrings files;
- std::string prefix = this->GetSubmitResultsPrefix();
- // TODO:
- // Check if test is enabled
- this->AddIfExists(files, "Update.xml");
- this->AddIfExists(files, "Configure.xml");
- this->AddIfExists(files, "Build.xml");
- this->AddIfExists(files, "Test.xml");
- if ( this->AddIfExists(files, "Coverage.xml") )
- {
- cmCTest::tm_VectorOfStrings gfiles;
- std::string gpath = m_BinaryDir + "/Testing/" + m_CurrentTag;
- std::string::size_type glen = gpath.size() + 1;
- gpath = gpath + "/CoverageLog*";
- //std::cout << "Globbing for: " << gpath.c_str() << std::endl;
- if ( cmSystemTools::SimpleGlob(gpath, gfiles, 1) )
- {
- size_t cc;
- for ( cc = 0; cc < gfiles.size(); cc ++ )
- {
- gfiles[cc] = gfiles[cc].substr(glen);
- //std::cout << "Glob file: " << gfiles[cc].c_str() << std::endl;
- files.push_back(gfiles[cc]);
- }
- }
- else
- {
- std::cerr << "Problem globbing" << std::endl;
- }
- }
- this->AddIfExists(files, "DynamicAnalysis.xml");
- this->AddIfExists(files, "Purify.xml");
- this->AddIfExists(files, "Notes.xml");
-
- if ( ofs )
- {
- ofs << "Upload files:" << std::endl;
- int cnt = 0;
- cmCTest::tm_VectorOfStrings::iterator it;
- for ( it = files.begin(); it != files.end(); ++ it )
- {
- ofs << cnt << "\t" << it->c_str() << std::endl;
- cnt ++;
- }
- }
- std::cout << "Submit files (using " << m_DartConfiguration["DropMethod"] << ")"
- << std::endl;
- cmCTestSubmit submit;
- submit.SetVerbose(m_ExtraVerbose);
- submit.SetLogFile(&ofs);
- if ( m_DartConfiguration["DropMethod"] == "" ||
- m_DartConfiguration["DropMethod"] == "ftp" )
- {
- ofs << "Using drop method: FTP" << std::endl;
- std::cout << " Using FTP submit method" << std::endl;
- std::string url = "ftp://";
- url += cmCTest::MakeURLSafe(m_DartConfiguration["DropSiteUser"]) + ":" +
- cmCTest::MakeURLSafe(m_DartConfiguration["DropSitePassword"]) + "@" +
- m_DartConfiguration["DropSite"] +
- cmCTest::MakeURLSafe(m_DartConfiguration["DropLocation"]);
- if ( !submit.SubmitUsingFTP(m_BinaryDir+"/Testing/"+m_CurrentTag,
- files, prefix, url) )
- {
- std::cerr << " Problems when submitting via FTP" << std::endl;
- ofs << " Problems when submitting via FTP" << std::endl;
- return 0;
- }
- if ( !submit.TriggerUsingHTTP(files, prefix, m_DartConfiguration["TriggerSite"]) )
- {
- std::cerr << " Problems when triggering via HTTP" << std::endl;
- ofs << " Problems when triggering via HTTP" << std::endl;
- return 0;
- }
- std::cout << " Submission successful" << std::endl;
- ofs << " Submission successful" << std::endl;
- return 1;
- }
- else if ( m_DartConfiguration["DropMethod"] == "http" )
- {
- ofs << "Using drop method: HTTP" << std::endl;
- std::cout << " Using HTTP submit method" << std::endl;
- std::string url = "http://";
- if ( m_DartConfiguration["DropSiteUser"].size() > 0 )
- {
- url += m_DartConfiguration["DropSiteUser"];
- if ( m_DartConfiguration["DropSitePassword"].size() > 0 )
- {
- url += ":" + m_DartConfiguration["DropSitePassword"];
- }
- url += "@";
- }
- url += m_DartConfiguration["DropSite"] + m_DartConfiguration["DropLocation"];
- if ( !submit.SubmitUsingHTTP(m_BinaryDir+"/Testing/"+m_CurrentTag, files, prefix, url) )
- {
- std::cerr << " Problems when submitting via HTTP" << std::endl;
- ofs << " Problems when submitting via HTTP" << std::endl;
- return 0;
- }
- if ( !submit.TriggerUsingHTTP(files, prefix, m_DartConfiguration["TriggerSite"]) )
- {
- std::cerr << " Problems when triggering via HTTP" << std::endl;
- ofs << " Problems when triggering via HTTP" << std::endl;
- return 0;
- }
- std::cout << " Submission successful" << std::endl;
- ofs << " Submission successful" << std::endl;
- return 1;
- }
- else if ( m_DartConfiguration["DropMethod"] == "xmlrpc" )
- {
- ofs << "Using drop method: XML-RPC" << std::endl;
- std::cout << " Using XML-RPC submit method" << std::endl;
- std::string url = m_DartConfiguration["DropSite"];
- prefix = m_DartConfiguration["DropLocation"];
- if ( !submit.SubmitUsingXMLRPC(m_BinaryDir+"/Testing/"+m_CurrentTag, files, prefix, url) )
- {
- std::cerr << " Problems when submitting via XML-RPC" << std::endl;
- ofs << " Problems when submitting via XML-RPC" << std::endl;
- return 0;
- }
- std::cout << " Submission successful" << std::endl;
- ofs << " Submission successful" << std::endl;
- return 1;
- }
- else if ( m_DartConfiguration["DropMethod"] == "scp" )
- {
- std::string url;
- if ( m_DartConfiguration["DropSiteUser"].size() > 0 )
- {
- url += m_DartConfiguration["DropSiteUser"] + "@";
- }
- url += m_DartConfiguration["DropSite"] + ":" + m_DartConfiguration["DropLocation"];
-
- if ( !submit.SubmitUsingSCP(m_DartConfiguration["ScpCommand"],
- m_BinaryDir+"/Testing/"+m_CurrentTag, files, prefix, url) )
- {
- std::cerr << " Problems when submitting via SCP" << std::endl;
- ofs << " Problems when submitting via SCP" << std::endl;
- return 0;
- }
- std::cout << " Submission successful" << std::endl;
- ofs << " Submission successful" << std::endl;
- }
- else
- {
- std::cout << " Unknown submission method: \"" << m_DartConfiguration["DropMethod"] << "\"" << std::endl;
- return 0;
- }
-
- return 0;
-}
-
bool cmCTest::CTestFileExists(const std::string& filename)
{
std::string testingDir = m_BinaryDir + "/Testing/" + m_CurrentTag + "/" +
@@ -739,15 +583,6 @@ bool cmCTest::CTestFileExists(const std::string& filename)
return cmSystemTools::FileExists(testingDir.c_str());
}
-std::string cmCTest::GetSubmitResultsPrefix()
-{
- std::string name = m_DartConfiguration["Site"] +
- "___" + m_DartConfiguration["BuildName"] +
- "___" + m_CurrentTag + "-" +
- this->GetTestModelString() + "___XML___";
- return name;
-}
-
cmCTestGenericHandler* cmCTest::GetHandler(const char* handler)
{
cmCTest::t_TestingHandlers::iterator it = m_TestingHandlers.find(handler);
@@ -872,7 +707,10 @@ int cmCTest::ProcessTests()
if ( m_Tests[SUBMIT_TEST] || m_Tests[ALL_TEST] )
{
this->UpdateCTestConfiguration();
- this->SubmitResults();
+ if (this->GetHandler("submit")->ProcessHandler() < 0)
+ {
+ res |= cmCTest::SUBMIT_ERRORS;
+ }
}
return res;
}
diff --git a/Source/cmCTest.h b/Source/cmCTest.h
index 7e832dc040..25f8492882 100644
--- a/Source/cmCTest.h
+++ b/Source/cmCTest.h
@@ -71,12 +71,6 @@ public:
*/
int TestDirectory(bool memcheck);
- /**
- * Do submit testing results
- */
- int SubmitResults();
- std::string GetSubmitResultsPrefix();
-
///! what is the configuraiton type, e.g. Debug, Release etc.
std::string GetConfigType();
@@ -166,12 +160,13 @@ public:
// provide some more detailed info on the return code for ctest
enum {
- UPDATE_ERRORS = 0x01,
+ UPDATE_ERRORS = 0x01,
CONFIGURE_ERRORS = 0x02,
- BUILD_ERRORS = 0x04,
- TEST_ERRORS = 0x08,
- MEMORY_ERRORS = 0x10,
- COVERAGE_ERRORS = 0x20
+ BUILD_ERRORS = 0x04,
+ TEST_ERRORS = 0x08,
+ MEMORY_ERRORS = 0x10,
+ COVERAGE_ERRORS = 0x20,
+ SUBMIT_ERRORS = 0x40
};
///! Are we producing XML
@@ -198,6 +193,8 @@ public:
*/
bool SetDartConfigurationFromCMakeVariable(cmMakefile* mf, const char* dconfig, const char* cmake_var);
+ //! Make string safe to be send as an URL
+ static std::string MakeURLSafe(const std::string&);
private:
std::string m_ConfigType;
bool m_Verbose;
@@ -210,8 +207,6 @@ private:
int GenerateNotesFile(const char* files);
- static std::string MakeURLSafe(const std::string&);
-
// these are helper classes
typedef std::map<cmStdString,cmCTestGenericHandler*> t_TestingHandlers;
t_TestingHandlers m_TestingHandlers;