ProjectExplorer: Do not use version manager cache in threads

Do not use VcsManager's cache of version control systems from different
threads.

Iterate over all IVersionControls instead of getting the specific version
control for a directory. This is less exact, but will probably not hurt users.

Task-number: QTCREATORBUG-18258
Change-Id: Iae2be5735a0d7ecc8d774904f6681963fca1d114
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
Tobias Hunger
2017-06-19 16:07:25 +02:00
parent e42f3db9f0
commit bc22de5f0a
6 changed files with 55 additions and 17 deletions

View File

@@ -25,6 +25,8 @@
#include "treescanner.h"
#include <coreplugin/iversioncontrol.h>
#include <coreplugin/vcsmanager.h>
#include <projectexplorer/projectexplorerconstants.h>
#include <cpptools/cpptoolsconstants.h>
@@ -67,7 +69,10 @@ bool TreeScanner::asyncScanForFiles(const Utils::FileName &directory)
m_scanFuture = fi->future();
m_futureWatcher.setFuture(m_scanFuture);
Utils::runAsync([this, fi, directory]() { TreeScanner::scanForFiles(fi, directory, m_filter, m_factory); });
if (m_versionControls.isEmpty())
m_versionControls = Core::VcsManager::versionControls();
Utils::runAsync([this, fi, directory]() { TreeScanner::scanForFiles(fi, directory, m_filter, m_factory, m_versionControls); });
return true;
}
@@ -144,13 +149,17 @@ FileType TreeScanner::genericFileType(const Utils::MimeType &mimeType, const Uti
return Node::fileTypeForMimeType(mimeType);
}
void TreeScanner::scanForFiles(FutureInterface *fi, const Utils::FileName& directory, const FileFilter &filter, const FileTypeFactory &factory)
void TreeScanner::scanForFiles(FutureInterface *fi, const Utils::FileName& directory,
const FileFilter &filter, const FileTypeFactory &factory,
QList<Core::IVersionControl *> &versionControls)
{
std::unique_ptr<FutureInterface> fip(fi);
fip->reportStarted();
Result nodes = FileNode::scanForFiles(directory,
[&filter, &factory](const Utils::FileName &fn) -> FileNode * {
Result nodes
= FileNode::scanForFilesWithVersionControls(
directory,
[&filter, &factory](const Utils::FileName &fn) -> FileNode * {
QTC_ASSERT(!fn.isEmpty(), return nullptr);
const Utils::MimeType mimeType = Utils::mimeTypeForFile(fn.toString());
@@ -166,8 +175,7 @@ void TreeScanner::scanForFiles(FutureInterface *fi, const Utils::FileName& direc
type = factory(mimeType, fn);
return new FileNode(fn, type, false);
},
fip.get());
}, versionControls, fip.get());
// Clean up nodes and keep it sorted
Result tmp = Utils::filtered(nodes, [](const FileNode *fn) -> bool {

View File

@@ -36,6 +36,8 @@
#include <functional>
namespace Core { class IVersionControl; }
namespace CMakeProjectManager {
namespace Internal {
@@ -86,7 +88,8 @@ signals:
private:
static void scanForFiles(FutureInterface *fi, const Utils::FileName &directory,
const FileFilter &filter, const FileTypeFactory &factory);
const FileFilter &filter, const FileTypeFactory &factory,
QList<Core::IVersionControl *> &versionControls);
private:
FileFilter m_filter;
@@ -94,6 +97,7 @@ private:
FutureWatcher m_futureWatcher;
Future m_scanFuture;
QList<Core::IVersionControl *> m_versionControls;
};
} // namespace Internal