[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:
Adriaan de Groot 2019-03-19 09:59:39 -04:00
parent 5f308e8e17
commit 2b7832857c

View File

@ -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;
} }