aboutsummaryrefslogtreecommitdiffstats
path: root/lib/private/DB
diff options
context:
space:
mode:
authorAndy Scherzinger <info@andy-scherzinger.de>2024-08-28 20:46:24 +0200
committerGitHub <noreply@github.com>2024-08-28 20:46:24 +0200
commitd404998157dd632c147c93458183625aa6930139 (patch)
tree87faa40d00a20ad799585dc50c9ddb8a1fea36e2 /lib/private/DB
parent3a565b30b2776dda4aa1f5b11026125c19dc674f (diff)
parent46c853146b05b23057800a1cf42e03f96ae0c45b (diff)
downloadnextcloud-server-d404998157dd632c147c93458183625aa6930139.tar.gz
nextcloud-server-d404998157dd632c147c93458183625aa6930139.zip
Merge pull request #47515 from nextcloud/bugfix/noid/fix-migration-sorting
fix(migration): Correctly sort migrations by version number
Diffstat (limited to 'lib/private/DB')
-rw-r--r--lib/private/DB/MigrationService.php34
1 files changed, 21 insertions, 13 deletions
diff --git a/lib/private/DB/MigrationService.php b/lib/private/DB/MigrationService.php
index 68f31fff3fc..61a6d2baf16 100644
--- a/lib/private/DB/MigrationService.php
+++ b/lib/private/DB/MigrationService.php
@@ -158,7 +158,7 @@ class MigrationService {
/**
* Returns all versions which have already been applied
*
- * @return string[]
+ * @return list<string>
* @codeCoverageIgnore - no need to test this
*/
public function getMigratedVersions() {
@@ -174,6 +174,8 @@ class MigrationService {
$rows = $result->fetchAll(\PDO::FETCH_COLUMN);
$result->closeCursor();
+ usort($rows, $this->sortMigrations(...));
+
return $rows;
}
@@ -183,7 +185,23 @@ class MigrationService {
*/
public function getAvailableVersions(): array {
$this->ensureMigrationsAreLoaded();
- return array_map('strval', array_keys($this->migrations));
+ $versions = array_map('strval', array_keys($this->migrations));
+ usort($versions, $this->sortMigrations(...));
+ return $versions;
+ }
+
+ protected function sortMigrations(string $a, string $b): int {
+ preg_match('/(\d+)Date(\d+)/', basename($a), $matchA);
+ preg_match('/(\d+)Date(\d+)/', basename($b), $matchB);
+ if (!empty($matchA) && !empty($matchB)) {
+ $versionA = (int)$matchA[1];
+ $versionB = (int)$matchB[1];
+ if ($versionA !== $versionB) {
+ return ($versionA < $versionB) ? -1 : 1;
+ }
+ return ($matchA[2] < $matchB[2]) ? -1 : 1;
+ }
+ return (basename($a) < basename($b)) ? -1 : 1;
}
/**
@@ -204,17 +222,7 @@ class MigrationService {
\RegexIterator::GET_MATCH);
$files = array_keys(iterator_to_array($iterator));
- uasort($files, function ($a, $b) {
- preg_match('/^Version(\d+)Date(\d+)\\.php$/', basename($a), $matchA);
- preg_match('/^Version(\d+)Date(\d+)\\.php$/', basename($b), $matchB);
- if (!empty($matchA) && !empty($matchB)) {
- if ($matchA[1] !== $matchB[1]) {
- return ($matchA[1] < $matchB[1]) ? -1 : 1;
- }
- return ($matchA[2] < $matchB[2]) ? -1 : 1;
- }
- return (basename($a) < basename($b)) ? -1 : 1;
- });
+ usort($files, $this->sortMigrations(...));
$migrations = [];