diff options
author | hjk <hjk@qt.io> | 2022-11-21 12:03:54 +0100 |
---|---|---|
committer | hjk <hjk@qt.io> | 2022-11-21 11:42:12 +0000 |
commit | 02c041c13a747d2cf42866b441715d2858ecaa66 (patch) | |
tree | ce3599a8813731d9b40986b368d8725fcb188373 | |
parent | 0f2db176fafe6b981f4fb8d35d7d7070dad3d92a (diff) | |
download | qt-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.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); |