[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 );
}
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
ModuleManager::checkDependencies()
{
QStringList failed;
bool somethingWasRemovedBecauseOfUnmetDependencies = false;
// This goes through the map of available modules, and deletes those whose
// dependencies are not met, if any.
forever
do
{
bool somethingWasRemovedBecauseOfUnmetDependencies = false;
somethingWasRemovedBecauseOfUnmetDependencies = false;
for ( auto it = m_availableDescriptorsByModuleName.begin();
it != m_availableDescriptorsByModuleName.end(); ++it )
{
foreach ( const QString& depName,
it->value( "requiredModules" ).toStringList() )
QStringList unmet = missingRequiredModules( it->value( "requiredModules" ).toStringList(), m_availableDescriptorsByModuleName );
if ( unmet.count() > 0 )
{
if ( !m_availableDescriptorsByModuleName.contains( depName ) )
{
QString moduleName = it->value( "name" ).toString();
somethingWasRemovedBecauseOfUnmetDependencies = true;
m_availableDescriptorsByModuleName.erase( it );
failed << moduleName;
cWarning() << "Module" << moduleName << "has unknown requirement" << depName;
break;
}
QString moduleName = it->value( "name" ).toString();
somethingWasRemovedBecauseOfUnmetDependencies = true;
m_availableDescriptorsByModuleName.erase( it );
failed << moduleName;
cWarning() << "Module" << moduleName << "has unknown requirements" << Logger::DebugList( unmet );
break;
}
}
if ( !somethingWasRemovedBecauseOfUnmetDependencies )
break;
}
while( somethingWasRemovedBecauseOfUnmetDependencies );
return failed;
}