[libcalamaresui] Simplify checking dependencies
- Avoid crash due to invalid iterator, when modules are removed due to missing requirements. - Simplify code, factor out the determination of which required modules are missing.
This commit is contained in:
parent
5f308e8e17
commit
2b7832857c
@ -325,36 +325,47 @@ ModuleManager::checkRequirements()
|
|||||||
QTimer::singleShot( 0, rq, &RequirementsChecker::run );
|
QTimer::singleShot( 0, rq, &RequirementsChecker::run );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static QStringList
|
||||||
|
missingRequiredModules( const QStringList& required, const QMap< QString, QVariantMap >& available )
|
||||||
|
{
|
||||||
|
QStringList l;
|
||||||
|
for( const QString& depName : required )
|
||||||
|
{
|
||||||
|
if ( !available.contains( depName ) )
|
||||||
|
l.append( depName );
|
||||||
|
}
|
||||||
|
|
||||||
|
return l;
|
||||||
|
}
|
||||||
|
|
||||||
QStringList
|
QStringList
|
||||||
ModuleManager::checkDependencies()
|
ModuleManager::checkDependencies()
|
||||||
{
|
{
|
||||||
QStringList failed;
|
QStringList failed;
|
||||||
|
bool somethingWasRemovedBecauseOfUnmetDependencies = false;
|
||||||
|
|
||||||
// This goes through the map of available modules, and deletes those whose
|
// This goes through the map of available modules, and deletes those whose
|
||||||
// dependencies are not met, if any.
|
// dependencies are not met, if any.
|
||||||
forever
|
do
|
||||||
{
|
{
|
||||||
bool somethingWasRemovedBecauseOfUnmetDependencies = false;
|
somethingWasRemovedBecauseOfUnmetDependencies = false;
|
||||||
for ( auto it = m_availableDescriptorsByModuleName.begin();
|
for ( auto it = m_availableDescriptorsByModuleName.begin();
|
||||||
it != m_availableDescriptorsByModuleName.end(); ++it )
|
it != m_availableDescriptorsByModuleName.end(); ++it )
|
||||||
{
|
{
|
||||||
foreach ( const QString& depName,
|
QStringList unmet = missingRequiredModules( it->value( "requiredModules" ).toStringList(), m_availableDescriptorsByModuleName );
|
||||||
it->value( "requiredModules" ).toStringList() )
|
|
||||||
|
if ( unmet.count() > 0 )
|
||||||
{
|
{
|
||||||
if ( !m_availableDescriptorsByModuleName.contains( depName ) )
|
QString moduleName = it->value( "name" ).toString();
|
||||||
{
|
somethingWasRemovedBecauseOfUnmetDependencies = true;
|
||||||
QString moduleName = it->value( "name" ).toString();
|
m_availableDescriptorsByModuleName.erase( it );
|
||||||
somethingWasRemovedBecauseOfUnmetDependencies = true;
|
failed << moduleName;
|
||||||
m_availableDescriptorsByModuleName.erase( it );
|
cWarning() << "Module" << moduleName << "has unknown requirements" << Logger::DebugList( unmet );
|
||||||
failed << moduleName;
|
break;
|
||||||
cWarning() << "Module" << moduleName << "has unknown requirement" << depName;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ( !somethingWasRemovedBecauseOfUnmetDependencies )
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
while( somethingWasRemovedBecauseOfUnmetDependencies );
|
||||||
|
|
||||||
return failed;
|
return failed;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user