mirror of
https://github.com/parchlinux/calamares.git
synced 2025-06-29 02:15:36 -04:00
[libcalamaresui] Check module dependencies
- Module dependency-checking is done in two phases: first, catch any unknown modules that are listed in *requiredModules* and bail out before loading anything. Second, check that the modules required by X occur before X in the sequence.
This commit is contained in:
parent
731594fb40
commit
08966ff933
2 changed files with 68 additions and 6 deletions
|
@ -126,7 +126,6 @@ ModuleManager::doInit()
|
|||
}
|
||||
// At this point m_availableModules is filled with whatever was found in the
|
||||
// search paths.
|
||||
checkDependencies();
|
||||
emit initDone();
|
||||
}
|
||||
|
||||
|
@ -176,7 +175,13 @@ ModuleManager::loadModules()
|
|||
{
|
||||
QTimer::singleShot( 0, this, [ this ]()
|
||||
{
|
||||
QStringList failedModules;
|
||||
QStringList failedModules = checkDependencies();
|
||||
if ( !failedModules.isEmpty() )
|
||||
{
|
||||
emit modulesFailed( failedModules );
|
||||
return;
|
||||
}
|
||||
|
||||
Settings::InstanceDescriptionList customInstances =
|
||||
Settings::instance()->customModuleInstances();
|
||||
|
||||
|
@ -262,6 +267,14 @@ ModuleManager::loadModules()
|
|||
failedModules.append( instanceKey );
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( !checkDependencies( *thisModule ) )
|
||||
{
|
||||
// Error message is already printed
|
||||
failedModules.append( instanceKey );
|
||||
continue;
|
||||
}
|
||||
|
||||
// If it's a ViewModule, it also appends the ViewStep to the ViewManager.
|
||||
thisModule->loadSelf();
|
||||
m_loadedModulesByInstanceKey.insert( instanceKey, thisModule );
|
||||
|
@ -301,24 +314,29 @@ ModuleManager::loadModules()
|
|||
}
|
||||
|
||||
|
||||
void
|
||||
QStringList
|
||||
ModuleManager::checkDependencies()
|
||||
{
|
||||
QStringList failed;
|
||||
|
||||
// This goes through the map of available modules, and deletes those whose
|
||||
// dependencies are not met, if any.
|
||||
bool somethingWasRemovedBecauseOfUnmetDependencies = false;
|
||||
forever
|
||||
{
|
||||
bool somethingWasRemovedBecauseOfUnmetDependencies = false;
|
||||
for ( auto it = m_availableDescriptorsByModuleName.begin();
|
||||
it != m_availableDescriptorsByModuleName.end(); ++it )
|
||||
{
|
||||
foreach ( const QString& depName,
|
||||
( *it ).value( "requiredModules" ).toStringList() )
|
||||
it->value( "requiredModules" ).toStringList() )
|
||||
{
|
||||
if ( !m_availableDescriptorsByModuleName.contains( depName ) )
|
||||
{
|
||||
QString moduleName = it->value( "name" ).toString();
|
||||
somethingWasRemovedBecauseOfUnmetDependencies = true;
|
||||
m_availableDescriptorsByModuleName.erase( it );
|
||||
failed << moduleName;
|
||||
cWarning() << "Module" << moduleName << "has unmet requirement" << depName;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -328,7 +346,33 @@ ModuleManager::checkDependencies()
|
|||
if ( !somethingWasRemovedBecauseOfUnmetDependencies )
|
||||
break;
|
||||
}
|
||||
|
||||
return failed;
|
||||
}
|
||||
|
||||
bool
|
||||
ModuleManager::checkDependencies( const Module& m )
|
||||
{
|
||||
bool allRequirementsFound = true;
|
||||
QStringList requiredModules = m_availableDescriptorsByModuleName[ m.name() ].value( "requiredModules" ).toStringList();
|
||||
|
||||
for ( const QString& required : requiredModules )
|
||||
{
|
||||
bool requirementFound = false;
|
||||
for( const Module* v : m_loadedModulesByInstanceKey )
|
||||
if ( required == v->name() )
|
||||
{
|
||||
requirementFound = true;
|
||||
break;
|
||||
}
|
||||
if ( !requirementFound )
|
||||
{
|
||||
cError() << "Module" << m.name() << "requires" << required << "before it in sequence.";
|
||||
allRequirementsFound = false;
|
||||
}
|
||||
}
|
||||
|
||||
return allRequirementsFound;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue