caisse-bliss/vendor/doctrine/migrations/lib/Doctrine/Migrations/Version/DefaultAliasResolver.php

125 lines
4.3 KiB
PHP

<?php
declare(strict_types=1);
namespace Doctrine\Migrations\Version;
use Doctrine\Migrations\Exception\NoMigrationsFoundWithCriteria;
use Doctrine\Migrations\Exception\NoMigrationsToExecute;
use Doctrine\Migrations\Exception\UnknownMigrationVersion;
use Doctrine\Migrations\Metadata\Storage\MetadataStorage;
use function substr;
/**
* The DefaultAliasResolver class is responsible for resolving aliases like first, current, etc. to the actual version number.
*
* @internal
*/
final class DefaultAliasResolver implements AliasResolver
{
private const ALIAS_FIRST = 'first';
private const ALIAS_CURRENT = 'current';
private const ALIAS_PREV = 'prev';
private const ALIAS_NEXT = 'next';
private const ALIAS_LATEST = 'latest';
private MigrationPlanCalculator $migrationPlanCalculator;
private MetadataStorage $metadataStorage;
private MigrationStatusCalculator $migrationStatusCalculator;
public function __construct(
MigrationPlanCalculator $migrationPlanCalculator,
MetadataStorage $metadataStorage,
MigrationStatusCalculator $migrationStatusCalculator
) {
$this->migrationPlanCalculator = $migrationPlanCalculator;
$this->metadataStorage = $metadataStorage;
$this->migrationStatusCalculator = $migrationStatusCalculator;
}
/**
* Returns the version number from an alias.
*
* Supported aliases are:
*
* - first: The very first version before any migrations have been run.
* - current: The current version.
* - prev: The version prior to the current version.
* - next: The version following the current version.
* - latest: The latest available version.
*
* If an existing version number is specified, it is returned verbatimly.
*
* @throws NoMigrationsToExecute
* @throws UnknownMigrationVersion
* @throws NoMigrationsFoundWithCriteria
*/
public function resolveVersionAlias(string $alias): Version
{
$availableMigrations = $this->migrationPlanCalculator->getMigrations();
$executedMigrations = $this->metadataStorage->getExecutedMigrations();
switch ($alias) {
case self::ALIAS_FIRST:
case '0':
return new Version('0');
case self::ALIAS_CURRENT:
try {
return $executedMigrations->getLast()->getVersion();
} catch (NoMigrationsFoundWithCriteria $e) {
return new Version('0');
}
// no break because of return
case self::ALIAS_PREV:
try {
return $executedMigrations->getLast(-1)->getVersion();
} catch (NoMigrationsFoundWithCriteria $e) {
return new Version('0');
}
// no break because of return
case self::ALIAS_NEXT:
$newMigrations = $this->migrationStatusCalculator->getNewMigrations();
try {
return $newMigrations->getFirst()->getVersion();
} catch (NoMigrationsFoundWithCriteria $e) {
throw NoMigrationsToExecute::new($e);
}
// no break because of return
case self::ALIAS_LATEST:
try {
return $availableMigrations->getLast()->getVersion();
} catch (NoMigrationsFoundWithCriteria $e) {
return $this->resolveVersionAlias(self::ALIAS_CURRENT);
}
// no break because of return
default:
if ($availableMigrations->hasMigration(new Version($alias))) {
return $availableMigrations->getMigration(new Version($alias))->getVersion();
}
if (substr($alias, 0, 7) === self::ALIAS_CURRENT) {
$val = (int) substr($alias, 7);
$targetMigration = null;
if ($val > 0) {
$newMigrations = $this->migrationStatusCalculator->getNewMigrations();
return $newMigrations->getFirst($val - 1)->getVersion();
}
return $executedMigrations->getLast($val)->getVersion();
}
}
throw UnknownMigrationVersion::new($alias);
}
}