diff --git a/src/plugins/coreplugin/iversioncontrol.cpp b/src/plugins/coreplugin/iversioncontrol.cpp index b8d9582834b..38876c0d72b 100644 --- a/src/plugins/coreplugin/iversioncontrol.cpp +++ b/src/plugins/coreplugin/iversioncontrol.cpp @@ -26,6 +26,7 @@ #include "iversioncontrol.h" #include "vcsmanager.h" +#include #include #include @@ -147,6 +148,14 @@ IVersionControl::~IVersionControl() delete m_topicCache; } +QStringList IVersionControl::unmanagedFiles(const QString &workingDir, + const QStringList &filePaths) const +{ + return Utils::filtered(filePaths, [wd = QDir(workingDir), this](const QString &f) { + return !managesFile(wd.path(), wd.relativeFilePath(f)); + }); +} + IVersionControl::OpenSupportMode IVersionControl::openSupportMode(const QString &fileName) const { Q_UNUSED(fileName) diff --git a/src/plugins/coreplugin/iversioncontrol.h b/src/plugins/coreplugin/iversioncontrol.h index 5838a03e390..794a5eee045 100644 --- a/src/plugins/coreplugin/iversioncontrol.h +++ b/src/plugins/coreplugin/iversioncontrol.h @@ -123,6 +123,15 @@ public: */ virtual bool managesFile(const QString &workingDirectory, const QString &fileName) const = 0; + /*! + * Returns the subset of \a filePaths that is not managed by this version control. + * + * \a workingDirectory is assumed to be part of a valid repository (not necessarily its + * top level). The \a filePaths are expected to be absolute paths. + */ + virtual QStringList unmanagedFiles(const QString &workingDir, + const QStringList &filePaths) const; + /*! * Returns true is the VCS is configured to run. */ diff --git a/src/plugins/coreplugin/vcsmanager.cpp b/src/plugins/coreplugin/vcsmanager.cpp index 0de226c5cf0..6b82d89caf5 100644 --- a/src/plugins/coreplugin/vcsmanager.cpp +++ b/src/plugins/coreplugin/vcsmanager.cpp @@ -400,12 +400,7 @@ void VcsManager::promptToAdd(const QString &directory, const QStringList &fileNa if (!vc || !vc->supportsOperation(IVersionControl::AddOperation)) return; - QStringList unmanagedFiles; - QDir dir(directory); - foreach (const QString &fileName, fileNames) { - if (!vc->managesFile(directory, dir.relativeFilePath(fileName))) - unmanagedFiles << fileName; - } + const QStringList unmanagedFiles = vc->unmanagedFiles(directory, fileNames); if (unmanagedFiles.isEmpty()) return;