From 0f61bd060e2afb93659382a2805b1bde88659118 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Mudr=C3=A1k?= Date: Mon, 19 Jan 2026 22:47:12 +0100 Subject: [PATCH] MDL-87520 core: Fix interpretation of CFG->branch in update API client Starting in version 3.10, Moodle started to use a different format for the $CFG->branch that has not been fixed here. This is to make sure that we request the correct version of the plugin. --- lib/classes/update/api.php | 19 +++++++++++++++---- lib/tests/update_api_test.php | 19 +++++++++++++++++-- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/lib/classes/update/api.php b/lib/classes/update/api.php index 60467f0ce9c..a3237dface2 100644 --- a/lib/classes/update/api.php +++ b/lib/classes/update/api.php @@ -297,15 +297,26 @@ class api { * versioning and stable branches numbering scheme. The API at * download.moodle.org uses the X.Y numbering scheme. * - * @param int $branch moodle branch in the XY format (e.g. 29, 30, 31 etc) - * @return string moodle branch in the X.Y format (e.g. 2.9, 3.0, 3.1 etc) + * Branch integers are interpreted differently from Moodle 3.10 onwards. + * 299 = 29.9 (prior to 3.10). + * 399 = 3.99 (3.10 onwards). + * + * @param int $branch moodle branch in the XY format (e.g. 29, 30, 31, 311, 502 etc) + * @return string moodle branch in the X.Y format (e.g. 2.9, 3.0, 3.1, 3.11, 5.2 etc) */ protected function convert_branch_numbering_format($branch) { - $branch = (string)$branch; + $branch = (string) $branch; if (strpos($branch, '.') === false) { - $branch = substr($branch, 0, -1).'.'.substr($branch, -1); + $intbranch = (int) $branch; + if ($intbranch >= 310) { + $major = floor($intbranch / 100); + $minor = $intbranch - 100 * $major; + $branch = (string) ($major . '.' . $minor); + } else { + $branch = substr($branch, 0, -1) . '.' . substr($branch, -1); + } } return $branch; diff --git a/lib/tests/update_api_test.php b/lib/tests/update_api_test.php index 781d613c469..ce5646a6020 100644 --- a/lib/tests/update_api_test.php +++ b/lib/tests/update_api_test.php @@ -45,11 +45,26 @@ final class update_api_test extends \advanced_testcase { $client = \core\update\testable_api::client(); $this->assertSame('2.9', $client->convert_branch_numbering_format(29)); + $this->assertSame('29.9', $client->convert_branch_numbering_format(299)); $this->assertSame('3.0', $client->convert_branch_numbering_format('30')); $this->assertSame('3.1', $client->convert_branch_numbering_format(3.1)); + $this->assertSame('3.1', $client->convert_branch_numbering_format(3.10)); $this->assertSame('3.1', $client->convert_branch_numbering_format('3.1')); - $this->assertSame('10.1', $client->convert_branch_numbering_format(101)); - $this->assertSame('10.2', $client->convert_branch_numbering_format('102')); + $this->assertSame('3.10', $client->convert_branch_numbering_format(310)); + $this->assertSame('3.10', $client->convert_branch_numbering_format('310')); + $this->assertSame('3.10', $client->convert_branch_numbering_format('3.10')); + $this->assertSame('3.11', $client->convert_branch_numbering_format(311)); + $this->assertSame('3.99', $client->convert_branch_numbering_format(399)); + $this->assertSame('4.0', $client->convert_branch_numbering_format(400)); + $this->assertSame('4.1', $client->convert_branch_numbering_format(401)); + $this->assertSame('5.2', $client->convert_branch_numbering_format(502)); + $this->assertSame('5.2', $client->convert_branch_numbering_format('502')); + $this->assertSame('9.0', $client->convert_branch_numbering_format(900)); + $this->assertSame('9.9', $client->convert_branch_numbering_format(909)); + $this->assertSame('9.99', $client->convert_branch_numbering_format(999)); + $this->assertSame('10.0', $client->convert_branch_numbering_format(1000)); + $this->assertSame('10.1', $client->convert_branch_numbering_format(1001)); + $this->assertSame('10.10', $client->convert_branch_numbering_format(1010)); } /**