ここの情報は古いです。ご理解頂いた上でお取り扱いください。

source: OpenPNE3/trunk/lib/task/openpneUpdateTask.class.php @ 10313

Last change on this file since 10313 was 10313, checked in by ebihara, 11 years ago

#3198:added an update script for executing the update files of the bandled plugins

File size: 3.7 KB
Line 
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
11class 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
30The [openpne:install|INFO] task updates OpenPNE and/or plugin.
31Call it with:
32
33  [./symfony openpne:update OpenPNE 3.0 3.2|INFO]
34EOF;
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}
Note: See TracBrowser for help on using the repository browser.