2010-12-05 05:48:38 +00:00
< ? php
/**
* A shell class to help developers upgrade applications to CakePHP 2.0
*
* @ package cake . console / shells
*/
class UpgradeShell extends Shell {
protected $_files = array ();
protected $_paths = array ();
2010-12-11 15:13:21 +00:00
2011-01-02 03:13:45 +00:00
/**
* Shell startup , prints info message about dry run .
*
* @ return void
*/
function startup () {
parent :: startup ();
if ( $this -> params [ 'dry-run' ]) {
$this -> out ( '<warning>Dry-run mode enabled!</warning>' , 1 , Shell :: QUIET );
}
}
2010-12-11 15:13:21 +00:00
/**
* Update helpers .
*
* - Converts helpers usage to new format .
*
* @ return void
*/
function helpers () {
2011-01-02 03:13:45 +00:00
$this -> _paths = array_diff ( App :: path ( 'views' ), App :: core ( 'views' ));
2010-12-12 04:13:21 +00:00
if ( ! empty ( $this -> params [ 'plugin' ])) {
$this -> _paths = array ( App :: pluginPath ( $this -> params [ 'plugin' ]) . 'views' . DS );
}
2010-12-11 15:13:21 +00:00
$patterns = array ();
2010-12-12 04:19:07 +00:00
$helpers = App :: objects ( 'helper' );
$plugins = App :: objects ( 'plugin' );
$pluginHelpers = array ();
foreach ( $plugins as $plugin ) {
$pluginHelpers = array_merge (
$pluginHelpers ,
App :: objects ( 'helper' , App :: pluginPath ( $plugin ) . DS . 'views' . DS . 'helpers' . DS , false )
);
}
$helpers = array_merge ( $pluginHelpers , $helpers );
foreach ( $helpers as $helper ) {
2010-12-11 15:13:21 +00:00
$oldHelper = strtolower ( substr ( $helper , 0 , 1 )) . substr ( $helper , 1 );
$patterns [] = array (
" \$ { $oldHelper } to \$ this-> { $helper } " ,
" / \\ \$ { $oldHelper } ->/ " ,
" \\ \$ this-> { $helper } -> "
);
}
2011-05-01 17:32:09 +00:00
2010-12-11 15:13:59 +00:00
$this -> _filesRegexpUpdate ( $patterns );
2010-12-11 15:13:21 +00:00
}
2010-12-05 05:48:38 +00:00
/**
* Update i18n .
*
* - Removes extra true param .
2010-12-12 04:13:21 +00:00
* - Add the echo to __ * () calls that didn ' t need them before .
2010-12-05 05:48:38 +00:00
*
* @ return void
*/
function i18n () {
2010-12-11 15:13:59 +00:00
$this -> _paths = array (
2010-12-12 04:13:21 +00:00
APP
2010-12-11 15:13:59 +00:00
);
2010-12-12 04:13:21 +00:00
if ( ! empty ( $this -> params [ 'plugin' ])) {
$this -> _paths = array ( App :: pluginPath ( $this -> params [ 'plugin' ]));
}
2010-12-11 15:13:21 +00:00
$patterns = array (
array (
'<?php __*(*) to <?php echo __*(*)' ,
'/<\?php\s*(__[a-z]*\(.*?\))/' ,
'<?php echo \1'
),
array (
'<?php __*(*, true) to <?php echo __*()' ,
'/<\?php\s*(__[a-z]*\(.*?)(,\s*true)(\))/' ,
'<?php echo \1\3'
),
array ( '__*(*, true) to __*(*)' , '/(__[a-z]*\(.*?)(,\s*true)(\))/' , '\1\3' )
);
2010-12-11 15:13:59 +00:00
$this -> _filesRegexpUpdate ( $patterns );
}
2010-12-12 04:38:23 +00:00
/**
* Upgrade the removed basics functions .
*
* - a ( * ) -> array ( * )
* - e ( * ) -> echo *
* - ife ( * , * , * ) -> empty ( * ) ? * : *
* - a ( * ) -> array ( * )
* - r ( * , * , * ) -> str_replace ( * , * , * )
* - up ( * ) -> strtoupper ( * )
* - low ( * , * , * ) -> strtolower ( * )
* - getMicrotime () -> microtime ( true )
*
* @ return void
*/
public function basics () {
$this -> _paths = array (
APP
);
if ( ! empty ( $this -> params [ 'plugin' ])) {
$this -> _paths = array ( App :: pluginPath ( $this -> params [ 'plugin' ]));
}
$patterns = array (
array (
'a(*) -> array(*)' ,
2010-12-19 14:06:45 +00:00
'/\ba\((.*)\)/' ,
2010-12-12 04:38:23 +00:00
'array(\1)'
),
array (
'e(*) -> echo *' ,
'/\be\((.*)\)/' ,
'echo \1'
),
array (
'ife(*, *, *) -> empty(*) ? * : *' ,
'/ife\((.*), (.*), (.*)\)/' ,
'empty(\1) ? \2 : \3'
),
array (
'r(*, *, *) -> str_replace(*, *, *)' ,
'/\br\(/' ,
'str_replace('
),
array (
'up(*) -> strtoupper(*)' ,
'/\bup\(/' ,
'strtoupper('
),
array (
'low(*) -> strtolower(*)' ,
'/\blow\(/' ,
'strtolower('
),
array (
'getMicrotime() -> microtime(true)' ,
'/getMicrotime\(\)/' ,
'microtime(true)'
),
);
2010-12-12 04:46:39 +00:00
$this -> _filesRegexpUpdate ( $patterns );
}
2010-12-12 04:38:23 +00:00
2010-12-12 04:46:39 +00:00
/**
* Update the properties moved to CakeRequest .
*
* @ return void
*/
public function request () {
2011-01-02 03:13:45 +00:00
$core = App :: core ();
$views = array_diff ( App :: path ( 'views' ), App :: core ( 'views' ));
$controllers = array_diff ( App :: path ( 'controllers' ), App :: core ( 'controllers' ), array ( APP ));
$components = array_diff ( App :: path ( 'components' ), App :: core ( 'components' ));
$this -> _paths = array_merge ( $views , $controllers , $components );
2010-12-12 04:46:39 +00:00
if ( ! empty ( $this -> params [ 'plugin' ])) {
2011-01-02 03:13:45 +00:00
$pluginPath = App :: pluginPath ( $this -> params [ 'plugin' ]);
$this -> _paths = array (
$pluginPath . 'controllers' . DS ,
$pluginPath . 'controllers' . DS . 'components' . DS ,
$pluginPath . 'views' . DS ,
);
2010-12-12 04:46:39 +00:00
}
$patterns = array (
array (
'$this->data -> $this->request->data' ,
2011-01-02 03:58:40 +00:00
'/(\$this->data\b(?!\())/' ,
2010-12-12 04:46:39 +00:00
'$this->request->data'
),
array (
'$this->params -> $this->request->params' ,
2011-01-02 03:58:40 +00:00
'/(\$this->params\b(?!\())/' ,
2010-12-12 04:46:39 +00:00
'$this->request->params'
),
array (
'$this->webroot -> $this->request->webroot' ,
2011-01-02 03:58:40 +00:00
'/(\$this->webroot\b(?!\())/' ,
2010-12-12 04:46:39 +00:00
'$this->request->webroot'
),
array (
'$this->base -> $this->request->base' ,
2011-01-02 03:58:40 +00:00
'/(\$this->base\b(?!\())/' ,
2010-12-12 04:46:39 +00:00
'$this->request->base'
),
array (
'$this->here -> $this->request->here' ,
2011-01-02 03:58:40 +00:00
'/(\$this->here\b(?!\())/' ,
2010-12-12 04:46:39 +00:00
'$this->request->here'
),
array (
'$this->action -> $this->request->action' ,
2011-01-02 03:58:40 +00:00
'/(\$this->action\b(?!\())/' ,
2010-12-12 04:46:39 +00:00
'$this->request->action'
),
);
2010-12-12 04:38:23 +00:00
$this -> _filesRegexpUpdate ( $patterns );
}
2010-12-19 14:06:45 +00:00
/**
* Update Configure :: read () calls with no params .
*
* @ return void
*/
public function configure () {
$this -> _paths = array (
APP
);
if ( ! empty ( $this -> params [ 'plugin' ])) {
$this -> _paths = array ( App :: pluginPath ( $this -> params [ 'plugin' ]));
}
$patterns = array (
array (
" Configure::read() -> Configure::read('debug') " ,
'/Configure::read\(\)/' ,
'Configure::read(\'debug\')'
),
);
$this -> _filesRegexpUpdate ( $patterns );
}
2010-12-12 04:13:21 +00:00
/**
* Updates files based on regular expressions .
*
* @ param array $patterns Array of search and replacement patterns .
* @ return void
*/
2010-12-11 15:13:59 +00:00
protected function _filesRegexpUpdate ( $patterns ) {
2010-12-12 04:13:21 +00:00
$this -> _findFiles ( $this -> params [ 'ext' ]);
2010-12-05 05:48:38 +00:00
foreach ( $this -> _files as $file ) {
$this -> out ( 'Updating ' . $file . '...' , 1 , Shell :: VERBOSE );
2010-12-11 15:13:21 +00:00
$this -> _updateFile ( $file , $patterns );
2010-12-05 05:48:38 +00:00
}
}
2010-12-12 04:13:21 +00:00
/**
* Searches the paths and finds files based on extension .
*
2011-05-01 17:32:09 +00:00
* @ param string $extensions
2010-12-12 04:13:21 +00:00
* @ return void
*/
protected function _findFiles ( $extensions = '' ) {
2010-12-05 05:48:38 +00:00
foreach ( $this -> _paths as $path ) {
2011-05-01 17:32:09 +00:00
if ( ! is_dir ( $path )) {
continue ;
}
2010-12-12 04:13:21 +00:00
$files = array ();
$Iterator = new RegexIterator (
new RecursiveIteratorIterator ( new RecursiveDirectoryIterator ( $path )),
'/^.+\.(' . $extensions . ')$/i' ,
RegexIterator :: MATCH
);
foreach ( $Iterator as $file ) {
if ( $file -> isFile ()) {
$files [] = $file -> getPathname ();
2010-12-05 05:48:38 +00:00
}
}
$this -> _files = array_merge ( $this -> _files , $files );
}
}
/**
* Update a single file .
*
2010-12-12 04:13:21 +00:00
* @ param string $file The file to update
* @ param array $patterns The replacement patterns to run .
2010-12-05 05:48:38 +00:00
* @ return void
*/
2010-12-11 15:13:21 +00:00
protected function _updateFile ( $file , $patterns ) {
2010-12-05 05:48:38 +00:00
$contents = file_get_contents ( $file );
2011-05-01 17:32:09 +00:00
2010-12-05 05:48:38 +00:00
foreach ( $patterns as $pattern ) {
$this -> out ( ' * Updating ' . $pattern [ 0 ], 1 , Shell :: VERBOSE );
$contents = preg_replace ( $pattern [ 1 ], $pattern [ 2 ], $contents );
}
$this -> out ( 'Done updating ' . $file , 1 );
2011-01-02 03:13:45 +00:00
if ( ! $this -> params [ 'dry-run' ]) {
file_put_contents ( $file , $contents );
}
2010-12-05 05:48:38 +00:00
}
/**
* get the option parser
*
2010-12-12 04:13:21 +00:00
* @ return ConsoleOptionParser
2010-12-05 05:48:38 +00:00
*/
function getOptionParser () {
2010-12-11 15:14:54 +00:00
$subcommandParser = array (
'options' => array (
2010-12-12 04:13:21 +00:00
'plugin' => array (
'short' => 'p' ,
'help' => __ ( 'The plugin to update. Only the specified plugin will be updated.'
)),
'ext' => array (
'short' => 'e' ,
'help' => __ ( 'The extension(s) to search. A pipe delimited list, or a preg_match compatible subpattern' ),
'default' => 'php|ctp|thtml|inc|tpl'
),
2011-01-02 03:13:45 +00:00
'dry-run' => array (
'short' => 'd' ,
'help' => __ ( 'Dry run the update, no files will actually be modified.' ),
'boolean' => true
)
2010-12-11 15:14:54 +00:00
)
);
2010-12-05 05:48:38 +00:00
return parent :: getOptionParser ()
2010-12-11 16:00:09 +00:00
-> description ( " A shell to help automate upgrading from CakePHP 1.3 to 2.0. \n Be sure to have a backup of your application before running these commands. " )
2010-12-05 05:48:38 +00:00
-> addSubcommand ( 'i18n' , array (
'help' => 'Update the i18n translation method calls.' ,
2010-12-11 15:14:54 +00:00
'parser' => $subcommandParser
2010-12-11 15:13:21 +00:00
))
-> addSubcommand ( 'helpers' , array (
'help' => 'Update calls to helpers.' ,
2010-12-11 15:14:54 +00:00
'parser' => $subcommandParser
2010-12-12 04:38:23 +00:00
))
-> addSubcommand ( 'basics' , array (
'help' => 'Update removed basics functions to PHP native functions.' ,
'parser' => $subcommandParser
2010-12-12 04:46:39 +00:00
))
-> addSubcommand ( 'request' , array (
'help' => 'Update removed request access, and replace with $this->request.' ,
'parser' => $subcommandParser
2010-12-19 14:06:45 +00:00
))
-> addSubcommand ( 'configure' , array (
'help' => " Update Configure::read() to Configure::read('debug') " ,
'parser' => $subcommandParser
2010-12-05 05:48:38 +00:00
));
}
2011-05-01 17:32:09 +00:00
}