diff options
Diffstat (limited to 'src/buildtool/execution_api/common/execution_api.cpp')
-rw-r--r-- | src/buildtool/execution_api/common/execution_api.cpp | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/src/buildtool/execution_api/common/execution_api.cpp b/src/buildtool/execution_api/common/execution_api.cpp new file mode 100644 index 00000000..f91dee43 --- /dev/null +++ b/src/buildtool/execution_api/common/execution_api.cpp @@ -0,0 +1,56 @@ +// Copyright 2023 Huawei Cloud Computing Technology Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "src/buildtool/execution_api/common/execution_api.hpp" + +#include "src/buildtool/execution_api/bazel_msg/bazel_blob_container.hpp" +#include "src/buildtool/file_system/file_system_manager.hpp" + +#include <gsl/gsl> + +[[nodiscard]] auto IExecutionApi::UploadFile( + std::filesystem::path const& file_path, + ObjectType type) noexcept -> bool { + auto data = FileSystemManager::ReadFile(file_path); + if (not data) { + return false; + } + ArtifactDigest digest{}; + switch (type) { + case ObjectType::File: + digest = ArtifactDigest::Create<ObjectType::File>(*data); + break; + case ObjectType::Executable: + digest = ArtifactDigest::Create<ObjectType::Executable>(*data); + break; + case ObjectType::Tree: + digest = ArtifactDigest::Create<ObjectType::Tree>(*data); + break; + case ObjectType::Symlink: + digest = ArtifactDigest::Create<ObjectType::Symlink>(*data); + break; + default: + Ensures(false); // unreachable + return false; + } + BlobContainer container{}; + try { + auto exec = IsExecutableObject(type); + container.Emplace(BazelBlob{digest, *data, exec}); + } catch (std::exception const& ex) { + Logger::Log(LogLevel::Error, "failed to emplace blob: ", ex.what()); + return false; + } + return Upload(container); +} |