diff options
author | Eike Ziller <[email protected]> | 2024-11-28 14:22:41 +0100 |
---|---|---|
committer | Eike Ziller <[email protected]> | 2024-11-29 10:37:26 +0000 |
commit | 15f1cc2fceba79b4dbb58e3717626c65330e3db6 (patch) | |
tree | 6fab85bda62c977deca7e38af5c5c58518cb118b /src | |
parent | 71be035eb3d1aa9f2bffbd6c1498c74ab06c4b50 (diff) |
VCS: Move convenience function to Core::VcsManager
It doesn't have any dependencies to VcsBase, and this way we can utilize
it in VcsManager directly.
Change-Id: I62c6314b363904055127bc11c4f7426948805c3d
Reviewed-by: André Hartmann <[email protected]>
Reviewed-by: Orgad Shaneh <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/bazaar/bazaarplugin.cpp | 2 | ||||
-rw-r--r-- | src/plugins/coreplugin/vcsmanager.cpp | 28 | ||||
-rw-r--r-- | src/plugins/coreplugin/vcsmanager.h | 7 | ||||
-rw-r--r-- | src/plugins/fossil/fossilplugin.cpp | 2 | ||||
-rw-r--r-- | src/plugins/git/gitclient.cpp | 2 | ||||
-rw-r--r-- | src/plugins/mercurial/mercurialplugin.cpp | 4 | ||||
-rw-r--r-- | src/plugins/subversion/subversionplugin.cpp | 2 | ||||
-rw-r--r-- | src/plugins/vcsbase/vcsbaseplugin.cpp | 26 | ||||
-rw-r--r-- | src/plugins/vcsbase/vcsbaseplugin.h | 7 |
9 files changed, 41 insertions, 39 deletions
diff --git a/src/plugins/bazaar/bazaarplugin.cpp b/src/plugins/bazaar/bazaarplugin.cpp index a8b0baa67c1..9102966a3dc 100644 --- a/src/plugins/bazaar/bazaarplugin.cpp +++ b/src/plugins/bazaar/bazaarplugin.cpp @@ -871,7 +871,7 @@ bool BazaarPluginPrivate::isVcsFileOrDirectory(const Utils::FilePath &fileName) bool BazaarPluginPrivate::managesDirectory(const FilePath &directory, FilePath *topLevel) const { - const FilePath topLevelFound = VcsBase::findRepositoryForFile( + const FilePath topLevelFound = VcsManager::findRepositoryForFiles( directory, {QString(Constants::BAZAARREPO) + "/branch-format"}); if (topLevel) *topLevel = topLevelFound; diff --git a/src/plugins/coreplugin/vcsmanager.cpp b/src/plugins/coreplugin/vcsmanager.cpp index 3a419d507c7..de146a5656b 100644 --- a/src/plugins/coreplugin/vcsmanager.cpp +++ b/src/plugins/coreplugin/vcsmanager.cpp @@ -25,6 +25,8 @@ #include <optional> +static Q_LOGGING_CATEGORY(findRepoLog, "qtc.vcs.find-repo", QtWarningMsg) + using namespace Utils; namespace Core { @@ -436,6 +438,32 @@ void VcsManager::clearVersionControlCache() emit m_instance->repositoryChanged(repo); } +// Find top level for version controls like git/Mercurial that have +// a directory at the top of the repository. +// Note that checking for the existence of files is preferred over directories +// since checking for directories can cause them to be created when +// AutoFS is used (due its automatically creating mountpoints when querying +// a directory). In addition, bail out when reaching the home directory +// of the user or root (generally avoid '/', where mountpoints are created). +FilePath VcsManager::findRepositoryForFiles( + const Utils::FilePath &fileOrDir, const QStringList &checkFiles) +{ + const FilePath dirS = fileOrDir.isDir() ? fileOrDir : fileOrDir.parentDir(); + qCDebug(findRepoLog) << ">" << dirS << checkFiles; + QTC_ASSERT(!dirS.isEmpty(), return {}); + + FilePath parent; + for (FilePath dir = dirS; !dir.isEmpty() && !dir.isRootPath(); dir = dir.parentDir()) { + for (const QString &checkFile : checkFiles) { + if (dir.pathAppended(checkFile).isFile()) { + qCDebug(findRepoLog) << "<" << dir.toUserOutput(); + return dir; + } + } + } + return {}; +} + void VcsManager::handleConfigurationChanges(IVersionControl *vc) { d->m_cachedAdditionalToolsPathsDirty = true; diff --git a/src/plugins/coreplugin/vcsmanager.h b/src/plugins/coreplugin/vcsmanager.h index 4daad33124d..f12b0df9ffa 100644 --- a/src/plugins/coreplugin/vcsmanager.h +++ b/src/plugins/coreplugin/vcsmanager.h @@ -76,6 +76,13 @@ public: static void clearVersionControlCache(); + // Convenience that searches for the repository specifically for version control + // systems that do not have directories like "CVS" in each managed subdirectory + // but have a directory at the top of the repository like ".git" containing + // a well known file. See implementation for gory details. + static Utils::FilePath findRepositoryForFiles( + const Utils::FilePath &fileOrDir, const QStringList &checkFiles); + signals: void repositoryChanged(const Utils::FilePath &repository); void configurationChanged(const IVersionControl *vcs); diff --git a/src/plugins/fossil/fossilplugin.cpp b/src/plugins/fossil/fossilplugin.cpp index 3c28916a778..ea049c95d93 100644 --- a/src/plugins/fossil/fossilplugin.cpp +++ b/src/plugins/fossil/fossilplugin.cpp @@ -801,7 +801,7 @@ bool FossilPluginPrivate::isVcsFileOrDirectory(const FilePath &filePath) const bool FossilPluginPrivate::managesDirectory(const FilePath &directory, FilePath *topLevel) const { const FilePath topLevelFound - = VcsBase::findRepositoryForFile(directory, {Constants::FOSSILREPO}); + = VcsManager::findRepositoryForFiles(directory, {Constants::FOSSILREPO}); if (topLevel) *topLevel = topLevelFound; return !topLevelFound.isEmpty(); diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index b7ac7428de9..6bb1301f40b 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -837,7 +837,7 @@ GitSettings &GitClient::settings() FilePath GitClient::findRepositoryForDirectory(const FilePath &directory) const { - return VcsBase::findRepositoryForFile(directory, {".git", ".git/config"}); + return VcsManager::findRepositoryForFiles(directory, {".git", ".git/config"}); } FilePath GitClient::findGitDirForRepository(const FilePath &repositoryDir) const diff --git a/src/plugins/mercurial/mercurialplugin.cpp b/src/plugins/mercurial/mercurialplugin.cpp index d45af47fd18..92d50bae398 100644 --- a/src/plugins/mercurial/mercurialplugin.cpp +++ b/src/plugins/mercurial/mercurialplugin.cpp @@ -655,8 +655,8 @@ bool MercurialPluginPrivate::isVcsFileOrDirectory(const FilePath &filePath) cons bool MercurialPluginPrivate::managesDirectory(const FilePath &filePath, FilePath *topLevel) const { - const FilePath topLevelFound - = VcsBase::findRepositoryForFile(filePath, {QString(Constants::MERCURIALREPO) + "/requires"}); + const FilePath topLevelFound = Core::VcsManager::findRepositoryForFiles( + filePath, {QString(Constants::MERCURIALREPO) + "/requires"}); if (topLevel) *topLevel = topLevelFound; return !topLevelFound.isEmpty(); diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp index 8c27cad92e0..e07e9ad3a26 100644 --- a/src/plugins/subversion/subversionplugin.cpp +++ b/src/plugins/subversion/subversionplugin.cpp @@ -1026,7 +1026,7 @@ bool SubversionPluginPrivate::managesDirectory(const FilePath &directory, FilePa const QStringList filesToCheck = transform(m_svnDirectories, [](const QString &s) { return QString(s + "/wc.db"); }); - const FilePath topLevelFound = VcsBase::findRepositoryForFile(directory, filesToCheck); + const FilePath topLevelFound = VcsManager::findRepositoryForFiles(directory, filesToCheck); if (topLevel) *topLevel = topLevelFound; return !topLevelFound.isEmpty(); diff --git a/src/plugins/vcsbase/vcsbaseplugin.cpp b/src/plugins/vcsbase/vcsbaseplugin.cpp index e8b051377f2..1a8f33258e0 100644 --- a/src/plugins/vcsbase/vcsbaseplugin.cpp +++ b/src/plugins/vcsbase/vcsbaseplugin.cpp @@ -38,7 +38,6 @@ using namespace ProjectExplorer; namespace { static Q_LOGGING_CATEGORY(baseLog, "qtc.vcs.base", QtWarningMsg) -static Q_LOGGING_CATEGORY(findRepoLog, "qtc.vcs.find-repo", QtWarningMsg) static Q_LOGGING_CATEGORY(stateLog, "qtc.vcs.state", QtWarningMsg) } @@ -705,31 +704,6 @@ void VersionControlBase::discardCommit() { } -// Find top level for version controls like git/Mercurial that have -// a directory at the top of the repository. -// Note that checking for the existence of files is preferred over directories -// since checking for directories can cause them to be created when -// AutoFS is used (due its automatically creating mountpoints when querying -// a directory). In addition, bail out when reaching the home directory -// of the user or root (generally avoid '/', where mountpoints are created). -FilePath findRepositoryForFile(const FilePath &fileOrDir, const QStringList &checkFiles) -{ - const FilePath dirS = fileOrDir.isDir() ? fileOrDir : fileOrDir.parentDir(); - qCDebug(findRepoLog) << ">" << dirS << checkFiles; - QTC_ASSERT(!dirS.isEmpty(), return {}); - - FilePath parent; - for (FilePath dir = dirS; !dir.isEmpty() && !dir.isRootPath(); dir = dir.parentDir()) { - for (const QString &checkFile : checkFiles) { - if (dir.pathAppended(checkFile).isFile()) { - qCDebug(findRepoLog) << "<" << dir.toUserOutput(); - return dir; - } - } - } - return {}; -} - static const char SOURCE_PROPERTY[] = "qtcreator_source"; void setSource(IDocument *document, const FilePath &source) diff --git a/src/plugins/vcsbase/vcsbaseplugin.h b/src/plugins/vcsbase/vcsbaseplugin.h index 7d7f38b0e56..3505f41d160 100644 --- a/src/plugins/vcsbase/vcsbaseplugin.h +++ b/src/plugins/vcsbase/vcsbaseplugin.h @@ -94,13 +94,6 @@ private: QSharedDataPointer<VcsBasePluginStateData> data; }; -// Convenience that searches for the repository specifically for version control -// systems that do not have directories like "CVS" in each managed subdirectory -// but have a directory at the top of the repository like ".git" containing -// a well known file. See implementation for gory details. -VCSBASE_EXPORT Utils::FilePath findRepositoryForFile( - const Utils::FilePath &fileOrDir, const QStringList &checkFiles); - // Set up the environment for a version control command line call. // Sets up SSH graphical password prompting (note that the latter // requires a terminal-less process) and sets LANG to 'C' to force English |