1
0
mirror of https://github.com/moodle/moodle.git synced 2025-04-25 10:26:17 +02:00

MDL-56602 themes: Use version number as base themerev

This commit is contained in:
Andrew Nicols 2016-11-08 09:16:32 +08:00
parent 7eb34671c1
commit 9d75a519f3
3 changed files with 58 additions and 1 deletions

@ -9620,6 +9620,35 @@ function get_course_display_name_for_list($course) {
}
}
/**
* Convert a Moodle Version formatted number into a guaranteed incrementing timestamp.
*
* @param float $version The version to convert
* @return int The calculated timestamp
*/
function version_to_timestamp($version) {
// Moodle version numbers are in stored in one of the following formats:
// * YYYYMMDDRR.II
// * YYYYMMDDRR
//
// To convert these into a value akin to a Unix Time Stamp, we take the timestamp of the YYYYMMDD component. and add
// a calculation of the RR.II component.
// The hours/minutes/seconds must be specified otherwise the current time is used.
$date = DateTime::createFromFormat('YmdHis', substr($version, 0, 8) . '000000');
$revision = $date->format('U');
// To ensure a unique incrementing timestamp, we multiple the $rr value by a value larger than the max of $ii,
// and then add $ii.
// As a two-digit number, the max value of $ii is 99, so we multiply by 100.
$revision += (100 * (int) substr($version, 8, 2));
// Note: If there is no .II value, or it is 00, then the substr will return false, but be calculated as 0 when cast to int.
$revision += (int) substr($version, 11, 2);
return $revision;
}
/**
* The lang_string class
*

@ -86,7 +86,13 @@ function theme_get_revision() {
if (empty($CFG->themedesignermode)) {
if (empty($CFG->themerev)) {
return -1;
// If theme designer mode is not set, and there is no themerev, this is almost certainly part of the installation.
// We attempt to set a themerev based on the Moodle version number to avoid costly rebuilds of the dynamic
// theme files between each page load.
$version = null;
require("{$CFG->dirroot}/version.php");
return version_to_timestamp($version);
} else {
return $CFG->themerev;
}

@ -3282,4 +3282,26 @@ class core_moodlelib_testcase extends advanced_testcase {
'samecourse' => false, 'result' => false],
];
}
/**
* Unit tests for the version_to_timestamp function.
*/
public function test_version_to_timestamp() {
$baseversion = 2016110100.00;
$basestamp = version_to_timestamp($baseversion);
$this->assertEquals(1477929600, $basestamp);
// Adding 00.99 to the version should increase the timestamp.
$stamp = version_to_timestamp($baseversion + .99);
$this->assertGreaterThan($basestamp, $stamp);
// Adding 01.00 to the base version should increase the stamp higher than the 00.99 version.
$newstamp = version_to_timestamp($baseversion + 01.00);
$this->assertGreaterThan($basestamp, $newstamp);
$this->assertGreaterThan($stamp, $newstamp);
// The previous day's timestamp at it's highest increment should be lower than the base version.
$stamp = version_to_timestamp($baseversion - 00.01);
$this->assertLessThan($basestamp, $stamp);
}
}