61 lines
2.1 KiB
C++
61 lines
2.1 KiB
C++
/*
|
|
* Copyright 2022 Google Inc.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
|
|
#include "src/base/SkStringView.h"
|
|
#include "tools/skslc/ProcessWorklist.h"
|
|
|
|
#include <algorithm>
|
|
#include <fstream>
|
|
#include <vector>
|
|
|
|
ResultCode ProcessWorklist(
|
|
const char* worklistPath,
|
|
const std::function<ResultCode(SkSpan<std::string> args)>& processCommandFn) {
|
|
std::string inputPath(worklistPath);
|
|
if (!skstd::ends_with(inputPath, ".worklist")) {
|
|
printf("expected .worklist file, found: %s\n\n", worklistPath);
|
|
return ResultCode::kConfigurationError;
|
|
}
|
|
|
|
// The worklist contains one line per argument to pass. When a blank line is reached, those
|
|
// arguments will be passed to `processCommandFn`.
|
|
auto resultCode = ResultCode::kSuccess;
|
|
std::vector<std::string> args = {"sksl"};
|
|
std::ifstream in(worklistPath);
|
|
for (std::string line; std::getline(in, line); ) {
|
|
if (in.rdstate()) {
|
|
printf("error reading '%s'\n", worklistPath);
|
|
return ResultCode::kInputError;
|
|
}
|
|
|
|
if (!line.empty()) {
|
|
// We found an argument. Remember it.
|
|
args.push_back(std::move(line));
|
|
} else {
|
|
// We found a blank line. If we have any arguments stored up, process them as a command.
|
|
if (!args.empty()) {
|
|
ResultCode outcome = processCommandFn(args);
|
|
resultCode = std::max(resultCode, outcome);
|
|
|
|
// Clear every argument except the first.
|
|
args.resize(1);
|
|
}
|
|
}
|
|
}
|
|
|
|
// If the worklist ended with a list of arguments but no blank line, process those now.
|
|
if (args.size() > 1) {
|
|
ResultCode outcome = processCommandFn(args);
|
|
resultCode = std::max(resultCode, outcome);
|
|
}
|
|
|
|
// Return the "worst" status we encountered. For our purposes, compilation errors are the least
|
|
// serious, because they are expected to occur in unit tests. Other types of errors are not
|
|
// expected at all during a build.
|
|
return resultCode;
|
|
}
|