SessionManager: Remember dependencies

... involving projects that aren't currently in the session, for the
purpose of re-establishing the dependency when they get re-added.
In addition to the rather special use case described in the linked task,
this also prevents losing dependency information involving projects that
temporarily fail to load.

Fixes: QTCREATORBUG-22524
Change-Id: I2558736a634e91cccc3f071a3c522b33a88003c0
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Christian Kandeler
2020-01-29 15:16:10 +01:00
parent f43a48aee8
commit 3a0d5cb79a

View File

@@ -632,7 +632,13 @@ QStringList SessionManagerPrivate::dependenciesOrder() const
// copy the map to a temporary list
for (const Project *pro : m_projects) {
const QString proName = pro->projectFilePath().toString();
unordered << QPair<QString, QStringList>(proName, m_depMap.value(proName));
const QStringList depList = filtered(m_depMap.value(proName),
[this](const QString &proPath) {
return contains(m_projects, [proPath](const Project *p) {
return p->projectFilePath().toString() == proPath;
});
});
unordered << qMakePair(proName, depList);
}
while (!unordered.isEmpty()) {
@@ -710,31 +716,9 @@ void SessionManager::configureEditors(Project *project)
void SessionManager::removeProjects(const QList<Project *> &remove)
{
QMap<QString, QStringList> resMap;
for (Project *pro : remove)
emit m_instance->aboutToRemoveProject(pro);
// Refresh dependencies
QSet<QString> projectFiles;
for (Project *pro : projects()) {
if (!remove.contains(pro))
projectFiles.insert(pro->projectFilePath().toString());
}
auto i = projectFiles.begin();
while (i != projectFiles.end()) {
QStringList dependencies;
foreach (const QString &dependency, d->m_depMap.value(*i)) {
if (projectFiles.contains(dependency))
dependencies << dependency;
}
if (!dependencies.isEmpty())
resMap.insert(*i, dependencies);
++i;
}
d->m_depMap = resMap;
bool changeStartupProject = false;
// Delete projects
@@ -895,14 +879,10 @@ void SessionManagerPrivate::restoreDependencies(const PersistentSettingsReader &
auto i = depMap.constBegin();
while (i != depMap.constEnd()) {
const QString &key = i.key();
if (!m_failedProjects.contains(key)) {
QStringList values;
foreach (const QString &value, i.value().toStringList()) {
if (!m_failedProjects.contains(value))
values << value;
}
m_depMap.insert(key, values);
}
QStringList values;
foreach (const QString &value, i.value().toStringList())
values << value;
m_depMap.insert(key, values);
++i;
}
}