aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/libs/utils/filepath.cpp36
-rw-r--r--src/libs/utils/filepath.h1
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);