1 | <?php |
---|
2 | |
---|
3 | /** |
---|
4 | * This file is part of the OpenPNE package. |
---|
5 | * (c) OpenPNE Project (http://www.openpne.jp/) |
---|
6 | * |
---|
7 | * For the full copyright and license information, please view the LICENSE |
---|
8 | * file and the NOTICE file that were distributed with this source code. |
---|
9 | */ |
---|
10 | |
---|
11 | class openpneUpdateTask extends sfPropelBaseTask |
---|
12 | { |
---|
13 | protected function configure() |
---|
14 | { |
---|
15 | $this->namespace = 'openpne'; |
---|
16 | $this->name = 'update'; |
---|
17 | |
---|
18 | $this->addArguments(array( |
---|
19 | new sfCommandArgument('name', sfCommandArgument::REQUIRED, 'The plugin name or "OpenPNE"'), |
---|
20 | new sfCommandArgument('before-version', sfCommandArgument::REQUIRED, ''), |
---|
21 | new sfCommandArgument('after-version', sfCommandArgument::REQUIRED, ''), |
---|
22 | )); |
---|
23 | |
---|
24 | $this->addOptions(array( |
---|
25 | new sfCommandOption('no-build-model', null, sfCommandOption::PARAMETER_NONE, 'Do not build model classes'), |
---|
26 | )); |
---|
27 | |
---|
28 | $this->briefDescription = 'update OpenPNE'; |
---|
29 | $this->detailedDescription = <<<EOF |
---|
30 | The [openpne:install|INFO] task updates OpenPNE and/or plugin. |
---|
31 | Call it with: |
---|
32 | |
---|
33 | [./symfony openpne:update OpenPNE 3.0 3.2|INFO] |
---|
34 | EOF; |
---|
35 | } |
---|
36 | |
---|
37 | protected function execute($arguments = array(), $options = array()) |
---|
38 | { |
---|
39 | $databaseManager = new sfDatabaseManager($this->configuration); |
---|
40 | |
---|
41 | $dir = sfConfig::get('sf_lib_dir').'/update'; |
---|
42 | $prefix = 'op'; |
---|
43 | if ('OpenPNE' !== $arguments['name']) |
---|
44 | { |
---|
45 | $dir = sfConfig::get('sf_plugins_dir').'/'.$arguments['name'].'/lib/update'; |
---|
46 | $prefix = $arguments['name']; |
---|
47 | } |
---|
48 | |
---|
49 | $beforeVersion = self::formatVersion($arguments['before-version']); |
---|
50 | $afterVersion = self::formatVersion($arguments['after-version']); |
---|
51 | |
---|
52 | $files = sfFinder::type('file')->not_name('opUpdate.class.php')->not_name('opUpdateDoctrineMigrationProcess.class.php')->in($dir); |
---|
53 | $files = array_map(create_function('$path', 'return basename($path);'), $files); |
---|
54 | usort($files, array(get_class($this), 'sortBeforeVersions')); |
---|
55 | foreach ($files as $file) |
---|
56 | { |
---|
57 | $versions = explode('_to_', str_replace('.php', '', $file), 2); |
---|
58 | $_before = self::formatVersion($versions[0]); |
---|
59 | $_after = self::formatVersion($versions[1]); |
---|
60 | |
---|
61 | if (version_compare($beforeVersion, $_before, '<=') && version_compare($afterVersion, $_after, '>=')) |
---|
62 | { |
---|
63 | $className = $prefix.'Update_'.str_replace('.php', '', $file); |
---|
64 | $this->logSection('execute', $className); |
---|
65 | require_once $dir.'/'.$file; |
---|
66 | $obj = new $className($this->dispatcher, $databaseManager); |
---|
67 | $obj->doUpdate(); |
---|
68 | } |
---|
69 | } |
---|
70 | |
---|
71 | if ($options['no-build-model']) |
---|
72 | { |
---|
73 | $this->buildModel(); |
---|
74 | } |
---|
75 | } |
---|
76 | |
---|
77 | static public function sortBeforeVersions($name1, $name2) |
---|
78 | { |
---|
79 | $_versions = explode('_to_', str_replace('.php', '', $name1), 2); |
---|
80 | $version1 = array_shift($_versions); |
---|
81 | $_versions = explode('_to_', str_replace('.php', '', $name2), 2); |
---|
82 | $version2 = array_shift($_versions); |
---|
83 | |
---|
84 | return version_compare(self::formatVersion($version1), self::formatVersion($version2)); |
---|
85 | } |
---|
86 | |
---|
87 | static public function formatVersion($version) |
---|
88 | { |
---|
89 | $_searches = array('-', '_', '+'); |
---|
90 | $version = str_replace($_searches, '.', $version); |
---|
91 | |
---|
92 | $pos = strpos($version, '.dev.'); |
---|
93 | if (false !== $pos) |
---|
94 | { |
---|
95 | $time = substr($version, $pos + strlen('.dev.')); |
---|
96 | $datetime = new DateTime($time); |
---|
97 | $version = substr($version, 0, $pos + strlen('.dev.')).$datetime->format('U'); |
---|
98 | } |
---|
99 | |
---|
100 | return $version; |
---|
101 | } |
---|
102 | |
---|
103 | protected function buildModel() |
---|
104 | { |
---|
105 | $task = new sfPropelBuildModelTask($this->dispatcher, $this->formatter); |
---|
106 | $task->run(); |
---|
107 | $task = new sfPropelBuildFormsTask($this->dispatcher, $this->formatter); |
---|
108 | $task->run(); |
---|
109 | $task = new sfPropelBuildFiltersTask($this->dispatcher, $this->formatter); |
---|
110 | $task->run(); |
---|
111 | } |
---|
112 | } |
---|