]>
git.immae.eu Git - github/shaarli/Shaarli.git/blob - application/Updater.php
5 * Used to update stuff when a new Shaarli's version is reached.
6 * Update methods are ran only once, and the stored in a JSON file.
11 * @var array Updates which are already done.
13 protected $doneUpdates;
16 * @var array Shaarli's configuration array.
21 * @var LinkDB instance.
26 * @var bool True if the user is logged in, false otherwise.
28 protected $isLoggedIn;
31 * @var ReflectionMethod[] List of current class methods.
38 * @param array $doneUpdates Updates which are already done.
39 * @param array $config Shaarli's configuration array.
40 * @param LinkDB $linkDB LinkDB instance.
41 * @param boolean $isLoggedIn True if the user is logged in.
43 public function __construct($doneUpdates, $config, $linkDB, $isLoggedIn)
45 $this->doneUpdates
= $doneUpdates;
46 $this->config
= $config;
47 $this->linkDB
= $linkDB;
48 $this->isLoggedIn
= $isLoggedIn;
50 // Retrieve all update methods.
51 $class = new ReflectionClass($this);
52 $this->methods
= $class->getMethods();
56 * Run all new updates.
57 * Update methods have to start with 'updateMethod' and return true (on success).
59 * @return array An array containing ran updates.
61 * @throws UpdaterException If something went wrong.
63 public function update()
65 $updatesRan = array();
67 // If the user isn't logged in, exit without updating.
68 if ($this->isLoggedIn
!== true) {
72 if ($this->methods
== null) {
73 throw new UpdaterException('Couldn\'t retrieve Updater class methods.');
76 foreach ($this->methods
as $method) {
77 // Not an update method or already done, pass.
78 if (! startsWith($method->getName(), 'updateMethod')
79 || in_array($method->getName(), $this->doneUpdates
)
85 $method->setAccessible(true);
86 $res = $method->invoke($this);
87 // Update method must return true to be considered processed.
89 $updatesRan[] = $method->getName();
91 } catch (Exception
$e) {
92 throw new UpdaterException($method, $e);
96 $this->doneUpdates
= array_merge($this->doneUpdates
, $updatesRan);
102 * @return array Updates methods already processed.
104 public function getDoneUpdates()
106 return $this->doneUpdates
;
110 * Move deprecated options.php to config.php.
112 * Milestone 0.9 (old versioning) - shaarli/Shaarli#41:
113 * options.php is not supported anymore.
115 public function updateMethodMergeDeprecatedConfigFile()
117 $config_file = $this->config
['config']['CONFIG_FILE'];
119 if (is_file($this->config
['config']['DATADIR'].'/options.php')) {
120 include $this->config
['config']['DATADIR'].'/options.php';
122 // Load GLOBALS into config
123 foreach ($GLOBALS as $key => $value) {
124 $this->config
[$key] = $value;
126 $this->config
['config']['CONFIG_FILE'] = $config_file;
127 writeConfig($this->config
, $this->isLoggedIn
);
129 unlink($this->config
['config']['DATADIR'].'/options.php');
137 * Class UpdaterException.
139 class UpdaterException
extends Exception
142 * @var string Method where the error occurred.
147 * @var Exception The parent exception.
154 * @param string $message Force the error message if set.
155 * @param string $method Method where the error occurred.
156 * @param Exception|bool $previous Parent exception.
158 public function __construct($message = '', $method = '', $previous = false)
160 $this->method
= $method;
161 $this->previous
= $previous;
162 $this->message
= $this->buildMessage($message);
166 * Build the exception error message.
168 * @param string $message Optional given error message.
170 * @return string The built error message.
172 private function buildMessage($message)
175 if (! empty($message)) {
176 $out .= $message . PHP_EOL
;
179 if (! empty($this->method
)) {
180 $out .= 'An error occurred while running the update '. $this->method
. PHP_EOL
;
183 if (! empty($this->previous
)) {
184 $out .= ' '. $this->previous
->getMessage();
193 * Read the updates file, and return already done updates.
195 * @param string $updatesFilepath Updates file path.
197 * @return array Already done update methods.
199 function read_updates_file($updatesFilepath)
201 if (! empty($updatesFilepath) && is_file($updatesFilepath)) {
202 $content = file_get_contents($updatesFilepath);
203 if (! empty($content)) {
204 return explode(';', $content);
211 * Write updates file.
213 * @param string $updatesFilepath Updates file path.
214 * @param array $updates Updates array to write.
216 * @throws Exception Couldn't write version number.
218 function write_updates_file($updatesFilepath, $updates)
220 if (empty($updatesFilepath)) {
221 throw new Exception('Updates file path is not set, can\'t write updates.');
224 $res = file_put_contents($updatesFilepath, implode(';', $updates));
225 if ($res === false) {
226 throw new Exception('Unable to write updates in '. $updatesFilepath . '.');