Files
FreshRSS/p/i/index.php
Marien Fressinaud 8619cf6fa6 Add a migration system (#2760)
* Add a Minz_Migrator class

Until now, we updated the database structure somewhere in the code but
it wasn't always consistent and somehow complicated to find. Also, this
code was always checked for nothing.

The Migrator aims to improve and ease the creation of migrations. It
should improve the way we apply the updates, making the update server
almost useless.

References:

- example of migration (before Migrator): cc0db9af4f (diff-11a53443fa81512b128c66b065df0679R10)
- update server: https://github.com/FreshRSS/update.freshrss.org
- PR moving the code of the update server to the core: https://github.com/FreshRSS/FreshRSS/pull/1760

* Automatically apply migrations

For now, administrators are used to have nothing to do during an update
else than getting the new code. I suggest to keep this behaviour and
automatically apply migrations if we detect new ones.

Another solution would be to create a CLI command and ask admins to call
it after getting the new code. It could hide migrations errors to end
users, but admin can forget to apply migrations since there are not used
to it.

* Add documentation for Minz Migrator

* Execute migrations even if next ones are applied

* Change mechanism to prevent multiple update at once

* Use mkdir to create the lock and to test it exists

Reference: https://stackoverflow.com/a/731634

* Append .lock to applied_migrations_path

There are no needs to define another file to serve as a lock.

* Change migrations naming convention

* Apply suggestions from code review

Co-Authored-By: Alexandre Alapetite <alexandre@alapetite.fr>

* Perform a low-cost migration versions comparaison

* Clarify version numbers concerning the migration system

Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>
2020-07-08 12:11:55 +02:00

85 lines
3.2 KiB
PHP
Executable File

<?php
// > Error: FreshRSS requires PHP, which does not seem to be installed or configured correctly! <!--
# ***** BEGIN LICENSE BLOCK *****
# MINZ - A free PHP framework
# Copyright (C) 2011 Marien Fressinaud
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# ***** END LICENSE BLOCK *****
require(__DIR__ . '/../../constants.php');
require(LIB_PATH . '/lib_rss.php'); //Includes class autoloader
if (file_exists(DATA_PATH . '/do-install.txt')) {
require(APP_PATH . '/install.php');
} else {
session_cache_limiter('');
Minz_Session::init('FreshRSS');
Minz_Session::_param('keepAlive', 1); //To prevent the PHP session from expiring
if (!file_exists(DATA_PATH . '/no-cache.txt')) {
require(LIB_PATH . '/http-conditional.php');
$currentUser = Minz_Session::param('currentUser', '');
$dateLastModification = $currentUser === '' ? time() : max(
@filemtime(join_path(USERS_PATH, $currentUser, 'log.txt')),
@filemtime(join_path(DATA_PATH, 'config.php'))
);
if (httpConditional($dateLastModification, 0, 0, false, PHP_COMPRESSION, true)) {
exit(); //No need to send anything
}
}
$migrations_path = APP_PATH . '/migrations';
$applied_migrations_path = DATA_PATH . '/applied_migrations.txt';
// The next line is temporary: the migrate method expects the applied_migrations.txt
// file to exist. This is because the install script creates this file, so
// if it is missing, it means the application is not installed. But we
// should also take care of applications installed before the new
// migrations system (<=1.16). Indeed, they are installed but the migrations
// version file doesn't exist. So for now (1.17), we continue to check if the
// application is installed with the do-install.txt file: if yes, we create
// the version file. Starting from version 1.18, all the installed systems
// will have the file and so we will be able to remove this temporary line
// and stop using the do-install.txt file to check if FRSS is already
// installed.
touch($applied_migrations_path);
$error = false;
try {
// Apply the migrations if any
$result = Minz_Migrator::execute($migrations_path, $applied_migrations_path);
if ($result === true) {
$front_controller = new FreshRSS();
$front_controller->init();
$front_controller->run();
} else {
$error = $result;
}
} catch (Exception $e) {
$error = $e->getMessage();
}
if ($error) {
// TODO this should be definitely improved to display a nicer error
// page to the users (especially non administrators).
echo '### Fatal error! ###<br />', "\n";
Minz_Log::error($error);
echo 'See logs files.';
syslog(LOG_INFO, 'FreshRSS Fatal error! ' . $error);
}
}