Skip to content

Commit

Permalink
MDL-57412 upgrade: Set linkcoursesections to 1 if boost in use
Browse files Browse the repository at this point in the history
  • Loading branch information
xow committed Aug 23, 2017
1 parent 52fe3c4 commit e46fde4
Show file tree
Hide file tree
Showing 4 changed files with 158 additions and 1 deletion.
16 changes: 16 additions & 0 deletions lib/db/upgrade.php
Original file line number Diff line number Diff line change
Expand Up @@ -2308,5 +2308,21 @@ function xmldb_main_upgrade($oldversion) {
upgrade_main_savepoint(true, 2017080700.01);
}

if ($oldversion < 2017081700.01) {

// This script in included in each major version upgrade process so make sure we don't run it twice.
if (empty($CFG->linkcoursesectionsupgradescriptwasrun)) {
// Check if the site is using a boost-based theme.
// If value of 'linkcoursesections' is set to the old default value, change it to the new default.
if (upgrade_theme_is_from_family('boost', $CFG->theme)) {
set_config('linkcoursesections', 1);
}
set_config('linkcoursesectionsupgradescriptwasrun', 1);
}

// Main savepoint reached.
upgrade_main_savepoint(true, 2017081700.01);
}

return true;
}
78 changes: 78 additions & 0 deletions lib/tests/upgradelib_test.php
Original file line number Diff line number Diff line change
Expand Up @@ -742,4 +742,82 @@ public function test_upgrade_fix_config_auth_plugin_names() {
// Assert the new format took precedence in case of conflict.
$this->assertSame('val1', get_config('auth_qux', 'name1'));
}

/**
* Create a collection of test themes to test determining parent themes.
*
* @return Url to the path containing the test themes
*/
public function create_testthemes() {
global $CFG;

$themedircontent = [
'testtheme' => [
'config.php' => '<?php $THEME->name = "testtheme"; $THEME->parents = [""];',
],
'childoftesttheme' => [
'config.php' => '<?php $THEME->name = "childofboost"; $THEME->parents = ["testtheme"];',
],
'infinite' => [
'config.php' => '<?php $THEME->name = "infinite"; $THEME->parents = ["forever"];',
],
'forever' => [
'config.php' => '<?php $THEME->name = "forever"; $THEME->parents = ["infinite", "childoftesttheme"];',
],
'orphantheme' => [
'config.php' => '<?php $THEME->name = "orphantheme"; $THEME->parents = [];',
],
'loop' => [
'config.php' => '<?php $THEME->name = "loop"; $THEME->parents = ["around"];',
],
'around' => [
'config.php' => '<?php $THEME->name = "around"; $THEME->parents = ["loop"];',
],
'themewithbrokenparent' => [
'config.php' => '<?php $THEME->name = "orphantheme"; $THEME->parents = ["nonexistent", "testtheme"];',
],
];
$vthemedir = \org\bovigo\vfs\vfsStream::setup('themes', null, $themedircontent);

return \org\bovigo\vfs\vfsStream::url('themes');
}

/**
* Test finding theme locations.
*/
public function test_upgrade_find_theme_location() {
global $CFG;

$this->resetAfterTest();

$CFG->themedir = $this->create_testthemes();

$this->assertSame($CFG->dirroot . '/theme/boost', upgrade_find_theme_location('boost'));
$this->assertSame($CFG->dirroot . '/theme/clean', upgrade_find_theme_location('clean'));
$this->assertSame($CFG->dirroot . '/theme/bootstrapbase', upgrade_find_theme_location('bootstrapbase'));

$this->assertSame($CFG->themedir . '/testtheme', upgrade_find_theme_location('testtheme'));
$this->assertSame($CFG->themedir . '/childoftesttheme', upgrade_find_theme_location('childoftesttheme'));
}

/**
* Test figuring out if theme is or is a child of a certain theme.
*/
public function test_upgrade_theme_is_from_family() {
global $CFG;

$this->resetAfterTest();

$CFG->themedir = $this->create_testthemes();

$this->assertTrue(upgrade_theme_is_from_family('boost', 'boost'), 'Boost is a boost theme');
$this->assertTrue(upgrade_theme_is_from_family('bootstrapbase', 'clean'), 'Clean is a bootstrap base theme');
$this->assertFalse(upgrade_theme_is_from_family('boost', 'clean'), 'Clean is not a boost theme');

$this->assertTrue(upgrade_theme_is_from_family('testtheme', 'childoftesttheme'), 'childoftesttheme is a testtheme');
$this->assertFalse(upgrade_theme_is_from_family('testtheme', 'orphantheme'), 'ofphantheme is not a testtheme');
$this->assertTrue(upgrade_theme_is_from_family('testtheme', 'infinite'), 'Infinite loop with testtheme parent is true');
$this->assertFalse(upgrade_theme_is_from_family('testtheme', 'loop'), 'Infinite loop without testtheme parent is false');
$this->assertTrue(upgrade_theme_is_from_family('testtheme', 'themewithbrokenparent'), 'No error on broken parent');
}
}
63 changes: 63 additions & 0 deletions lib/upgradelib.php
Original file line number Diff line number Diff line change
Expand Up @@ -2626,3 +2626,66 @@ function upgrade_fix_config_auth_plugin_defaults($plugin) {
}
}
}

/**
* Search for a given theme in any of the parent themes of a given theme.
*
* @param string $needle The name of the theme you want to search for
* @param string $themename The name of the theme you want to search for
* @param string $checkedthemeforparents The name of all the themes already checked
* @return bool True if found, false if not.
*/
function upgrade_theme_is_from_family($needle, $themename, $checkedthemeforparents = []) {
global $CFG;

// Once we've started checking a theme, don't start checking it again. Prevent recursion.
if (!empty($checkedthemeforparents[$themename])) {
return false;
}
$checkedthemeforparents[$themename] = true;

if ($themename == $needle) {
return true;
}

if ($themedir = upgrade_find_theme_location($themename)) {
$THEME = new stdClass();
require($themedir . '/config.php');
$theme = $THEME;
} else {
return false;
}

if (empty($theme->parents)) {
return false;
}

// Recursively search through each parent theme.
foreach ($theme->parents as $parent) {
if (upgrade_theme_is_from_family($needle, $parent, $checkedthemeforparents)) {
return true;
}
}
return false;
}

/**
* Finds the theme location and verifies the theme has all needed files.
*
* @param string $themename The name of the theme you want to search for
* @return string full dir path or null if not found
* @see \theme_config::find_theme_location()
*/
function upgrade_find_theme_location($themename) {
global $CFG;

if (file_exists("$CFG->dirroot/theme/$themename/config.php")) {
$dir = "$CFG->dirroot/theme/$themename";
} else if (!empty($CFG->themedir) and file_exists("$CFG->themedir/$themename/config.php")) {
$dir = "$CFG->themedir/$themename";
} else {
return null;
}

return $dir;
}
2 changes: 1 addition & 1 deletion version.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@

defined('MOODLE_INTERNAL') || die();

$version = 2017081700.00; // YYYYMMDD = weekly release date of this DEV branch.
$version = 2017081700.01; // YYYYMMDD = weekly release date of this DEV branch.
// RR = release increments - 00 in DEV branches.
// .XX = incremental changes.

Expand Down

0 comments on commit e46fde4

Please sign in to comment.