diff --git a/lib/environmentlib.php b/lib/environmentlib.php index 28f2dc9543d..802ebef0dc8 100644 --- a/lib/environmentlib.php +++ b/lib/environmentlib.php @@ -327,6 +327,10 @@ function get_list_of_environment_versions($contents) { } } + if (isset($contents['COMPATIBILITY_MATRIX']['#']['PLUGIN'])) { + $versions[] = 'all'; + } + return $versions; } @@ -396,6 +400,14 @@ function get_environment_for_version($version, $env_select) { return false; } + // If $env_select is not numeric then this is being called on a plugin, and not the core environment.xml + // If a version of 'all' is in the arry is also means that the new tag was found, this should + // be matched against any version of Moodle. + if (!is_numeric($env_select) && in_array('all', $versions) + && environment_verify_plugin($env_select, $contents['COMPATIBILITY_MATRIX']['#']['PLUGIN'][0])) { + return $contents['COMPATIBILITY_MATRIX']['#']['PLUGIN'][0]; + } + /// If the version requested is available if (!in_array($version, $versions)) { return false; @@ -407,6 +419,19 @@ function get_environment_for_version($version, $env_select) { return $contents['COMPATIBILITY_MATRIX']['#']['MOODLE'][$fl_arr[$version]]; } +/** + * Checks if a plugin tag has a name attribute and it matches the plugin being tested. + * + * @param string $plugin the name of the plugin. + * @param array $pluginxml the xmlised structure for the plugin tag being tested. + * @return boolean true if the name attribute exists and matches the plugin being tested. + */ +function environment_verify_plugin($plugin, $pluginxml) { + if (!isset($pluginxml['@']['name']) || $pluginxml['@']['name'] != $plugin) { + return false; + } + return true; +} /** * This function will check for everything (DB, PHP and PHP extensions for now) diff --git a/lib/tests/environment_test.php b/lib/tests/environment_test.php index 64c508cae5c..2554b0d243a 100644 --- a/lib/tests/environment_test.php +++ b/lib/tests/environment_test.php @@ -53,4 +53,79 @@ class core_environment_testcase extends advanced_testcase { $this->assertTrue($environment_result->getStatus(), "Problem detected in environment ($environment_result->part:$environment_result->info), fix all warnings and errors!"); } } + + /** + * Test the get_list_of_environment_versions() function. + */ + public function test_get_list_of_environment_versions() { + global $CFG; + require_once($CFG->libdir.'/environmentlib.php'); + // Build a sample xmlised environment.xml. + $xml = << + + + + + + + + + + + + + + + + + + + + + + + + + + +END; + $environemt = xmlize($xml); + $versions = get_list_of_environment_versions($environemt); + $this->assertCount(5, $versions); + $this->assertContains('1.9', $versions); + $this->assertContains('2.5', $versions); + $this->assertContains('2.6', $versions); + $this->assertContains('2.7', $versions); + $this->assertContains('all', $versions); + } + + /** + * Test the environment_verify_plugin() function. + */ + public function test_verify_plugin() { + global $CFG; + require_once($CFG->libdir.'/environmentlib.php'); + // Build sample xmlised environment file fragments. + $plugin1xml = << + + + + +END; + $plugin1 = xmlize($plugin1xml); + $plugin2xml = << + + + + +END; + $plugin2 = xmlize($plugin2xml); + $this->assertTrue(environment_verify_plugin('block_testcase', $plugin1['PLUGIN'])); + $this->assertFalse(environment_verify_plugin('block_testcase', $plugin2['PLUGIN'])); + $this->assertFalse(environment_verify_plugin('mod_someother', $plugin1['PLUGIN'])); + $this->assertFalse(environment_verify_plugin('mod_someother', $plugin2['PLUGIN'])); + } } diff --git a/lib/upgrade.txt b/lib/upgrade.txt index 95ab70c0f50..6971492668f 100644 --- a/lib/upgrade.txt +++ b/lib/upgrade.txt @@ -11,6 +11,9 @@ information provided here is intended especially for developers. * The file pluginlib.php was deprecated since 2.6 and has now been removed, do not include or require it. * \core_component::fetch_subsystems() now returns a valid path for completion component instead of null. * Deprecated JS global methods have been removed (show_item, destroy_item, hide_item, addonload, getElementsByTagName, findChildNodes). +* For 3rd party plugin specific environment.xml files, it's now possible to specify version independent checks by using the + tag instead of the version dependent one. If the PLUGIN tag is used any + Moodle specific tags will be ignored. === 2.8 ===