* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ pake_desc('upgrade to a new symfony release'); pake_task('upgrade'); pake_desc('downgrade to a previous symfony release'); pake_task('downgrade', 'project_exists'); function run_downgrade($task, $args) { throw new Exception('I have no downgrade script for this release.'); } function run_upgrade($task, $args) { if (!isset($args[0])) { throw new Exception('You must provide the upgrade script to use (1.0 to upgrade to symfony 1.0 for example).'); } $version = $args[0]; if ($version == '1.0') { run_upgrade_1_0($task, $args); } else { throw new Exception('I have no upgrade script for this release.'); } } function run_upgrade_1_0($task, $args) { // check we have a project if (!file_exists('symfony') && !file_exists('SYMFONY')) { throw new Exception('You must be in a symfony project directory'); } // upgrade propel.ini _upgrade_1_0_propel_ini(); // upgrade i18n support _upgrade_1_0_i18n(); // upgrade model classes _upgrade_1_0_propel_model(); // migrate activate to enabled _upgrade_1_0_activate(); // find all applications for this project $apps = pakeFinder::type('directory')->name(sfConfig::get('sf_app_module_dir_name'))->mindepth(1)->maxdepth(1)->relative()->in(sfConfig::get('sf_apps_dir_name')); // install symfony CLI if (file_exists(sfConfig::get('sf_root_dir').'/SYMFONY')) { pake_remove(sfConfig::get('sf_root_dir').'/SYMFONY', ''); } pake_copy(sfConfig::get('sf_symfony_data_dir').'/skeleton/project/symfony', sfConfig::get('sf_root_dir').'/symfony'); pake_chmod('symfony', sfConfig::get('sf_root_dir'), 0777); // update schemas _upgrade_1_0_schemas(); // add bootstrap files for tests _add_1_0_test_bootstraps(); // upgrade main config.php _upgrade_1_0_main_config_php(); // upgrade all applications foreach ($apps as $app_module_dir) { $app = str_replace(DIRECTORY_SEPARATOR.sfConfig::get('sf_app_module_dir_name'), '', $app_module_dir); pake_echo_action('upgrade 1.0', pakeColor::colorize(sprintf('upgrading application "%s"', $app), array('fg' => 'cyan'))); $app_dir = sfConfig::get('sf_apps_dir_name').'/'.$app; // upgrade config.php _upgrade_1_0_config_php($app_dir); // upgrade filters.yml _upgrade_1_0_filters_yml($app_dir); // upgrade all modules $dir = $app_dir.'/'.sfConfig::get('sf_app_module_dir_name'); if ($dir) { // template dirs $template_dirs = pakeFinder::type('directory')->name('templates')->mindepth(1)->maxdepth(1)->in($dir); $template_dirs[] = $app_dir.'/'.sfConfig::get('sf_app_template_dir_name'); _upgrade_1_0_deprecated_for_templates($template_dirs); _upgrade_1_0_date_form_helpers($template_dirs); _upgrade_1_0_deprecated_for_generator($app_dir); _upgrade_1_0_cache_yml($app_dir); // actions dirs $action_dirs = pakeFinder::type('directory')->name('actions')->mindepth(1)->maxdepth(1)->in($dir); _upgrade_1_0_deprecated_for_actions($action_dirs); // view.yml _upgrade_1_0_view_yml($app_dir); _upgrade_1_0_php_files($app_dir); } } pake_echo_action('upgrade 1.0', 'done'); pake_mkdirs(sfConfig::get('sf_root_dir').'/plugins'); if (is_dir(sfConfig::get('sf_lib_dir').'/plugins')) { pake_echo_comment('WARNING: you must re-install all your plugins'); } pake_echo_comment('Now, you must:'); pake_echo_comment(' - rebuild your model classes: symfony propel-build-model'); pake_echo_comment(' - clear the cache: symfony cc'); } function _upgrade_1_0_i18n() { $dirs = array(sfConfig::get('sf_lib_dir_name'), sfConfig::get('sf_apps_dir_name')); $finder = pakeFinder::type('file')->name('*.php'); $seen = false; foreach ($finder->in($dirs) as $php_file) { $content = file_get_contents($php_file); $count = 0; $content = str_replace('sfConfig::get(\'sf_i18n_instance\')', 'sfContext::getInstance()->getI18N()', $content, $count); if ($count && !$seen) { $seen = true; pake_echo_comment('sfConfig::get(\'sf_i18n_instance\') is deprecated'); pake_echo_comment(' use sfContext::getInstance()->getI18N()'); } if ($count) { file_put_contents($php_file, $content); } } } function _upgrade_1_0_php_files($app_dir) { pake_echo_action('upgrade 1.0', 'upgrading sf/ path configuration'); $php_files = pakeFinder::type('file')->name('*.php')->in($app_dir); foreach ($php_files as $php_file) { $content = file_get_contents($php_file); $deprecated = array( "'/sf/js/prototype" => "sfConfig::get('sf_prototype_web_dir').'/js", "'/sf/css/prototype" => "sfConfig::get('sf_prototype_web_dir').'/css", "'/sf/js/sf_admin" => "sfConfig::get('sf_admin_web_dir').'/js", "'/sf/css/sf_admin" => "sfConfig::get('sf_admin_web_dir').'/css", "'/sf/images/sf_admin" => "sfConfig::get('sf_admin_web_dir').'/images", ); $seen = array(); $updated = false; foreach ($deprecated as $old => $new) { $count = 0; $content = str_replace($old, $new, $content, $count); if ($count) { $updated = true; } if ($count && !isset($seen[$old])) { $seen[$old] = true; pake_echo_comment(sprintf('%s is deprecated', $old)); pake_echo_comment(sprintf(' use %s', $new)); } } if ($updated) { file_put_contents($php_file, $content); } } } function _upgrade_1_0_activate() { pake_echo_action('upgrade 1.0', 'migrate activate to enabled'); $config_files = array( 'settings.yml' => array( 'activated_modules:' => 'enabled_modules: ', ), 'cache.yml' => array( 'activate:' => 'enabled: ', ), 'logging.yml' => array( 'active:' => 'enabled:', ), '*.php' => array( 'sf_logging_'.'active' => 'sf_logging_enabled', ), 'apps/*/modules/*/validate/*.yml' => array( 'activate:' => 'enabled: ', ), ); $seen = array(); foreach ($config_files as $config_file => $changed) { list($dir, $config_file) = array(dirname($config_file), basename($config_file)); $files = pakeFinder::type('file')->name($config_file)->in(sfConfig::get('sf_root_dir').DIRECTORY_SEPARATOR.$dir); foreach ($files as $file) { $content = file_get_contents($file); $updated = false; foreach ($changed as $old => $new) { $content = str_replace($old, $new, $content, $count); if ($count) { $updated = true; } if ($count && !isset($seen[$config_file.$old])) { $seen[$config_file.$old] = true; pake_echo_comment(sprintf('%s is deprecated in %s', $old, $config_file)); pake_echo_comment(sprintf(' use %s', $new)); } } if ($updated) { file_put_contents($file, $content); } } } } function _upgrade_1_0_view_yml($app_dir) { pake_echo_action('upgrade 1.0', 'upgrading view configuration'); $yml_files = pakeFinder::type('file')->name('*.yml')->in($app_dir); foreach ($yml_files as $yml_file) { $content = file_get_contents($yml_file); $deprecated = array( '/sf/js/prototype' => '%SF_PROTOTYPE_WEB_DIR%/js', '/sf/css/prototype' => '%SF_PROTOTYPE_WEB_DIR%/css', '/sf/js/sf_admin' => '%SF_ADMIN_WEB_DIR%/js', '/sf/css/sf_admin' => '%SF_ADMIN_WEB_DIR%/css', '/sf/images/sf_admin' => '%SF_ADMIN_WEB_DIR%/images', ); $seen = array(); $updated = false; foreach ($deprecated as $old => $new) { $count = 0; $content = str_replace($old, $new, $content, $count); if ($count) { $updated = true; } if ($count && !isset($seen[$old])) { $seen[$old] = true; pake_echo_comment(sprintf('%s is deprecated', $old)); pake_echo_comment(sprintf(' use %s', $new)); } } if ($updated) { file_put_contents($yml_file, $content); } } } function _upgrade_1_0_cache_yml($app_dir) { pake_echo_action('upgrade 1.0', 'upgrading cache configuration'); $yml_files = pakeFinder::type('files')->name('cache.yml')->in($app_dir); $seen = false; foreach ($yml_files as $yml_file) { $content = file_get_contents($yml_file); $count = 0; $updated = false; $content = preg_replace_callback('/type\:(\s*)(.+)$/m', '_upgrade_1_0_cache_yml_callback', $content, -1, $count); if ($count) { $updated = true; } if ($count && !$seen) { $seen = true; pake_echo_comment('"type" has been removed in cache.yml'); pake_echo_comment(' read the doc about "with_layout"'); } if ($updated) { file_put_contents($yml_file, $content); } } } function _upgrade_1_0_cache_yml_callback($match) { return 'with_layout:'.str_repeat(' ', max(1, strlen($match[1]) - 6)).(0 === strpos($match[2], 'page') ? 'true' : 'false'); } function _upgrade_1_0_deprecated_for_generator($app_dir) { pake_echo_action('upgrade 1.0', 'upgrading deprecated helpers in generator.yml'); $yml_files = pakeFinder::type('files')->name('generator.yml')->in($app_dir); $seen = array(); $deprecated_str = array( 'admin_input_upload_tag' => 'admin_input_file_tag', ); foreach ($yml_files as $yml_file) { $updated = false; foreach ($deprecated_str as $old => $new) { $content = file_get_contents($yml_file); $count = 0; $content = str_replace($old, $new, $content, $count); if ($count) { $updated = true; } if ($count && !isset($seen[$old])) { $seen[$old] = true; pake_echo_comment(sprintf('%s() has been removed', $old)); pake_echo_comment(sprintf(' use %s()', $new)); } } if ($updated) { file_put_contents($yml_file, $content); } } } function _upgrade_1_0_deprecated_for_actions($action_dirs) { pake_echo_action('upgrade 1.0', 'upgrading deprecated methods in actions'); $php_files = pakeFinder::type('file')->name('*.php')->in($action_dirs); foreach ($php_files as $php_file) { $content = file_get_contents($php_file); $deprecated = array( '$this->addHttpMeta' => '$this->getContext()->getResponse()->addHttpMeta', '$this->addMeta' => '$this->getContext()->getResponse()->addMeta', '$this->setTitle' => '$this->getContext()->getResponse()->setTitle', '$this->addStylesheet' => '$this->getContext()->getResponse()->addStylesheet', '$this->addJavascript' => '$this->getContext()->getResponse()->addJavascript', ); $seen = array(); $updated = false; foreach ($deprecated as $old => $new) { $count = 0; $content = str_replace($old, $new, $content, $count); if ($count) { $updated = true; } if ($count && !isset($seen[$old])) { $seen[$old] = true; pake_echo_comment(sprintf('%s has been removed', $old)); pake_echo_comment(sprintf(' use %s', $new)); } } if ($updated) { file_put_contents($php_file, $content); } } } function _upgrade_1_0_date_form_helpers($template_dirs) { pake_echo_action('upgrade 1.0', 'upgrading date form helpers'); $helpers = array( 'select_day_tag', 'select_month_tag', 'select_year_tag', 'select_date_tag', 'select_second_tag', 'select_minute_tag', 'select_hour_tag', 'select_ampm_tag', 'select_time_tag', 'select_datetime_tag', 'select_number_tag', 'select_timezone_tag', ); $regex = '/('.implode('|', $helpers).')/'; $php_files = pakeFinder::type('file')->name('*.php')->in($template_dirs); $seen = false; foreach ($php_files as $php_file) { $updated = false; $content = file_get_contents($php_file); if (preg_match($regex, $content) && false === strpos($content, 'DateForm')) { $content = "\n\n".$content; $updated = true; if (!$seen) { $seen = true; pake_echo_comment('date form helpers has been moved to the DateForm helper group'); pake_echo_comment(' add use_helper(\'DateForm\')'); } } if ($updated) { file_put_contents($php_file, $content); } } } function _upgrade_1_0_deprecated_for_templates($template_dirs) { pake_echo_action('upgrade 1.0', 'upgrading deprecated helpers'); $php_files = pakeFinder::type('file')->name('*.php')->in($template_dirs); $seen = array(); $deprecated_str = array( 'use_helpers' => 'use_helper', 'object_admin_input_upload_tag' => 'object_admin_input_file_tag', 'input_upload_tag' => 'input_file_tag', '$sf_last_module' => '$sf_context->getModuleName()', '$sf_last_action' => '$sf_context->getActionName()', '$sf_first_module' => '$sf_context->getActionStack()->getFirstEntry()->getModuleName()', '$sf_first_action' => '$sf_context->getActionStack()->getFirstEntry()->getActionName()', ); foreach ($php_files as $php_file) { $content = file_get_contents($php_file); $updated = false; $count = 0; foreach ($deprecated_str as $old => $new) { $content = str_replace($old, $new, $content, $count); if ($count) { $updated = true; } if ($count && !isset($seen[$old])) { $seen[$old] = true; pake_echo_comment(sprintf('%s has been removed', $old)); pake_echo_comment(sprintf(' use %s', $new)); } } if ($updated) { file_put_contents($php_file, $content); } } } function _upgrade_1_0_config_php($app_dir) { pake_echo_action('upgrade 1.0', 'upgrading config.php'); pake_copy(sfConfig::get('sf_symfony_data_dir').'/skeleton/app/app/config/config.php', $app_dir.DIRECTORY_SEPARATOR.sfConfig::get('sf_config_dir_name').DIRECTORY_SEPARATOR.'config.php'); } function _upgrade_1_0_filters_yml($app_dir) { pake_echo_action('upgrade 1.0', 'upgrading filters.yml'); $configFile = $app_dir.DIRECTORY_SEPARATOR.sfConfig::get('sf_config_dir_name').DIRECTORY_SEPARATOR.'filters.yml'; $content = file_get_contents($configFile); // default symfony filters $default = file_get_contents(sfConfig::get('sf_symfony_data_dir').'/skeleton/app/app/config/filters.yml'); $placeholder = '# generally, you will want to insert your own filters here'; // upgrade module filters.yml $seen = false; $yml_files = pakeFinder::type('file')->name('filters.yml')->in($app_dir.DIRECTORY_SEPARATOR.'modules'); foreach ($yml_files as $yml_file) { $module_content = file_get_contents($yml_file); if (false === strpos($module_content, 'rendering:')) { $lb = (strpos($module_content, "\r\n") !== false) ? "\r\n" : "\n"; $module_content = str_replace($placeholder, $placeholder.$lb.$content.$lb.$module_content, $default); file_put_contents($yml_file, $module_content); if (!$seen) { pake_echo_comment('filters.yml now contains core symfony filters'); } $seen = true; } } // upgrade app filters.yml if (false === strpos($content, 'rendering:')) { $lb = (strpos($content, "\r\n") !== false) ? "\r\n" : "\n"; $content = str_replace($placeholder, $placeholder.$lb.$content, $default); file_put_contents($configFile, $content); if (!$seen) { pake_echo_comment('filters.yml now contains core symfony filters'); } } // upgrade project filters.yml $configFile = sfConfig::get('sf_config_dir').DIRECTORY_SEPARATOR.'filters.yml'; if (is_readable($configFile)) { $content = file_get_contents($configFile); if (false === strpos($content, 'rendering:')) { $lb = (strpos($content, "\r\n") !== false) ? "\r\n" : "\n"; $content = str_replace($placeholder, $placeholder.$lb.$content, $default); file_put_contents($configFile, $content); if (!$seen) { pake_echo_comment('filters.yml now contains core symfony filters'); } } } } function _upgrade_1_0_main_config_php() { pake_echo_action('upgrade 1.0', 'upgrading main config.php'); $content = file_get_contents(sfConfig::get('sf_root_dir').'/config/config.php'); if (false === strpos($content, 'sf_symfony_lib_dir')) { pake_echo_comment('symfony lib and data dir are now configured in main config.php'); $lib_dir = sfConfig::get('sf_symfony_lib_dir'); $data_dir = sfConfig::get('sf_symfony_data_dir'); if (is_link('lib/symfony') && is_link('data/symfony')) { $config = <<name('*.php')->in(sfConfig::get('sf_lib_dir').'/model'); foreach ($php_files as $php_file) { $content = file_get_contents($php_file); $count1 = 0; $count2 = 0; $updated = false; $content = str_replace('require_once \'model', 'require_once \'lib/model', $content, $count1); $content = str_replace('include_once \'model', 'include_once \'lib/model', $content, $count2); if ($count1 || $count2) { $updated = true; } if (($count1 || $count2) && !$seen) { $seen = true; pake_echo_comment('model require must be lib/model/...'); pake_echo_comment(' instead of model/...'); } if ($updated) { file_put_contents($php_file, $content); } } } function _upgrade_1_0_schemas() { pake_echo_action('upgrade 1.0', 'upgrading schemas'); $seen = false; $xml_files = pakeFinder::type('file')->name('*schema.xml')->in(sfConfig::get('sf_config_dir')); foreach ($xml_files as $xml_file) { $content = file_get_contents($xml_file); if (preg_match('/]*package[^>]*>/', $content)) { continue; } $count = 0; $updated = false; $content = str_replace('