From 2bf72a6dfd2aabf9ca2c6f6051f29fa00a1cce3b Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 2 Jul 2021 08:53:59 +0200 Subject: [PATCH] Utils: Move resolveSymLinks from FileUtils to FilePath And make it work with remote paths. Change-Id: I1fe4548547231338284152a86c43f5d0b1eba4d6 Reviewed-by: Christian Stenger --- src/libs/utils/environment.cpp | 2 +- src/libs/utils/fileutils.cpp | 18 ++++++++++-------- src/libs/utils/fileutils.h | 2 +- src/libs/utils/savefile.cpp | 3 +-- 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/libs/utils/environment.cpp b/src/libs/utils/environment.cpp index fe1769daffa..87c17b6b560 100644 --- a/src/libs/utils/environment.cpp +++ b/src/libs/utils/environment.cpp @@ -183,7 +183,7 @@ bool Environment::isSameExecutable(const QString &exe1, const QString &exe2) con const FilePath f2 = FilePath::fromString(i2); if (f1 == f2) return true; - if (FileUtils::resolveSymlinks(f1) == FileUtils::resolveSymlinks(f2)) + if (f1.resolveSymlinks() == f2.resolveSymlinks()) return true; if (FileUtils::fileId(f1) == FileUtils::fileId(f2)) return true; diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp index 9e68b91853d..e44faa5e087 100644 --- a/src/libs/utils/fileutils.cpp +++ b/src/libs/utils/fileutils.cpp @@ -224,7 +224,7 @@ Qt::CaseSensitivity FilePath::caseSensitivity() const } /*! - Recursively resolves symlinks if \a filePath is a symlink. + Recursively resolves symlinks if this is a symlink. To resolve symlinks anywhere in the path, see canonicalPath. Unlike QFileInfo::canonicalFilePath(), this function will still return the expected deepest target file even if the symlink is dangling. @@ -233,15 +233,17 @@ Qt::CaseSensitivity FilePath::caseSensitivity() const Returns the symlink target file path. */ -FilePath FileUtils::resolveSymlinks(const FilePath &path) +FilePath FilePath::resolveSymlinks() const { - QFileInfo f = path.toFileInfo(); + FilePath current = *this; int links = 16; - while (links-- && f.isSymLink()) - f.setFile(f.dir(), f.symLinkTarget()); - if (links <= 0) - return FilePath(); - return FilePath::fromString(f.filePath()); + while (links--) { + const FilePath target = current.symLinkTarget(); + if (target.isEmpty()) + return current; + current = target; + } + return current; } /*! diff --git a/src/libs/utils/fileutils.h b/src/libs/utils/fileutils.h index ab429a706b1..0d8d48d0285 100644 --- a/src/libs/utils/fileutils.h +++ b/src/libs/utils/fileutils.h @@ -195,6 +195,7 @@ public: FilePath canonicalPath() const; FilePath symLinkTarget() const; + FilePath resolveSymlinks() const; FilePath withExecutableSuffix() const; FilePath operator/(const QString &str) const; @@ -256,7 +257,6 @@ public: T &©Helper); static bool copyIfDifferent(const FilePath &srcFilePath, const FilePath &tgtFilePath); - static FilePath resolveSymlinks(const FilePath &path); static QString fileSystemFriendlyName(const QString &name); static int indexOfQmakeUnfriendly(const QString &name, int startpos = 0); static QString qmakeFriendlyName(const QString &name); diff --git a/src/libs/utils/savefile.cpp b/src/libs/utils/savefile.cpp index e96845e74bf..721a87217ea 100644 --- a/src/libs/utils/savefile.cpp +++ b/src/libs/utils/savefile.cpp @@ -118,8 +118,7 @@ bool SaveFile::commit() return false; } - QString finalFileName - = FileUtils::resolveSymlinks(FilePath::fromString(m_finalFileName)).toString(); + QString finalFileName = FilePath::fromString(m_finalFileName).resolveSymlinks().toString(); #ifdef Q_OS_WIN // Release the file lock