diff options
author | Paul Cristian Sarbu <paul.cristian.sarbu@huawei.com> | 2023-05-30 17:58:38 +0200 |
---|---|---|
committer | Paul Cristian Sarbu <paul.cristian.sarbu@huawei.com> | 2023-06-26 17:57:29 +0200 |
commit | 39fc14811a67cc4381de726840e7b852f7d126c9 (patch) | |
tree | 296b8e1394ec3a09042db71b48b0d3b8a05d0f15 /src/buildtool/file_system/file_system_manager.hpp | |
parent | 0b924c5c23a89760ddecf8d8f6baa19333f9b667 (diff) | |
download | justbuild-39fc14811a67cc4381de726840e7b852f7d126c9.tar.gz |
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.
Diffstat (limited to 'src/buildtool/file_system/file_system_manager.hpp')
-rw-r--r-- | src/buildtool/file_system/file_system_manager.hpp | 22 |
1 files changed, 22 insertions, 0 deletions
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<ObjectType::Executable, kSetEpochTime, kSetWritable>(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<ObjectType::Executable, kSetEpochTime, kSetWritable>(content, file, fd_less); + case ObjectType::Symlink: case ObjectType::Tree: return false; } |