diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/buildtool/common/cli.hpp | 6 | ||||
-rw-r--r-- | src/buildtool/main/main.cpp | 39 |
2 files changed, 37 insertions, 8 deletions
diff --git a/src/buildtool/common/cli.hpp b/src/buildtool/common/cli.hpp index cf348bff..1d64fbda 100644 --- a/src/buildtool/common/cli.hpp +++ b/src/buildtool/common/cli.hpp @@ -69,6 +69,7 @@ struct AnalysisArguments { std::optional<std::filesystem::path> expression_root{}; std::optional<std::filesystem::path> graph_file{}; std::optional<std::filesystem::path> artifacts_to_build_file{}; + std::optional<std::filesystem::path> serve_errors_file{}; }; /// \brief Arguments required for describing targets/rules. @@ -330,6 +331,11 @@ static inline auto SetupAnalysisArguments( app->add_option("--expression-file-name", clargs->expression_file_name, "Name of the expressions file."); + app->add_option("--serve-errors-log", + clargs->serve_errors_file, + "File path for dumping the blob identifiers of serve " + "errors as json.") + ->type_name("PATH"); if (with_graph) { app->add_option( "--dump-graph", diff --git a/src/buildtool/main/main.cpp b/src/buildtool/main/main.cpp index 21f08618..59225fc7 100644 --- a/src/buildtool/main/main.cpp +++ b/src/buildtool/main/main.cpp @@ -17,6 +17,7 @@ #include <filesystem> #include <fstream> #include <iostream> +#include <mutex> #include <optional> #include <string> #include <unordered_map> @@ -1017,14 +1018,36 @@ auto main(int argc, char* argv[]) -> int { arguments.common.jobs}; auto id = ReadConfiguredTarget( main_repo, main_ws_root, &repo_config, arguments.analysis); - auto result = - AnalyseTarget(id, - &result_map, - &repo_config, - Storage::Instance().TargetCache(), - &stats, - arguments.common.jobs, - arguments.analysis.request_action_input); + auto serve_errors = nlohmann::json::array(); + std::mutex serve_errors_access{}; + BuildMaps::Target::ServeFailureLogReporter collect_serve_errors = + [&serve_errors, &serve_errors_access](auto target, auto blob) { + std::unique_lock lock(serve_errors_access); + auto target_desc = nlohmann::json::array(); + target_desc.push_back(target.target.ToJson()); + target_desc.push_back(target.config.ToJson()); + auto entry = nlohmann::json::array(); + entry.push_back(target_desc); + entry.push_back(blob); + serve_errors.push_back(entry); + }; + auto result = AnalyseTarget(id, + &result_map, + &repo_config, + Storage::Instance().TargetCache(), + &stats, + arguments.common.jobs, + arguments.analysis.request_action_input, + /*logger=*/nullptr, + &collect_serve_errors); + if (arguments.analysis.serve_errors_file) { + Logger::Log( + serve_errors.empty() ? LogLevel::Debug : LogLevel::Info, + "Dumping serve-error information to {}", + arguments.analysis.serve_errors_file->string()); + std::ofstream os(*arguments.analysis.serve_errors_file); + os << serve_errors.dump() << std::endl; + } if (result) { if (arguments.analysis.graph_file) { result_map.ToFile( |