MCPcopy Create free account
hub / github.com/Kitware/CMake / RunCommand

Method RunCommand

Source/cmCTest.cxx:3261–3372  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

3259}
3260
3261bool cmCTest::RunCommand(std::vector<std::string> const& args,
3262 std::string* stdOut, std::string* stdErr, int* retVal,
3263 char const* dir, cmDuration timeout,
3264 Encoding encoding)
3265{
3266 std::vector<char const*> argv;
3267 argv.reserve(args.size() + 1);
3268 for (std::string const& a : args) {
3269 argv.push_back(a.c_str());
3270 }
3271 argv.push_back(nullptr);
3272
3273 stdOut->clear();
3274 stdErr->clear();
3275
3276 cmUVProcessChainBuilder builder;
3277 builder.AddCommand(args)
3278 .SetBuiltinStream(cmUVProcessChainBuilder::Stream_OUTPUT)
3279 .SetBuiltinStream(cmUVProcessChainBuilder::Stream_ERROR);
3280 if (dir) {
3281 builder.SetWorkingDirectory(dir);
3282 }
3283 auto chain = builder.Start();
3284
3285 cm::uv_timer_ptr timer;
3286 bool timedOut = false;
3287 if (timeout.count()) {
3288 timer.init(chain.GetLoop(), &timedOut);
3289 timer.start(
3290 [](uv_timer_t* t) {
3291 auto* timedOutPtr = static_cast<bool*>(t->data);
3292 *timedOutPtr = true;
3293 },
3294 static_cast<uint64_t>(timeout.count() * 1000.0), 0,
3295 cm::uv_update_time::yes);
3296 }
3297
3298 std::vector<char> tempOutput;
3299 bool outFinished = false;
3300 std::vector<char> tempError;
3301 bool errFinished = false;
3302 cmProcessOutput processOutput(encoding);
3303 auto startRead = [this, &processOutput](
3304 uv_stream_t* stream, std::vector<char>& temp,
3305 bool& finished) -> std::unique_ptr<cmUVStreamReadHandle> {
3306 return cmUVStreamRead(
3307 stream,
3308 [this, &temp, &processOutput](std::vector<char> data) {
3309 cm::append(temp, data);
3310 if (this->Impl->ExtraVerbose) {
3311 std::string strdata;
3312 processOutput.DecodeText(data.data(), data.size(), strdata);
3313 cmSystemTools::Stdout(strdata);
3314 }
3315 },
3316 [&finished]() { finished = true; });
3317 };
3318 auto outputHandle = startRead(chain.OutputStream(), tempOutput, outFinished);

Callers

nothing calls this directly

Calls 15

cmUVStreamReadFunction · 0.85
appendFunction · 0.85
reserveMethod · 0.80
push_backMethod · 0.80
c_strMethod · 0.80
GetLoopMethod · 0.80
DecodeTextMethod · 0.80
OutputStreamMethod · 0.80
ErrorStreamMethod · 0.80
appendMethod · 0.80
TerminateMethod · 0.80
GetStatusMethod · 0.80

Tested by

no test coverage detected