cmCTestUploadCommand.cxx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. file LICENSE.rst or https://cmake.org/licensing for details. */
  3. #include "cmCTestUploadCommand.h"
  4. #include <algorithm>
  5. #include <chrono>
  6. #include <sstream>
  7. #include <string>
  8. #include <cm/vector>
  9. #include <cmext/string_view>
  10. #include "cmArgumentParser.h"
  11. #include "cmCTest.h"
  12. #include "cmExecutionStatus.h"
  13. #include "cmGeneratedFileStream.h"
  14. #include "cmMakefile.h"
  15. #include "cmMessageType.h"
  16. #include "cmSystemTools.h"
  17. #include "cmVersion.h"
  18. #include "cmXMLWriter.h"
  19. bool cmCTestUploadCommand::ExecuteUpload(UploadArguments& args,
  20. cmExecutionStatus& status) const
  21. {
  22. cmMakefile& mf = status.GetMakefile();
  23. std::sort(args.Files.begin(), args.Files.end());
  24. args.Files.erase(std::unique(args.Files.begin(), args.Files.end()),
  25. args.Files.end());
  26. cm::erase_if(args.Files, [&mf](std::string const& arg) -> bool {
  27. if (!cmSystemTools::FileExists(arg)) {
  28. std::ostringstream e;
  29. e << "File \"" << arg << "\" does not exist. Cannot submit "
  30. << "a non-existent file.";
  31. mf.IssueMessage(MessageType::FATAL_ERROR, e.str());
  32. return true;
  33. }
  34. return false;
  35. });
  36. cmGeneratedFileStream ofs;
  37. if (!this->CTest->OpenOutputFile(this->CTest->GetCurrentTag(), "Upload.xml",
  38. ofs)) {
  39. cmCTestLog(this->CTest, ERROR_MESSAGE,
  40. "Cannot open Upload.xml file" << std::endl);
  41. return false;
  42. }
  43. std::string buildname =
  44. cmCTest::SafeBuildIdField(mf.GetSafeDefinition("CTEST_BUILD_NAME"));
  45. cmXMLWriter xml(ofs);
  46. xml.StartDocument();
  47. xml.ProcessingInstruction("xml-stylesheet",
  48. "type=\"text/xsl\" "
  49. "href=\"Dart/Source/Server/XSL/Build.xsl "
  50. "<file:///Dart/Source/Server/XSL/Build.xsl> \"");
  51. xml.StartElement("Site");
  52. xml.Attribute("BuildName", buildname);
  53. xml.Attribute("BuildStamp",
  54. this->CTest->GetCurrentTag() + "-" +
  55. this->CTest->GetTestGroupString());
  56. xml.Attribute("Name", mf.GetSafeDefinition("CTEST_SITE"));
  57. xml.Attribute("Generator",
  58. std::string("ctest-") + cmVersion::GetCMakeVersion());
  59. this->CTest->AddSiteProperties(xml, mf.GetCMakeInstance());
  60. xml.StartElement("Upload");
  61. xml.Element("Time", std::chrono::system_clock::now());
  62. for (std::string const& file : args.Files) {
  63. cmCTestOptionalLog(this->CTest, OUTPUT,
  64. "\tUpload file: " << file << std::endl, args.Quiet);
  65. xml.StartElement("File");
  66. xml.Attribute("filename", file);
  67. xml.StartElement("Content");
  68. xml.Attribute("encoding", "base64");
  69. xml.Content(this->CTest->Base64EncodeFile(file));
  70. xml.EndElement(); // Content
  71. xml.EndElement(); // File
  72. }
  73. xml.EndElement(); // Upload
  74. xml.EndElement(); // Site
  75. xml.EndDocument();
  76. return true;
  77. }
  78. bool cmCTestUploadCommand::InitialPass(std::vector<std::string> const& args,
  79. cmExecutionStatus& status) const
  80. {
  81. static auto const parser =
  82. cmArgumentParser<UploadArguments>{ MakeBasicParser<UploadArguments>() }
  83. .Bind("FILES"_s, &UploadArguments::Files)
  84. .Bind("QUIET"_s, &UploadArguments::Quiet);
  85. return this->Invoke(parser, args, status, [&](UploadArguments& a) {
  86. return this->ExecuteUpload(a, status);
  87. });
  88. }