diff -r d8296f89ebb5 -r 6c78cc456091 install/upgrade.php --- a/install/upgrade.php Fri Mar 07 01:27:28 2008 -0500 +++ b/install/upgrade.php Sat Mar 08 12:12:27 2008 -0500 @@ -16,8 +16,10 @@ define('IN_ENANO', 1); -// The list of versions in THIS BRANCH, in chronological order. -$enano_versions = array('1.1.1', '1.1.2', '1.1.3'); +// The list of versions in THIS AND PREVIOUS branches, in chronological order. +$enano_versions = array(); +$enano_versions['1.0'] = array('1.0', '1.0.1', '1.0.2b1', '1.0.2', '1.0.3', '1.0.4'); +$enano_versions['1.1'] = array('1.1.1', '1.1.2', '1.1.3'); // Turn on every imaginable API hack to make common load on older databases define('IN_ENANO_UPGRADE', 1); @@ -25,9 +27,11 @@ define('ENANO_ALLOW_LOAD_NOLANG', 1); @ini_set('display_errors', 'on'); -require('includes/sql_parse.php'); +// Load installer files +require_once('includes/sql_parse.php'); +require_once('includes/common.php'); +require_once('includes/libenanoinstall.php'); -require_once('includes/common.php'); // when the installer's common is loaded, it runs chdir() to the ENANO_ROOT, thus making this Enano's common.php require_once('includes/common.php'); @ini_set('display_errors', 'on'); @@ -153,10 +157,43 @@ if ( isset($_GET['stage']) && @$_GET['stage'] == 'pimpmyenano' ) { + /* + HOW DOES ENANO'S UPGRADER WORK? + + Versions of Enano are organized into branches and then specific versions by + version number. The upgrader works by using a list of known version numbers + and then systematically executing upgrade schemas for each version. + + When the user requests an upgrade, the first thing performed is a migration + check, which verifies that they are within the right branch. If they are not + within the right branch the upgrade framework will load a migration script + which will define a function named MIGRATE(). Performing more than one + migration in one pass will probably never be supported. How that works for + UX in 1.3.x/1.4.x I know not yet. + + After performing any necessary branch migrations, the framework will perform + any upgrades within the target branch, which is the first two parts + (delimited by periods) of the installer's version number defined in the + installer's common.php. + + enano_perform_upgrade() will only do upgrades. Not migrations. The two as + illustrated within this installer are very different. + */ + // Do we need to run the migration first? - if ( substr(enano_version(), 0, 4) != '1.1.' ) + list($major_version, $minor_version) = explode('.', enano_version()); + $current_branch = "$major_version.$minor_version"; + + list($major_version, $minor_version) = explode('.', installer_enano_version()); + $target_branch = "$major_version.$minor_version"; + + if ( $target_branch != $current_branch ) { - require(ENANO_ROOT . '/install/upgrade/migration/1.0-1.1.php'); + // First upgrade to the latest revision of the current branch + enano_perform_upgrade($current_branch); + // Branch migration could be tricky and is often highly specific between + // major branches, so just include a custom migration script. + require(ENANO_ROOT . "/install/schemas/upgrade/migration/{$current_branch}-{$target_branch}.php"); $result = MIGRATE(); if ( !$result ) { @@ -165,90 +202,10 @@ exit; } } - // Main upgrade stage - - // Init vars - $version_flipped = array_flip($enano_versions); - $version_curr = enano_version(); - $version_target = installer_enano_version(); - - // Calculate which scripts to run - if ( !isset($version_flipped[$version_curr]) ) - { - echo '

ERROR: Unsupported version

'; - $ui->show_footer(); - exit; - } - if ( !isset($version_flipped[$version_target]) ) - { - echo '

ERROR: Upgrader doesn\'t support its own version

'; - $ui->show_footer(); - exit; - } - $upg_queue = array(); - for ( $i = $version_flipped[$version_curr]; $i < $version_flipped[$version_target]; $i++ ) - { - if ( !isset($enano_versions[$i + 1]) ) - { - echo '

ERROR: Unsupported intermediate version

'; - $ui->show_footer(); - exit; - } - $ver_this = $enano_versions[$i]; - $ver_next = $enano_versions[$i + 1]; - $upg_queue[] = array($ver_this, $ver_next); - } - // Verify that all upgrade scripts are usable - foreach ( $upg_queue as $verset ) - { - $file = ENANO_ROOT . "/install/schemas/upgrade/{$verset[0]}-{$verset[1]}-$dbdriver.sql"; - if ( !file_exists($file) ) - { - echo "

ERROR: Couldn't find required schema file: $file

"; - $ui->show_footer(); - exit; - } - } - // Perform upgrade - foreach ( $upg_queue as $verset ) - { - $file = ENANO_ROOT . "/install/schemas/upgrade/{$verset[0]}-{$verset[1]}-$dbdriver.sql"; - try - { - $parser = new SQL_Parser($file); - } - catch(Exception $e) - { - die("
$e
"); - } - - $parser->assign_vars(array( - 'TABLE_PREFIX' => table_prefix - )); + // Do the actual upgrade + enano_perform_upgrade($target_branch); - $sql_list = $parser->parse(); - - foreach ( $sql_list as $sql ) - { - if ( !$db->sql_query($sql) ) - $db->_die(); - } - - // Is there an additional script (logic) to be run after the schema? - $postscript = ENANO_ROOT . "/install/schemas/upgrade/{$verset[0]}-{$verset[1]}.php"; - if ( file_exists($postscript) ) - @include($postscript); - - // The advantage of calling setConfig on the system version here? - // Simple. If the upgrade fails, it will pick up from the last - // version, not try to start again from the beginning. This will - // still cause errors in most cases though. Eventually we probably - // need some sort of query-numbering system that tracks in-progress - // upgrades. - - setConfig('enano_version', $verset[1]); - } echo '

All done!

'; } else