]>
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 LinkDB instance.
21 * @var bool True if the user is logged in, false otherwise.
23 protected $isLoggedIn;
26 * @var ReflectionMethod[] List of current class methods.
33 * @param array $doneUpdates Updates which are already done.
34 * @param LinkDB $linkDB LinkDB instance.
35 * @param boolean $isLoggedIn True if the user is logged in.
37 public function __construct($doneUpdates, $linkDB, $isLoggedIn)
39 $this->doneUpdates
= $doneUpdates;
40 $this->linkDB
= $linkDB;
41 $this->isLoggedIn
= $isLoggedIn;
43 // Retrieve all update methods.
44 $class = new ReflectionClass($this);
45 $this->methods
= $class->getMethods();
49 * Run all new updates.
50 * Update methods have to start with 'updateMethod' and return true (on success).
52 * @return array An array containing ran updates.
54 * @throws UpdaterException If something went wrong.
56 public function update()
58 $updatesRan = array();
60 // If the user isn't logged in, exit without updating.
61 if ($this->isLoggedIn
!== true) {
65 if ($this->methods
== null) {
66 throw new UpdaterException('Couldn\'t retrieve Updater class methods.');
69 foreach ($this->methods
as $method) {
70 // Not an update method or already done, pass.
71 if (! startsWith($method->getName(), 'updateMethod')
72 || in_array($method->getName(), $this->doneUpdates
)
78 $method->setAccessible(true);
79 $res = $method->invoke($this);
80 // Update method must return true to be considered processed.
82 $updatesRan[] = $method->getName();
84 } catch (Exception
$e) {
85 throw new UpdaterException($method, $e);
89 $this->doneUpdates
= array_merge($this->doneUpdates
, $updatesRan);
95 * @return array Updates methods already processed.
97 public function getDoneUpdates()
99 return $this->doneUpdates
;
103 * Move deprecated options.php to config.php.
105 * Milestone 0.9 (old versioning) - shaarli/Shaarli#41:
106 * options.php is not supported anymore.
108 public function updateMethodMergeDeprecatedConfigFile()
110 $conf = ConfigManager
::getInstance();
112 if (is_file($conf->get('config.DATADIR') . '/options.php')) {
113 include $conf->get('config.DATADIR') . '/options.php';
115 // Load GLOBALS into config
116 $allowedKeys = array_merge(ConfigPhp
::$ROOT_KEYS);
117 $allowedKeys[] = 'config';
118 foreach ($GLOBALS as $key => $value) {
119 if (in_array($key, $allowedKeys)) {
120 $conf->set($key, $value);
123 $conf->write($this->isLoggedIn
);
124 unlink($conf->get('config.DATADIR').'/options.php');
131 * Rename tags starting with a '-' to work with tag exclusion search.
133 public function updateMethodRenameDashTags()
135 $conf = ConfigManager
::getInstance();
136 $linklist = $this->linkDB
->filterSearch();
137 foreach ($linklist as $link) {
138 $link['tags'] = preg_replace('/(^| )\-/', '$1', $link['tags
']);
139 $link['tags
'] = implode(' ', array_unique(LinkFilter::tagsStrToArray($link['tags
'], true)));
140 $this->linkDB[$link['linkdate
']] = $link;
142 $this->linkDB->savedb($conf->get('config
.PAGECACHE
'));
147 * Move old configuration in PHP to the new config system in JSON format.
149 * Will rename 'config
.php
' into 'config
.save
.php
' and create 'config
.json
'.
151 public function updateMethodConfigToJson()
153 $conf = ConfigManager::getInstance();
155 // JSON config already exists, nothing to do.
156 if ($conf->getConfigIO() instanceof ConfigJson) {
160 $configPhp = new ConfigPhp();
161 $configJson = new ConfigJson();
162 $oldConfig = $configPhp->read($conf::$CONFIG_FILE . '.php
');
163 rename($conf->getConfigFile(), $conf::$CONFIG_FILE . '.save
.php
');
164 $conf->setConfigIO($configJson);
167 foreach (ConfigPhp::$ROOT_KEYS as $key) {
168 $conf->set($key, $oldConfig[$key]);
171 // Set sub config keys (config and plugins)
172 $subConfig = array('config
', 'plugins
');
173 foreach ($subConfig as $sub) {
174 foreach ($oldConfig[$sub] as $key => $value) {
175 $conf->set($sub .'.'. $key, $value);
180 $conf->write($this->isLoggedIn);
182 } catch (IOException $e) {
183 error_log($e->getMessage());
190 * Class UpdaterException.
192 class UpdaterException extends Exception
195 * @var string Method where the error occurred.
200 * @var Exception The parent exception.
207 * @param string $message Force the error message if set.
208 * @param string $method Method where the error occurred.
209 * @param Exception|bool $previous Parent exception.
211 public function __construct($message = '', $method = '', $previous = false)
213 $this->method = $method;
214 $this->previous = $previous;
215 $this->message = $this->buildMessage($message);
219 * Build the exception error message.
221 * @param string $message Optional given error message.
223 * @return string The built error message.
225 private function buildMessage($message)
228 if (! empty($message)) {
229 $out .= $message . PHP_EOL;
232 if (! empty($this->method)) {
233 $out .= 'An error occurred
while running the update
'. $this->method . PHP_EOL;
236 if (! empty($this->previous)) {
237 $out .= ' '. $this->previous->getMessage();
245 * Read the updates file, and return already done updates.
247 * @param string $updatesFilepath Updates file path.
249 * @return array Already done update methods.
251 function read_updates_file($updatesFilepath)
253 if (! empty($updatesFilepath) && is_file($updatesFilepath)) {
254 $content = file_get_contents($updatesFilepath);
255 if (! empty($content)) {
256 return explode(';', $content);
263 * Write updates file.
265 * @param string $updatesFilepath Updates file path.
266 * @param array $updates Updates array to write.
268 * @throws Exception Couldn't write version number
.
270 function write_updates_file($updatesFilepath, $updates)
272 if (empty($updatesFilepath)) {
273 throw new Exception('Updates file path is not set, can\'t write updates.');
276 $res = file_put_contents($updatesFilepath, implode(';', $updates));
277 if ($res === false) {
278 throw new Exception('Unable to write updates in '. $updatesFilepath . '.');