From 39fc14811a67cc4381de726840e7b852f7d126c9 Mon Sep 17 00:00:00 2001 From: Paul Cristian Sarbu Date: Tue, 30 May 2023 17:58:38 +0200 Subject: ObjectType: Add non-upwards symlinks as a known object type... ...but make sure it is still considered a special type. The only non-special entry types remain file, executable, and tree. --- src/buildtool/file_system/file_system_manager.hpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'src/buildtool/file_system/file_system_manager.hpp') diff --git a/src/buildtool/file_system/file_system_manager.hpp b/src/buildtool/file_system/file_system_manager.hpp index 49357130..8555e8dc 100644 --- a/src/buildtool/file_system/file_system_manager.hpp +++ b/src/buildtool/file_system/file_system_manager.hpp @@ -225,6 +225,7 @@ class FileSystemManager { kSetEpochTime>(file_path, link_path); case ObjectType::Tree: + case ObjectType::Symlink: return false; } } @@ -336,6 +337,7 @@ class FileSystemManager { return CopyFileAs(src, dst, fd_less, opt); + case ObjectType::Symlink: case ObjectType::Tree: break; } @@ -539,6 +541,10 @@ class FileSystemManager { if (std::filesystem::is_directory(status)) { return ObjectType::Tree; } + if (std::filesystem::is_symlink(status) and + IsNonUpwardsSymlink(path)) { + return ObjectType::Symlink; + } if (std::filesystem::exists(status)) { Logger::Log(LogLevel::Debug, "object type for {} is not supported yet.", @@ -633,9 +639,24 @@ class FileSystemManager { else if (std::filesystem::is_directory(status)) { type = ObjectType::Tree; } + // if not file, executable, or tree, ignore every other entry + // type if asked to do so else if (ignore_special) { continue; } + // if not already ignored, check symlinks and only add the + // non-upwards ones + else if (std::filesystem::is_symlink(status)) { + if (IsNonUpwardsSymlink(entry)) { + type = ObjectType::Symlink; + } + else { + Logger::Log(LogLevel::Error, + "unsupported upwards symlink dir entry {}", + entry.path().string()); + return false; + } + } else { Logger::Log(LogLevel::Error, "unsupported type for dir entry {}", @@ -736,6 +757,7 @@ class FileSystemManager { return WriteFileAs(content, file, fd_less); + case ObjectType::Symlink: case ObjectType::Tree: return false; } -- cgit v1.2.3