From 1258417cf03b3978005a637c3536873fef146c38 Mon Sep 17 00:00:00 2001 From: Paul Cristian Sarbu Date: Thu, 22 May 2025 17:44:28 +0200 Subject: GitTree: Allow tree reading to skip symlinks checker This is useful when the caller already knows that the tree to look up is valid, and thus the extra check step can be safely skipped. --- src/buildtool/file_system/git_tree.cpp | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) (limited to 'src/buildtool/file_system/git_tree.cpp') diff --git a/src/buildtool/file_system/git_tree.cpp b/src/buildtool/file_system/git_tree.cpp index ca0727fb..3b9f3a8e 100644 --- a/src/buildtool/file_system/git_tree.cpp +++ b/src/buildtool/file_system/git_tree.cpp @@ -86,14 +86,19 @@ auto GitTree::Read(std::filesystem::path const& repo_path, auto GitTree::Read(gsl::not_null const& cas, std::string const& tree_id, - bool ignore_special) noexcept -> std::optional { + bool ignore_special, + bool skip_checks) noexcept -> std::optional { if (auto raw_id = FromHexString(tree_id)) { auto repo = GitRepo::Open(cas); if (repo != std::nullopt) { - if (auto entries = repo->ReadTree(*raw_id, - SymlinksChecker{cas}, - /*is_hex_id=*/false, - ignore_special)) { + auto entries = + skip_checks ? repo->ReadDirectTree( + *raw_id, /*is_hex_id=*/false, ignore_special) + : repo->ReadTree(*raw_id, + SymlinksChecker{cas}, + /*is_hex_id=*/false, + ignore_special); + if (entries) { // NOTE: the raw_id value is NOT recomputed when // ignore_special==true. return GitTree::FromEntries( @@ -155,11 +160,13 @@ auto GitTreeEntry::Tree(bool ignore_special) const& noexcept if (repo == std::nullopt) { return std::nullopt; } - - if (auto entries = repo->ReadTree(raw_id_, - SymlinksChecker{cas_}, - /*is_hex_id=*/false, - ignore_special)) { + auto entries = repo->ReadTree(raw_id_, + SymlinksChecker{cas_}, + /*is_hex_id=*/false, + ignore_special); + if (entries) { + // NOTE: the raw_id value is NOT recomputed when + // ignore_special==true. return GitTree::FromEntries( cas_, std::move(*entries), raw_id_, ignore_special); } -- cgit v1.2.3