Skip to content

Commit 74e5668

Browse files
authored
Merge pull request #228 from doctrine/2.0
Updating DoctrineMigrationsBundle for Doctrine Migrations 2.0
2 parents 04109e6 + 3ec4c3c commit 74e5668

25 files changed

+5361
-233
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
1-
composer.lock
21
/vendor/
2+
/.phpcs-cache
3+

.scrutinizer.yml

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
build:
2+
nodes:
3+
analysis:
4+
environment:
5+
php:
6+
version: 7.1
7+
cache:
8+
disabled: false
9+
directories:
10+
- ~/.composer/cache
11+
project_setup:
12+
override: true
13+
tests:
14+
override:
15+
- php-scrutinizer-run
16+
- phpcs-run
17+
dependencies:
18+
override:
19+
- composer install --ignore-platform-reqs --no-interaction
20+
21+
tools:
22+
external_code_coverage:
23+
timeout: 600
24+
25+
build_failure_conditions:
26+
- 'elements.rating(<= C).new.exists' # No new classes/methods with a rating of C or worse allowed
27+
- 'issues.label("coding-style").new.exists' # No new coding style issues allowed
28+
- 'issues.severity(>= MAJOR).new.exists' # New issues of major or higher severity
29+
- 'project.metric_change("scrutinizer.test_coverage", < 0)' # Code Coverage decreased from previous inspection
30+

.travis.yml

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,42 +3,53 @@ sudo: false
33
language: php
44

55
php:
6-
- 5.4
7-
- 5.5
8-
- 5.6
9-
- 7.0
106
- 7.1
117
- 7.2
128
- nightly
139

10+
cache:
11+
directories:
12+
- $HOME/.composer/cache
13+
1414
before_install:
1515
- mv ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/xdebug.ini{,.disabled} || echo "xdebug not available"
16-
- composer self-update
16+
- travis_retry composer self-update
1717

18-
install: travis_retry composer update --prefer-dist
18+
install:
19+
- rm composer.lock
20+
- travis_retry composer update --prefer-dist
1921

2022
script:
21-
- ./vendor/bin/phpunit -v
23+
- ./vendor/bin/phpunit
2224

2325
jobs:
26+
allow_failures:
27+
- php: nightly
28+
2429
include:
2530
- stage: Test
2631
env: DEPENDENCIES=low
27-
install: travis_retry composer update --prefer-dist --prefer-lowest
32+
install:
33+
- rm composer.lock
34+
- travis_retry composer update --prefer-dist --prefer-lowest
2835

29-
- stage: Coverage
36+
- stage: Test
37+
env: COVERAGE
3038
before_script:
3139
- mv ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/xdebug.ini{.disabled,}
3240
- if [[ ! $(php -m | grep -si xdebug) ]]; then echo "xdebug required for coverage"; exit 1; fi
3341
script:
34-
- ./vendor/bin/phpunit -v --coverage-clover ./build/logs/clover.xml
42+
- ./vendor/bin/phpunit --coverage-clover clover.xml
3543
after_script:
3644
- wget https://scrutinizer-ci.com/ocular.phar
37-
- php ocular.phar code-coverage:upload --format=php-clover build/logs/clover.xml
45+
- php ocular.phar code-coverage:upload --format=php-clover clover.xml
3846

39-
allow_failures:
40-
- php: nightly
47+
- stage: Code Quality
48+
env: CODING_STANDARDS
49+
install: travis_retry composer install --prefer-dist
50+
script: ./vendor/bin/phpcs
4151

42-
cache:
43-
directories:
44-
- $HOME/.composer/cache
52+
- stage: Code Quality
53+
env: STATIC_ANALYSIS
54+
install: travis_retry composer install --prefer-dist
55+
script: vendor/bin/phpstan analyse -l 7 -c phpstan.neon Command Tests

Command/DoctrineCommand.php

Lines changed: 66 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,66 +1,106 @@
11
<?php
22

3+
declare(strict_types=1);
34

45
namespace Doctrine\Bundle\MigrationsBundle\Command;
56

