forked from OSchip/llvm-project
Add vfs::FileSystem::getRealPath
Summary: And change `FileManager::getCanonicalName` to use getRealPath. Reviewers: bkramer Reviewed By: bkramer Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D46942 llvm-svn: 332590
This commit is contained in:
parent
848405b164
commit
5fb18fec5d
|
@ -248,6 +248,12 @@ public:
|
|||
/// Get the working directory of this file system.
|
||||
virtual llvm::ErrorOr<std::string> getCurrentWorkingDirectory() const = 0;
|
||||
|
||||
/// Gets real path of \p Path e.g. collapse all . and .. patterns, resolve
|
||||
/// symlinks. For real file system, this uses `llvm::sys::fs::real_path`.
|
||||
/// This returns errc::operation_not_permitted if not implemented by subclass.
|
||||
virtual std::error_code getRealPath(const Twine &Path,
|
||||
SmallVectorImpl<char> &Output) const;
|
||||
|
||||
/// Check whether a file exists. Provided for convenience.
|
||||
bool exists(const Twine &Path);
|
||||
|
||||
|
|
|
@ -534,23 +534,9 @@ StringRef FileManager::getCanonicalName(const DirectoryEntry *Dir) {
|
|||
|
||||
StringRef CanonicalName(Dir->getName());
|
||||
|
||||
#ifdef LLVM_ON_UNIX
|
||||
char CanonicalNameBuf[PATH_MAX];
|
||||
if (realpath(Dir->getName().str().c_str(), CanonicalNameBuf))
|
||||
SmallString<4096> CanonicalNameBuf;
|
||||
if (!FS->getRealPath(Dir->getName(), CanonicalNameBuf))
|
||||
CanonicalName = StringRef(CanonicalNameBuf).copy(CanonicalNameStorage);
|
||||
#else
|
||||
SmallString<256> CanonicalNameBuf(CanonicalName);
|
||||
llvm::sys::fs::make_absolute(CanonicalNameBuf);
|
||||
llvm::sys::path::native(CanonicalNameBuf);
|
||||
// We've run into needing to remove '..' here in the wild though, so
|
||||
// remove it.
|
||||
// On Windows, symlinks are significantly less prevalent, so removing
|
||||
// '..' is pretty safe.
|
||||
// Ideally we'd have an equivalent of `realpath` and could implement
|
||||
// sys::fs::canonical across all the platforms.
|
||||
llvm::sys::path::remove_dots(CanonicalNameBuf, /* remove_dot_dot */ true);
|
||||
CanonicalName = StringRef(CanonicalNameBuf).copy(CanonicalNameStorage);
|
||||
#endif
|
||||
|
||||
CanonicalDirNames.insert(std::make_pair(Dir, CanonicalName));
|
||||
return CanonicalName;
|
||||
|
|
|
@ -139,6 +139,11 @@ std::error_code FileSystem::makeAbsolute(SmallVectorImpl<char> &Path) const {
|
|||
return llvm::sys::fs::make_absolute(WorkingDir.get(), Path);
|
||||
}
|
||||
|
||||
std::error_code FileSystem::getRealPath(const Twine &Path,
|
||||
SmallVectorImpl<char> &Output) const {
|
||||
return errc::operation_not_permitted;
|
||||
}
|
||||
|
||||
bool FileSystem::exists(const Twine &Path) {
|
||||
auto Status = status(Path);
|
||||
return Status && Status->exists();
|
||||
|
@ -236,6 +241,8 @@ public:
|
|||
|
||||
llvm::ErrorOr<std::string> getCurrentWorkingDirectory() const override;
|
||||
std::error_code setCurrentWorkingDirectory(const Twine &Path) override;
|
||||
std::error_code getRealPath(const Twine &Path,
|
||||
SmallVectorImpl<char> &Output) const override;
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
@ -274,6 +281,12 @@ std::error_code RealFileSystem::setCurrentWorkingDirectory(const Twine &Path) {
|
|||
return llvm::sys::fs::set_current_path(Path);
|
||||
}
|
||||
|
||||
std::error_code
|
||||
RealFileSystem::getRealPath(const Twine &Path,
|
||||
SmallVectorImpl<char> &Output) const {
|
||||
return llvm::sys::fs::real_path(Path, Output);
|
||||
}
|
||||
|
||||
IntrusiveRefCntPtr<FileSystem> vfs::getRealFileSystem() {
|
||||
static IntrusiveRefCntPtr<FileSystem> FS = new RealFileSystem();
|
||||
return FS;
|
||||
|
|
Loading…
Reference in New Issue