diff options
Diffstat (limited to 'modules/system')
-rw-r--r-- | modules/system/system.admin.inc | 29 | ||||
-rw-r--r-- | modules/system/system.test | 55 |
2 files changed, 79 insertions, 5 deletions
diff --git a/modules/system/system.admin.inc b/modules/system/system.admin.inc index 834cea968..284d02eec 100644 --- a/modules/system/system.admin.inc +++ b/modules/system/system.admin.inc @@ -598,13 +598,32 @@ function system_modules($form_state = array()) { foreach ($module->requires as $requires => $v) { if (!isset($files[$requires])) { $extra['requires'][$requires] = t('@module (<span class="admin-missing">missing</span>)', array('@module' => drupal_ucfirst($requires))); - $extra['disabled'] = TRUE; + $extra['disabled'] = TRUE; + } + else { + $requires_name = $files[$requires]->info['name']; + if ($v) { + $requires_name .= $v['original_version']; + $current_version = str_replace(DRUPAL_CORE_COMPATIBILITY . '-', '', $files[$requires]->info['version']); + foreach ($v['versions'] as $required_version) { + if ((isset($required_version['op']) && !version_compare($current_version, $required_version['version'], $required_version['op'])) || + (isset($required_version['preg']) && !preg_match($required_version['preg'], $current_version))) { + $extra['requires'][$requires] = t('@module (<span class="admin-missing">incompatible with</span> version @version)', array( + '@module' => $requires_name, + '@version' => $files[$requires]->info['version'], + )); + $extra['disabled'] = TRUE; + } + } } - elseif (!$files[$requires]->status) { - $extra['requires'][$requires] = t('@module (<span class="admin-disabled">disabled</span>)', array('@module' => $files[$requires]->info['name'])); + if (!isset($extra['requires'][$requires])) { + if ($files[$requires]->status) { + $extra['requires'][$requires] = t('@module (<span class="admin-enabled">enabled</span>)', array('@module' => $requires_name)); + } + else { + $extra['requires'][$requires] = t('@module (<span class="admin-disabled">disabled</span>)', array('@module' => $requires_name)); + } } - else { - $extra['requires'][$requires] = t('@module (<span class="admin-enabled">enabled</span>)', array('@module' => $files[$requires]->info['name'])); } } // Generate link for module's help page, if there is one. diff --git a/modules/system/system.test b/modules/system/system.test index a48cbd95a..09f49b9f5 100644 --- a/modules/system/system.test +++ b/modules/system/system.test @@ -198,6 +198,61 @@ class ModuleDependencyTestCase extends ModuleTestCase { } /** + * Test module dependency on specific versions. + */ +class ModuleVersionTestCase extends ModuleTestCase { + public static function getInfo() { + return array( + 'name' => 'Module versions', + 'description' => 'Check module version dependencies.', + 'group' => 'Module', + ); + } + + function setup() { + parent::setUp('module_test'); + } + + /** + * Test version dependencies. + */ + function testModuleVersions() { + $dependencies = array( + // Alternating between being compatible and incompatible with 7.x-2.4. + // The first is always a compatible. + 'common_test', + // Branch incompatibility. + 'common_test (1.x)', + // Branch compatibility. + 'common_test (2.x)', + // Another branch incompatibility. + 'common_test (>2.x)', + // Another branch compatibility. + 'common_test (<=2.x)', + // Another branch incompatibility. + 'common_test (<2.x)', + // Another branch compatibility. + 'common_test (>=2.x)', + // Nonsense, misses a dash. Incompatible with everything. + 'common_test (=7.x2.x, >=2.4)', + // Core version is optional. Compatible. + 'common_test (=7.x-2.x, >=2.4)', + // Test !=, explicitly incompatible. + 'common_test (=2.x, !=2.4)', + // Three operations. Compatible. + 'common_test (=2.x, !=2.3, <2.5)', + ); + variable_set('dependencies', $dependencies); + $n = count($dependencies); + for ($i = 0; $i < $n; $i++) { + $this->drupalGet('admin/structure/modules'); + $checkbox = $this->xpath('//input[@id="edit-modules-Testing-module-test-enable"]'); + $this->assertEqual(!empty($checkbox[0]['disabled']), $i % 2, $dependencies[$i]); + } + } +} + +/** * Test required modules functionality. */ class ModuleRequiredTestCase extends ModuleTestCase { |