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