diff options
-rw-r--r-- | src/libs/utils/filepath.cpp | 36 | ||||
-rw-r--r-- | src/libs/utils/filepath.h | 1 |
2 files changed, 37 insertions, 0 deletions
diff --git a/src/libs/utils/filepath.cpp b/src/libs/utils/filepath.cpp index 4f225a76b5..4016676ef7 100644 --- a/src/libs/utils/filepath.cpp +++ b/src/libs/utils/filepath.cpp @@ -548,6 +548,42 @@ bool FilePath::isSameFile(const FilePath &other) const return false; } +static FilePaths appendExeExtensions(const Environment &env, const FilePath &executable) +{ + FilePaths execs = {executable}; + if (executable.osType() == OsTypeWindows) { + // Check all the executable extensions on windows: + // PATHEXT is only used if the executable has no extension + if (executable.suffix().isEmpty()) { + const QStringList extensions = env.expandedValueForKey("PATHEXT").split(';'); + + for (const QString &ext : extensions) + execs << executable + ext.toLower(); + } + } + return execs; +} + +bool FilePath::isSameExecutable(const FilePath &other) const +{ + if (*this == other) + return true; + + if (!isSameDevice(other)) + return false; + + const Environment env = other.deviceEnvironment(); + const FilePaths exe1List = appendExeExtensions(env, *this); + const FilePaths exe2List = appendExeExtensions(env, other); + for (const FilePath &f1 : exe1List) { + for (const FilePath &f2 : exe2List) { + if (f1.isSameFile(f2)) + return true; + } + } + return false; +} + /// \returns an empty FilePath if this is not a symbolic linl FilePath FilePath::symLinkTarget() const { diff --git a/src/libs/utils/filepath.h b/src/libs/utils/filepath.h index 8b3e9f69ee..ebbe25421e 100644 --- a/src/libs/utils/filepath.h +++ b/src/libs/utils/filepath.h @@ -210,6 +210,7 @@ public: bool isSameDevice(const FilePath &other) const; bool isSameFile(const FilePath &other) const; + bool isSameExecutable(const FilePath &other) const; // with potentially different suffixes [[nodiscard]] QFileInfo toFileInfo() const; [[nodiscard]] static FilePath fromFileInfo(const QFileInfo &info); |