summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorOliver Reiche <oliver.reiche@huawei.com>2025-05-12 12:11:35 +0200
committerOliver Reiche <oliver.reiche@huawei.com>2025-05-12 18:30:04 +0200
commit541ccbb58b9d85af308a1cbfbc6642c19758b883 (patch)
tree3cd7dde38d247526fe468c214ae69a4a5c578f93 /src
parentd10a46220c536a7a44972154d4fb4a83e18cbdd4 (diff)
downloadjustbuild-541ccbb58b9d85af308a1cbfbc6642c19758b883.tar.gz
TreeOperationsUtils: Fix Bazel Directory creation
... which requires all entries to be sorted in lexicographical order.
Diffstat (limited to 'src')
-rw-r--r--src/buildtool/execution_engine/tree_operations/tree_operations_utils.cpp12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/buildtool/execution_engine/tree_operations/tree_operations_utils.cpp b/src/buildtool/execution_engine/tree_operations/tree_operations_utils.cpp
index a650d88f..ecf08e8e 100644
--- a/src/buildtool/execution_engine/tree_operations/tree_operations_utils.cpp
+++ b/src/buildtool/execution_engine/tree_operations/tree_operations_utils.cpp
@@ -14,9 +14,12 @@
#include "src/buildtool/execution_engine/tree_operations/tree_operations_utils.hpp"
+#include <algorithm>
#include <cstddef>
#include <functional>
+#include <iterator>
#include <memory>
+#include <set>
#include <type_traits> // for remove_reference
#include <unordered_set>
#include <vector>
@@ -162,9 +165,16 @@ auto TreeOperationsUtils::ReadTree(
auto TreeOperationsUtils::SerializeBazelDirectory(
TreeEntries const& tree_entries) noexcept -> std::optional<std::string> {
+ // Sort tree entry names, so we can process them in the correct order.
+ auto sorted = std::set<std::string>{};
+ std::transform(tree_entries.begin(),
+ tree_entries.end(),
+ std::inserter(sorted, sorted.end()),
+ [](auto const& name_entry) { return name_entry.first; });
// Convert tree entries to bazel directory.
bazel_re::Directory bazel_directory{};
- for (auto const& [name, entry] : tree_entries) {
+ for (auto const& name : sorted) {
+ auto const& entry = tree_entries.at(name);
switch (entry.info.type) {
case ObjectType::File:
case ObjectType::Executable: {