[libcalamaresui] Fix up module dependency checking

- If a module exists, and has unmet dependencies, then
   that is only a problem if the module itself is *used*.
   Merely existing is ok.

This triggers on FreeBSD, where partition isn't built, but
bootloader depends on partition -- so you can never start
Calamares on FreeBSD, because bootloader depends on something
non-existent.

Relax the check: just warn, and only fail if a non-existent
module is used (all those with unmet dependencies are considered
non-existent).
This commit is contained in:
Adriaan de Groot 2019-10-21 19:28:59 +02:00
parent a9a12820d8
commit 5ac4f3ec38
2 changed files with 21 additions and 16 deletions

View File

@ -188,11 +188,15 @@ findCustomInstance( const Settings::InstanceDescriptionList& customInstances, co
void void
ModuleManager::loadModules() ModuleManager::loadModules()
{ {
QStringList failedModules = checkDependencies(); if (checkDependencies())
{
cWarning() << "Some installed modules have unmet dependencies.";
}
Settings::InstanceDescriptionList customInstances = Settings::instance()->customModuleInstances(); Settings::InstanceDescriptionList customInstances = Settings::instance()->customModuleInstances();
QStringList failedModules;
const auto modulesSequence const auto modulesSequence
= failedModules.isEmpty() ? Settings::instance()->modulesSequence() : Settings::ModuleSequence(); = Settings::instance()->modulesSequence() ;
for ( const auto& modulePhase : modulesSequence ) for ( const auto& modulePhase : modulesSequence )
{ {
ModuleSystem::Action currentAction = modulePhase.first; ModuleSystem::Action currentAction = modulePhase.first;
@ -270,7 +274,7 @@ ModuleManager::loadModules()
continue; continue;
} }
if ( !checkDependencies( *thisModule ) ) if ( !checkModuleDependencies( *thisModule ) )
{ {
// Error message is already printed // Error message is already printed
failedModules.append( instanceKey.toString() ); failedModules.append( instanceKey.toString() );
@ -351,10 +355,10 @@ missingRequiredModules( const QStringList& required, const QMap< QString, QVaria
return l; return l;
} }
QStringList size_t
ModuleManager::checkDependencies() ModuleManager::checkDependencies()
{ {
QStringList failed; size_t numberRemoved = 0;
bool somethingWasRemovedBecauseOfUnmetDependencies = false; 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
@ -373,19 +377,18 @@ ModuleManager::checkDependencies()
QString moduleName = it->value( "name" ).toString(); QString moduleName = it->value( "name" ).toString();
somethingWasRemovedBecauseOfUnmetDependencies = true; somethingWasRemovedBecauseOfUnmetDependencies = true;
m_availableDescriptorsByModuleName.erase( it ); m_availableDescriptorsByModuleName.erase( it );
failed << moduleName; numberRemoved++;
cWarning() << "Module" << moduleName << "requires modules" << Logger::DebugList( unmet ); cWarning() << "Module" << moduleName << "requires missing modules" << Logger::DebugList( unmet );
cWarning() << Logger::SubEntry << "but these are not available (listed in settings, or installed).";
break; break;
} }
} }
} while ( somethingWasRemovedBecauseOfUnmetDependencies ); } while ( somethingWasRemovedBecauseOfUnmetDependencies );
return failed; return numberRemoved;
} }
bool bool
ModuleManager::checkDependencies( const Module& m ) ModuleManager::checkModuleDependencies( const Module& m )
{ {
bool allRequirementsFound = true; bool allRequirementsFound = true;
QStringList requiredModules QStringList requiredModules

View File

@ -106,15 +106,17 @@ private slots:
private: private:
/** /**
* Check in a general sense whether the dependencies between * Check in a general sense whether the dependencies between
* modules are valid. Returns a list of module names that * modules are valid. Returns the number of modules that
* do **not** have their requirements met. * have missing dependencies -- this is **not** a problem
* unless any of those modules are actually used.
* *
* Returns an empty list on success. * Returns 0 on success.
* *
* Also modifies m_availableDescriptorsByModuleName to remove * Also modifies m_availableDescriptorsByModuleName to remove
* all the entries that fail. * all the entries that (so that later, when we try to look
* them up, they are not found).
*/ */
QStringList checkDependencies(); size_t checkDependencies();
/** /**
* Check for this specific module if its required modules have * Check for this specific module if its required modules have
@ -122,7 +124,7 @@ private:
* *
* Returns true if the requirements are met. * Returns true if the requirements are met.
*/ */
bool checkDependencies( const Module& ); bool checkModuleDependencies( const Module& );
QMap< QString, QVariantMap > m_availableDescriptorsByModuleName; QMap< QString, QVariantMap > m_availableDescriptorsByModuleName;
QMap< QString, QString > m_moduleDirectoriesByModuleName; QMap< QString, QString > m_moduleDirectoriesByModuleName;