245 lines
7.3 KiB
PHP
245 lines
7.3 KiB
PHP
<?php
|
|
/* -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
/*
|
|
# ***** BEGIN LICENSE BLOCK *****
|
|
# This file is part of Plume Framework, a simple PHP Application Framework.
|
|
# Copyright (C) 2001-2007 Loic d'Anterroches and contributors.
|
|
#
|
|
# Plume Framework is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU Lesser General Public License as published by
|
|
# the Free Software Foundation; either version 2.1 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# Plume Framework 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 Lesser General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU Lesser General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
#
|
|
# ***** END LICENSE BLOCK ***** */
|
|
|
|
/**
|
|
* Migration script.
|
|
*/
|
|
if (version_compare(PHP_VERSION, '5.2.4', '<')) {
|
|
echo 'Error: You need at least PHP 5.2.4'."\n";
|
|
exit(1);
|
|
}
|
|
set_include_path(get_include_path().PATH_SEPARATOR.dirname(__FILE__));
|
|
// we have to silence strict code warnings because of PEAR (see issue 642)
|
|
error_reporting(E_ALL & ~E_STRICT);
|
|
require 'Console/Getopt.php';
|
|
|
|
global $debug;
|
|
$debug = false; // Yes a dirty global variable.
|
|
$search_path = null;
|
|
|
|
$cg = new Console_Getopt();
|
|
$shortoptions = 'aixubrc:v:d';
|
|
$longoptions = array('app=', 'version=', 'conf=', 'search-path=',
|
|
'include-path=');
|
|
|
|
$args = $cg->readPHPArgv();
|
|
|
|
function debug($what)
|
|
{
|
|
global $debug;
|
|
if ($debug) {
|
|
echo($what."\n");
|
|
}
|
|
}
|
|
|
|
function usage()
|
|
{
|
|
echo 'Usage examples:'."\n"
|
|
.' Upgrade all: migrate.php --conf=path/to/config.php -a'."\n"
|
|
.' Upgrade MyApp: migrate.php --conf=path/to/config.php --app=MyApp'."\n"
|
|
.' Backup MyApp: migrate.php --conf=path/to/config.php --app=MyApp -b /path/to/backup/folder [backupname]'."\n"
|
|
.' Restore MyApp: migrate.php --conf=path/to/config.php --app=MyApp -r /path/to/backup/folder backupname'."\n"
|
|
.' MyApp to ver. 3: migrate.php --conf=path/to/config.php --app=MyApp -v3'."\n"
|
|
.''."\n"
|
|
.'Options:'."\n"
|
|
.' c, --conf: Path to the configuration file.'."\n"
|
|
.' a: Upgrade all the installed applications.'."\n"
|
|
.' v, --version: Upgrade/Downgrade to the given version.'."\n"
|
|
.' --app: Application to upgrade/downgrade.'."\n"
|
|
.' u: Dry run, do nothing.'."\n"
|
|
.' --search-path: Set the DB search path before the run.'."\n"
|
|
.' --include-path: Paths to add to the PHP include path.'."\n"
|
|
.' d: Display debug information.'."\n"
|
|
.' i: Install the application(s).'."\n"
|
|
.' x: Uninstall the application(s).'."\n"
|
|
.' b: Backup the application(s).'."\n"
|
|
.' r: Restore the application(s).'."\n"
|
|
.''."\n"
|
|
.'Note: The command line parser of PEAR is not very robust'."\n"
|
|
.' if you have an unexpected error about an offset not'."\n"
|
|
.' set. Please report a bug. Thanks!'."\n";
|
|
|
|
}
|
|
|
|
try {
|
|
$ret = $cg->getopt($args, $shortoptions, $longoptions);
|
|
} catch (Exception $e) {
|
|
echo('Error in getopt command line: '.$e->getMessage()."\n");
|
|
usage();
|
|
die();
|
|
}
|
|
|
|
// Note that PEAR is not PHP 5 compatible, so the need to create $p.
|
|
$p = new PEAR();
|
|
if ($p->isError($ret)) {
|
|
echo('Error in command line: '.$ret->getMessage()."\n");
|
|
usage();
|
|
die();
|
|
}
|
|
|
|
// Parse the options.
|
|
$what = array(
|
|
'all' => false,
|
|
'app' => '',
|
|
'conf' => '',
|
|
'version' => null,
|
|
'dry_run' => false,
|
|
'un-install' => false,
|
|
'install' => false,
|
|
'backup' => false,
|
|
'restore' => false,
|
|
);
|
|
|
|
$opts = $ret[0];
|
|
$args = $ret[1];
|
|
if (sizeof($opts) > 0) {
|
|
foreach ($opts as $o) {
|
|
switch ($o[0]) {
|
|
case 'a':
|
|
$what['all'] = true;
|
|
break;
|
|
case 'b':
|
|
$what['backup'] = true;
|
|
break;
|
|
case 'r':
|
|
$what['restore'] = true;
|
|
break;
|
|
case 'v':
|
|
case '--version':
|
|
$what['version'] = $o[1];
|
|
break;
|
|
case 'c':
|
|
case '--conf':
|
|
$what['conf'] = $o[1];
|
|
break;
|
|
case '--app':
|
|
$what['app'] = $o[1];
|
|
break;
|
|
case 'd':
|
|
$debug = true;
|
|
break;
|
|
case '--search-path':
|
|
$search_path = trim($o[1]);
|
|
break;
|
|
case '--include-path':
|
|
set_include_path(get_include_path().PATH_SEPARATOR.trim($o[1]));
|
|
break;
|
|
case 'u':
|
|
$what['dry_run'] = true;
|
|
break;
|
|
case 'x':
|
|
$what['un-install'] = true;
|
|
break;
|
|
case 'i':
|
|
$what['install'] = true;
|
|
break;
|
|
}
|
|
}
|
|
} else {
|
|
echo 'Error: Missing what to do.'."\n";
|
|
usage();
|
|
die();
|
|
}
|
|
|
|
// control the arguments.
|
|
if (('' == $what['conf'] or !file_exists($what['conf']))
|
|
or ($what['all'] == false and $what['app'] == '')) {
|
|
echo 'Error: Missing what to do or config file.'."\n";
|
|
usage();
|
|
die();
|
|
}
|
|
if ($what['all'] and $what['version'] !== null) {
|
|
echo 'Error: -a and -v --version cannot be used together.'."\n";
|
|
echo ' Run the migration to a given version indenpendtly'."\n";
|
|
echo ' for each application.'."\n";
|
|
usage();
|
|
die();
|
|
}
|
|
|
|
require 'Pluf.php';
|
|
Pluf::start($what['conf']);
|
|
if (PHP_SAPI != 'cli' and Pluf::f('migrate_allow_web', false)) {
|
|
echo('Error: This script can only be run from the command line.'."\n");
|
|
exit();
|
|
}
|
|
|
|
debug('PHP include path: '.get_include_path());
|
|
|
|
if ($what['un-install']) {
|
|
$apps = array();
|
|
if ($what['all']) {
|
|
$apps = Pluf::f('installed_apps');
|
|
} else {
|
|
$apps = array($what['app']);
|
|
}
|
|
echo 'Applications to uninstall: '.implode(', ', $apps)."\n";
|
|
echo 'Please confirm that you want to uninstall by typing "yes": ';
|
|
$line = trim(fgets(STDIN)); // reads one line from STDIN
|
|
if ($line != 'yes') {
|
|
echo 'Abort...'."\n";
|
|
die();
|
|
}
|
|
}
|
|
|
|
if (!is_null($search_path)) {
|
|
$db =& Pluf::db();
|
|
$db->setSearchPath($search_path);
|
|
debug('Set search path to: '.$search_path);
|
|
}
|
|
$app = null; // Migrate all the applications.
|
|
$app_disp = 'all the apps';
|
|
$v_disp = 'latest';
|
|
if (!is_null($what['version'])) {
|
|
$v_disp = $what['version'];
|
|
}
|
|
if ($what['app']) {
|
|
$app = trim($what['app']);
|
|
$app_disp = $app;
|
|
}
|
|
$m = new Pluf_Migration($app);
|
|
if ($debug) {
|
|
$m->display = true;
|
|
}
|
|
$m->dry_run = $what['dry_run'];
|
|
|
|
if ($what['install']) {
|
|
debug('Install '.$app_disp);
|
|
$m->install();
|
|
} elseif ($what['un-install']) {
|
|
debug('Uninstall '.$app_disp);
|
|
$m->unInstall();
|
|
} elseif ($what['backup']) {
|
|
debug('Backup '.$app_disp);
|
|
if (!isset($args[1])) $args[1] = null;
|
|
$m->backup($args[0], $args[1]);
|
|
} elseif ($what['restore']) {
|
|
debug('Restore '.$app_disp);
|
|
$m->restore($args[0], $args[1]);
|
|
} else {
|
|
debug('Migrate '.$app.' to version '.$v_disp);
|
|
$m->migrate($what['version']);
|
|
}
|
|
|
|
|
|
|