summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhjk <hjk@qt.io>2022-11-21 12:03:54 +0100
committerhjk <hjk@qt.io>2022-11-21 11:42:12 +0000
commit02c041c13a747d2cf42866b441715d2858ecaa66 (patch)
treece3599a8813731d9b40986b368d8725fcb188373
parent0f2db176fafe6b981f4fb8d35d7d7070dad3d92a (diff)
downloadqt-creator-02c041c13a747d2cf42866b441715d2858ecaa66.tar.gz
Utils: Introduce FilePath::isSameExecutable()
... to replace Environment::isSameExectuable(). New code is a filepathified copy of the orginal. Change-Id: Iebf61cd183c9a5c03a5b8a90a33b5e074af9ecbe Reviewed-by: Marcus Tillmanns <marcus.tillmanns@qt.io> Reviewed-by: hjk <hjk@qt.io>
-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);