diff options
author | Oliver Reiche <oliver.reiche@huawei.com> | 2025-05-12 12:11:35 +0200 |
---|---|---|
committer | Oliver Reiche <oliver.reiche@huawei.com> | 2025-05-12 18:30:04 +0200 |
commit | 541ccbb58b9d85af308a1cbfbc6642c19758b883 (patch) | |
tree | 3cd7dde38d247526fe468c214ae69a4a5c578f93 /src | |
parent | d10a46220c536a7a44972154d4fb4a83e18cbdd4 (diff) | |
download | justbuild-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.cpp | 12 |
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: { |