[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 );
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user