summaryrefslogtreecommitdiff
path: root/src/buildtool/file_system/file_system_manager.hpp
diff options
context:
space:
mode:
authorPaul Cristian Sarbu <paul.cristian.sarbu@huawei.com>2023-05-30 17:58:38 +0200
committerPaul Cristian Sarbu <paul.cristian.sarbu@huawei.com>2023-06-26 17:57:29 +0200
commit39fc14811a67cc4381de726840e7b852f7d126c9 (patch)
tree296b8e1394ec3a09042db71b48b0d3b8a05d0f15 /src/buildtool/file_system/file_system_manager.hpp
parent0b924c5c23a89760ddecf8d8f6baa19333f9b667 (diff)
downloadjustbuild-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.hpp22
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;
}