summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/buildtool/common/cli.hpp5
-rw-r--r--src/buildtool/execution_api/common/execution_api.hpp9
-rw-r--r--src/buildtool/execution_api/local/local_api.hpp3
-rw-r--r--src/buildtool/execution_api/remote/bazel/bazel_api.cpp3
-rw-r--r--src/buildtool/execution_api/remote/bazel/bazel_api.hpp3
-rw-r--r--src/buildtool/graph_traverser/graph_traverser.hpp3
-rw-r--r--src/buildtool/main/main.cpp3
7 files changed, 21 insertions, 8 deletions
diff --git a/src/buildtool/common/cli.hpp b/src/buildtool/common/cli.hpp
index 3966f888..46af6598 100644
--- a/src/buildtool/common/cli.hpp
+++ b/src/buildtool/common/cli.hpp
@@ -97,6 +97,7 @@ struct RebuildArguments {
struct FetchArguments {
std::string object_id{};
std::optional<std::filesystem::path> output_path{};
+ bool raw_tree{};
};
/// \brief Arguments required for running from graph file.
@@ -377,6 +378,10 @@ static inline auto SetupFetchArguments(
},
"Install path for the artifact. (omit to dump to stdout)")
->type_name("PATH");
+
+ app->add_flag("--raw-tree",
+ clargs->raw_tree,
+ "Dump raw tree object (omit pretty printting)");
}
static inline auto SetupGraphArguments(
diff --git a/src/buildtool/execution_api/common/execution_api.hpp b/src/buildtool/execution_api/common/execution_api.hpp
index 816b5031..661ecbf3 100644
--- a/src/buildtool/execution_api/common/execution_api.hpp
+++ b/src/buildtool/execution_api/common/execution_api.hpp
@@ -52,11 +52,14 @@ class IExecutionApi {
-> bool = 0;
/// \brief Retrieve artifacts from CAS and write to file descriptors.
- /// Tree artifacts are not resolved and instead the raw protobuf message
- /// will be written to fd.
+ /// Tree artifacts are not resolved and instead the tree object will be
+ /// pretty-printed before writing to fd. If `raw_tree` is set, pretty
+ /// printing will be omitted and the raw tree object will be written
+ /// instead.
[[nodiscard]] virtual auto RetrieveToFds(
std::vector<Artifact::ObjectInfo> const& artifacts_info,
- std::vector<int> const& fds) noexcept -> bool = 0;
+ std::vector<int> const& fds,
+ bool raw_tree) noexcept -> bool = 0;
/// \brief Upload blobs to CAS. Uploads only the blobs that are not yet
/// available in CAS, unless `skip_find_missing` is specified.
diff --git a/src/buildtool/execution_api/local/local_api.hpp b/src/buildtool/execution_api/local/local_api.hpp
index 72b7e28c..c1cb1c57 100644
--- a/src/buildtool/execution_api/local/local_api.hpp
+++ b/src/buildtool/execution_api/local/local_api.hpp
@@ -74,7 +74,8 @@ class LocalApi final : public IExecutionApi {
[[nodiscard]] auto RetrieveToFds(
std::vector<Artifact::ObjectInfo> const& artifacts_info,
- std::vector<int> const& fds) noexcept -> bool final {
+ std::vector<int> const& fds,
+ bool /*raw_tree*/) noexcept -> bool final {
if (artifacts_info.size() != fds.size()) {
Logger::Log(LogLevel::Error,
"different number of digests and file descriptors.");
diff --git a/src/buildtool/execution_api/remote/bazel/bazel_api.cpp b/src/buildtool/execution_api/remote/bazel/bazel_api.cpp
index 51e85176..c2893917 100644
--- a/src/buildtool/execution_api/remote/bazel/bazel_api.cpp
+++ b/src/buildtool/execution_api/remote/bazel/bazel_api.cpp
@@ -115,7 +115,8 @@ auto BazelApi::CreateAction(
[[nodiscard]] auto BazelApi::RetrieveToFds(
std::vector<Artifact::ObjectInfo> const& artifacts_info,
- std::vector<int> const& fds) noexcept -> bool {
+ std::vector<int> const& fds,
+ bool /*raw_tree*/) noexcept -> bool {
if (artifacts_info.size() != fds.size()) {
Logger::Log(LogLevel::Error,
"different number of digests and file descriptors.");
diff --git a/src/buildtool/execution_api/remote/bazel/bazel_api.hpp b/src/buildtool/execution_api/remote/bazel/bazel_api.hpp
index f953618e..d9619d82 100644
--- a/src/buildtool/execution_api/remote/bazel/bazel_api.hpp
+++ b/src/buildtool/execution_api/remote/bazel/bazel_api.hpp
@@ -45,7 +45,8 @@ class BazelApi final : public IExecutionApi {
[[nodiscard]] auto RetrieveToFds(
std::vector<Artifact::ObjectInfo> const& artifacts_info,
- std::vector<int> const& fds) noexcept -> bool final;
+ std::vector<int> const& fds,
+ bool raw_tree) noexcept -> bool final;
[[nodiscard]] auto Upload(BlobContainer const& blobs,
bool skip_find_missing) noexcept -> bool final;
diff --git a/src/buildtool/graph_traverser/graph_traverser.hpp b/src/buildtool/graph_traverser/graph_traverser.hpp
index e61a7280..18a055a8 100644
--- a/src/buildtool/graph_traverser/graph_traverser.hpp
+++ b/src/buildtool/graph_traverser/graph_traverser.hpp
@@ -610,7 +610,8 @@ class GraphTraverser {
auto info = artifacts[i]->Content().Info();
if (info) {
if (not api_->RetrieveToFds({*info},
- {dup(fileno(stdout))})) {
+ {dup(fileno(stdout))},
+ /*raw_tree=*/false)) {
Logger::Log(LogLevel::Error,
"Failed to retrieve {}",
*(clargs_.build.print_to_stdout));
diff --git a/src/buildtool/main/main.cpp b/src/buildtool/main/main.cpp
index b0d17bbd..953504ca 100644
--- a/src/buildtool/main/main.cpp
+++ b/src/buildtool/main/main.cpp
@@ -1189,7 +1189,8 @@ void ReportTaintedness(const AnalysisResult& result) {
output_path.string());
}
else { // dump to stdout
- if (not api->RetrieveToFds({object_info}, {dup(fileno(stdout))})) {
+ if (not api->RetrieveToFds(
+ {object_info}, {dup(fileno(stdout))}, clargs.raw_tree)) {
Logger::Log(LogLevel::Error, "failed to dump artifact.");
return false;
}