From 0cd5230f6ab4af830077495eb93b656745f83bee Mon Sep 17 00:00:00 2001 From: David Schulz Date: Mon, 10 Jun 2024 12:25:28 +0200 Subject: [PATCH] VCS: Improve performance of isVcsFileOrDirectory implementations FilePath operations are relative expensive on Windows compared to the cost of a string comparison, so always first check the file name before checking any file meta data. Change-Id: Ibb4c13d7e11e0c01bdf3706a62362f4c0a27d284 Reviewed-by: Eike Ziller Reviewed-by: Orgad Shaneh --- src/plugins/bazaar/bazaarclient.cpp | 4 ++-- src/plugins/cvs/cvsplugin.cpp | 4 ++-- src/plugins/fossil/fossilclient.cpp | 5 ++--- src/plugins/mercurial/mercurialclient.cpp | 5 +++-- src/plugins/subversion/subversionplugin.cpp | 4 ++-- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/plugins/bazaar/bazaarclient.cpp b/src/plugins/bazaar/bazaarclient.cpp index 303b7e21c28..77cfd1545cf 100644 --- a/src/plugins/bazaar/bazaarclient.cpp +++ b/src/plugins/bazaar/bazaarclient.cpp @@ -147,8 +147,8 @@ void BazaarClient::annotate(const Utils::FilePath &workingDir, const QString &fi bool BazaarClient::isVcsDirectory(const FilePath &filePath) const { - return filePath.isDir() - && !filePath.fileName().compare(Constants::BAZAARREPO, HostOsInfo::fileNameCaseSensitivity()); + return !filePath.fileName().compare(Constants::BAZAARREPO, HostOsInfo::fileNameCaseSensitivity()) + && filePath.isDir(); } FilePath BazaarClient::findTopLevelForFile(const FilePath &file) const diff --git a/src/plugins/cvs/cvsplugin.cpp b/src/plugins/cvs/cvsplugin.cpp index 6a25b29fa04..4d6a8e51789 100644 --- a/src/plugins/cvs/cvsplugin.cpp +++ b/src/plugins/cvs/cvsplugin.cpp @@ -333,8 +333,8 @@ Utils::Id CvsPluginPrivate::id() const bool CvsPluginPrivate::isVcsFileOrDirectory(const Utils::FilePath &filePath) const { - return filePath.isDir() - && !filePath.fileName().compare("CVS", Utils::HostOsInfo::fileNameCaseSensitivity()); + return !filePath.fileName().compare("CVS", Utils::HostOsInfo::fileNameCaseSensitivity()) + && filePath.isDir(); } bool CvsPluginPrivate::isConfigured() const diff --git a/src/plugins/fossil/fossilclient.cpp b/src/plugins/fossil/fossilclient.cpp index 2c077a3b591..d80dc223cd6 100644 --- a/src/plugins/fossil/fossilclient.cpp +++ b/src/plugins/fossil/fossilclient.cpp @@ -742,9 +742,8 @@ void FossilClient::annotate(const FilePath &workingDir, const QString &file, int bool FossilClient::isVcsFileOrDirectory(const FilePath &filePath) const { // false for any dir or file other than fossil checkout db-file - return filePath.toFileInfo().isFile() - && !filePath.fileName().compare(Constants::FOSSILREPO, - HostOsInfo::fileNameCaseSensitivity()); + return !filePath.fileName().compare(Constants::FOSSILREPO, HostOsInfo::fileNameCaseSensitivity()) + && filePath.isFile(); } FilePath FossilClient::findTopLevelForFile(const FilePath &file) const diff --git a/src/plugins/mercurial/mercurialclient.cpp b/src/plugins/mercurial/mercurialclient.cpp index 6140706d001..d73d7655738 100644 --- a/src/plugins/mercurial/mercurialclient.cpp +++ b/src/plugins/mercurial/mercurialclient.cpp @@ -347,8 +347,9 @@ void MercurialClient::revertAll(const FilePath &workingDir, const QString &revis bool MercurialClient::isVcsDirectory(const FilePath &filePath) const { - return filePath.isDir() - && !filePath.fileName().compare(Constants::MERCURIALREPO, HostOsInfo::fileNameCaseSensitivity()); + return !filePath.fileName() + .compare(Constants::MERCURIALREPO, HostOsInfo::fileNameCaseSensitivity()) + && filePath.isDir(); } void MercurialClient::view(const FilePath &source, const QString &id, diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp index 36a5455a629..2339893fcd4 100644 --- a/src/plugins/subversion/subversionplugin.cpp +++ b/src/plugins/subversion/subversionplugin.cpp @@ -477,9 +477,9 @@ SubversionPluginPrivate::SubversionPluginPrivate() bool SubversionPluginPrivate::isVcsDirectory(const FilePath &fileName) const { const QString baseName = fileName.fileName(); - return fileName.isDir() && contains(m_svnDirectories, [baseName](const QString &s) { + return contains(m_svnDirectories, [baseName](const QString &s) { return !baseName.compare(s, HostOsInfo::fileNameCaseSensitivity()); - }); + }) && fileName.isDir(); } bool SubversionPluginPrivate::activateCommit()