67
use Doctrine\Bundle\DoctrineBundle\Command\DoctrineCommand as BaseCommand;
7-
use Doctrine\DBAL\Migrations\Configuration\AbstractFileConfiguration;
8-
use Doctrine\DBAL\Migrations\Configuration\Configuration;
8+
use Doctrine\Migrations\Configuration\AbstractFileConfiguration;
9+
use Doctrine\Migrations\Configuration\Configuration;
10+
use Doctrine\Migrations\Version\Version;
11+
use ErrorException;
912
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
1013
use Symfony\Component\DependencyInjection\ContainerInterface;
1114
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
15+
use function error_get_last;
16+
use function is_dir;
17+
use function method_exists;
18+
use function mkdir;
19+
use function preg_match;
20+
use function sprintf;
21+
use function str_replace;
1222

1323
/**
1424
* Base class for Doctrine console commands to extend from.
15-
*
16-
* @author Fabien Potencier <[email protected]>
1725
*/
1826
abstract class DoctrineCommand extends BaseCommand
1927
{
20-
public static function configureMigrations(ContainerInterface $container, Configuration $configuration)
28+
public static function configureMigrations(ContainerInterface $container, Configuration $configuration) : void
2129
{
22-
if (!$configuration->getMigrationsDirectory()) {
30+
$dir = $configuration->getMigrationsDirectory();
31+
32+
if (empty($dir)) {
2333
$dir = $container->getParameter('doctrine_migrations.dir_name');
24-
if (!is_dir($dir) && !@mkdir($dir, 0777, true) && !is_dir($dir)) {
34+
35+
if (! is_dir($dir) && ! @mkdir($dir, 0777, true) && ! is_dir($dir)) {
2536
$error = error_get_last();
26-
throw new \ErrorException($error['message']);
37+
38+
throw new ErrorException(sprintf(
39+
'Failed to create directory "%s" with message "%s"',
40+
$dir,
41+
$error['message']
42+
));
2743
}
44+
2845
$configuration->setMigrationsDirectory($dir);
2946
} else {
30-
$dir = $configuration->getMigrationsDirectory();
3147
// class Kernel has method getKernelParameters with some of the important path parameters
32-
$pathPlaceholderArray = array('kernel.root_dir', 'kernel.cache_dir', 'kernel.logs_dir');
48+
$pathPlaceholderArray = ['kernel.root_dir', 'kernel.cache_dir', 'kernel.logs_dir'];
49+
3350
foreach ($pathPlaceholderArray as $pathPlaceholder) {
34-
if ($container->hasParameter($pathPlaceholder) && preg_match('/\%'.$pathPlaceholder.'\%/', $dir)) {
35-
$dir = str_replace('%'.$pathPlaceholder.'%', $container->getParameter($pathPlaceholder), $dir);
51+
if (! $container->hasParameter($pathPlaceholder) || ! preg_match('/\%' . $pathPlaceholder . '\%/', $dir)) {
52+
continue;
3653
}
54+
55+
$dir = str_replace('%' . $pathPlaceholder . '%', $container->getParameter($pathPlaceholder), $dir);
3756
}
38-
if (!is_dir($dir) && !@mkdir($dir, 0777, true) && !is_dir($dir)) {
57+
58+
if (! is_dir($dir) && ! @mkdir($dir, 0777, true) && ! is_dir($dir)) {
3959
$error = error_get_last();
40-
throw new \ErrorException($error['message']);
60+
61+
throw new ErrorException(sprintf(
62+
'Failed to create directory "%s" with message "%s"',
63+
$dir,
64+
$error['message']
65+
));
4166
}
67+
4268
$configuration->setMigrationsDirectory($dir);
4369
}
44-
if (!$configuration->getMigrationsNamespace()) {
70+
71+
if (empty($configuration->getMigrationsNamespace())) {
4572
$configuration->setMigrationsNamespace($container->getParameter('doctrine_migrations.namespace'));
4673
}
47-
if (!$configuration->getName()) {
74+
75+
if (empty($configuration->getName())) {
4876
$configuration->setName($container->getParameter('doctrine_migrations.name'));
4977
}
78+
5079
// For backward compatibility, need use a table from parameters for overwrite the default configuration
51-
if (!($configuration instanceof AbstractFileConfiguration) || !$configuration->getMigrationsTableName()) {
80+
if (! ($configuration instanceof AbstractFileConfiguration) || empty($configuration->getMigrationsTableName())) {
5281
$configuration->setMigrationsTableName($container->getParameter('doctrine_migrations.table_name'));
5382
}
83+
84+
$configuration->setMigrationsColumnName($container->getParameter('doctrine_migrations.column_name'));
85+
$configuration->setMigrationsColumnLength($container->getParameter('doctrine_migrations.column_length'));
86+
$configuration->setMigrationsExecutedAtColumnName($container->getParameter('doctrine_migrations.executed_at_column_name'));
87+
$configuration->setAllOrNothing($container->getParameter('doctrine_migrations.all_or_nothing'));
88+
5489
// Migrations is not register from configuration loader
55-
if (!($configuration instanceof AbstractFileConfiguration)) {
56-
$configuration->registerMigrationsFromDirectory($configuration->getMigrationsDirectory());
90+
if (! ($configuration instanceof AbstractFileConfiguration)) {
91+
$migrationsDirectory = $configuration->getMigrationsDirectory();
92+
93+
if ($migrationsDirectory !== null) {
94+
$configuration->registerMigrationsFromDirectory($migrationsDirectory);
95+
}
5796
}
5897

59-
if (method_exists($configuration, 'getCustomTemplate') && !$configuration->getCustomTemplate()) {
98+
if (method_exists($configuration, 'getCustomTemplate') && empty($configuration->getCustomTemplate())) {
6099
$configuration->setCustomTemplate($container->getParameter('doctrine_migrations.custom_template'));
61100
}
62101

63102
$organizeMigrations = $container->getParameter('doctrine_migrations.organize_migrations');
103+
64104
switch ($organizeMigrations) {
65105
case Configuration::VERSIONS_ORGANIZATION_BY_YEAR:
66106
$configuration->setMigrationsAreOrganizedByYear(true);
@@ -81,18 +121,19 @@ public static function configureMigrations(ContainerInterface $container, Config
81121
}
82122

83123
/**
84-
* @param ContainerInterface $container
85-
* @param array $versions
124+
* @param Version[] $versions
86125
*
87126
* Injects the container to migrations aware of it
88127
*/
89-
private static function injectContainerToMigrations(ContainerInterface $container, array $versions)
128+
private static function injectContainerToMigrations(ContainerInterface $container, array $versions) : void
90129
{
91130
foreach ($versions as $version) {
92131
$migration = $version->getMigration();
93-
if ($migration instanceof ContainerAwareInterface) {
94-
$migration->setContainer($container);
132+
if (! ($migration instanceof ContainerAwareInterface)) {
133+
continue;
95134
}
135+
136+
$migration->setContainer($container);
96137
}
97138
}
98139
}
Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,63 @@
11
<?php
22

3+
declare(strict_types=1);
4+
35
namespace Doctrine\Bundle\MigrationsBundle\Command\Helper;
46

57
use Doctrine\Bundle\DoctrineBundle\Command\Proxy\DoctrineCommandHelper as BaseDoctrineCommandHelper;
8+
use Doctrine\Bundle\DoctrineBundle\Registry;
69
use Doctrine\DBAL\Sharding\PoolingShardConnection;
10+
use Doctrine\DBAL\Tools\Console\Helper\ConnectionHelper;
11+
use LogicException;
712
use Symfony\Bundle\FrameworkBundle\Console\Application;
813
use Symfony\Component\Console\Input\InputInterface;
14+
use function count;
15+
use function sprintf;
916

1017
/**
1118
* Provides some helper and convenience methods to configure doctrine commands in the context of bundles
1219
* and multiple connections/entity managers.
13-
*
14-
* @author Guilherme Blanco <[email protected]>
1520
*/
1621
abstract class DoctrineCommandHelper extends BaseDoctrineCommandHelper
1722
{
18-
public static function setApplicationHelper(Application $application, InputInterface $input)
23+
public static function setApplicationHelper(Application $application, InputInterface $input) : void
1924
{
2025
$container = $application->getKernel()->getContainer();
21-
$doctrine = $container->get('doctrine');
26+
27+
/** @var Registry $doctrine */
28+
$doctrine = $container->get('doctrine');
29+
2230
$managerNames = $doctrine->getManagerNames();
2331

24-
if ($input->getOption('db') || empty($managerNames)) {
32+
if ($input->getOption('db') !== null || count($managerNames) === 0) {
2533
self::setApplicationConnection($application, $input->getOption('db'));
2634
} else {
2735
self::setApplicationEntityManager($application, $input->getOption('em'));
2836
}
2937

30-
if ($input->getOption('shard')) {
31-
$connection = $application->getHelperSet()->get('db')->getConnection();
32-
if (!$connection instanceof PoolingShardConnection) {
33-
if (empty($managerNames)) {
34-
throw new \LogicException(sprintf("Connection '%s' must implement shards configuration.", $input->getOption('db')));
35-
} else {
36-
throw new \LogicException(sprintf("Connection of EntityManager '%s' must implement shards configuration.", $input->getOption('em')));
37-
}
38+
if ($input->getOption('shard') === null) {
39+
return;
40+
}
41+
42+
/** @var ConnectionHelper $dbHelper */
43+
$dbHelper = $application->getHelperSet()->get('db');
44+
45+
$connection = $dbHelper->getConnection();
46+
47+
if (! $connection instanceof PoolingShardConnection) {
48+
if (count($managerNames) === 0) {
49+
throw new LogicException(sprintf(
50+
"Connection '%s' must implement shards configuration.",
51+
$input->getOption('db')
52+
));
3853
}
3954

40-
$connection->connect($input->getOption('shard'));
55+
throw new LogicException(sprintf(
56+
"Connection of EntityManager '%s' must implement shards configuration.",
57+
$input->getOption('em')
58+
));
4159
}
60+
61+
$connection->connect($input->getOption('shard'));
4262
}
4363
}

Command/MigrationsDiffDoctrineCommand.php

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
11
<?php
22

3+
declare(strict_types=1);
34

45
namespace Doctrine\Bundle\MigrationsBundle\Command;
56

6-
use Doctrine\DBAL\Migrations\Tools\Console\Command\DiffCommand;
7+
use Doctrine\Migrations\Tools\Console\Command\DiffCommand;
8+
use InvalidArgumentException;
9+
use Symfony\Bundle\FrameworkBundle\Console\Application;
710
use Symfony\Component\Console\Input\InputInterface;
811
use Symfony\Component\Console\Input\InputOption;
912
use Symfony\Component\Console\Output\OutputInterface;
1013

1114
/**
1215
* Command for generate migration classes by comparing your current database schema
1316
* to your mapping information.
14-
*
15-
* @author Fabien Potencier <[email protected]>
16-
* @author Jonathan H. Wage <[email protected]>
1717
*/
1818
class MigrationsDiffDoctrineCommand extends DiffCommand
1919
{
20-
protected function configure()
20+
protected function configure() : void
2121
{
2222
parent::configure();
2323

@@ -29,12 +29,25 @@ protected function configure()
2929
;
3030
}
3131

32-
public function execute(InputInterface $input, OutputInterface $output)
32+
public function initialize(InputInterface $input, OutputInterface $output) : void
3333
{
34-
Helper\DoctrineCommandHelper::setApplicationHelper($this->getApplication(), $input);
34+
/** @var Application $application */
35+
$application = $this->getApplication();
36+
37+
Helper\DoctrineCommandHelper::setApplicationHelper($application, $input);
3538

3639
$configuration = $this->getMigrationConfiguration($input, $output);
37-
DoctrineCommand::configureMigrations($this->getApplication()->getKernel()->getContainer(), $configuration);
40+
DoctrineCommand::configureMigrations($application->getKernel()->getContainer(), $configuration);
41+
42+
parent::initialize($input, $output);
43+
}
44+
45+
public function execute(InputInterface $input, OutputInterface $output) : ?int
46+
{
47+
// EM and DB options cannot be set at same time
48+
if ($input->getOption('em') !== null && $input->getOption('db') !== null) {
49+
throw new InvalidArgumentException('Cannot set both "em" and "db" for command execution.');
50+
}
3851

3952
return parent::execute($input, $output);
4053
}

0 commit comments

Comments
 (0)