forked from qt-creator/qt-creator
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:
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user