2007-05-14 12:24:40 +00:00
< ? php
/* SVN FILE: $Id$ */
/**
* The Project Task handles creating the base application
*
* Long description for file
*
* PHP versions 4 and 5
*
* CakePHP ( tm ) : Rapid Development Framework < http :// www . cakephp . org />
* Copyright 2005 - 2007 , Cake Software Foundation , Inc .
* 1785 E . Sahara Avenue , Suite 490 - 204
* Las Vegas , Nevada 89104
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice .
*
* @ filesource
* @ copyright Copyright 2005 - 2007 , Cake Software Foundation , Inc .
* @ link http :// www . cakefoundation . org / projects / info / cakephp CakePHP ( tm ) Project
* @ package cake
* @ subpackage cake . cake . scripts . bake
* @ since CakePHP ( tm ) v 1.2
* @ version $Revision $
* @ modifiedby $LastChangedBy $
* @ lastmodified $Date $
* @ license http :// www . opensource . org / licenses / mit - license . php The MIT License
*/
2007-06-20 06:15:35 +00:00
if ( ! class_exists ( 'File' )) {
2007-05-14 12:24:40 +00:00
uses ( 'file' );
}
2007-06-04 07:21:17 +00:00
/**
* Task class for creating new project apps and plugins
*
* @ package cake
* @ subpackage cake . cake . console . libs . tasks
*/
2007-05-14 12:24:40 +00:00
class ProjectTask extends Shell {
2007-06-03 23:56:33 +00:00
/**
* Override
*
2007-10-22 05:52:20 +00:00
* @ access public
2007-06-03 23:56:33 +00:00
*/
2007-10-22 05:52:20 +00:00
function initialize () {
}
2007-07-18 01:54:47 +00:00
/**
* Override
*
2007-10-22 05:52:20 +00:00
* @ access public
2007-07-18 01:54:47 +00:00
*/
2007-10-22 05:52:20 +00:00
function startup () {
}
2007-05-14 12:24:40 +00:00
/**
* Checks that given project path does not already exist , and
* finds the app directory in it . Then it calls __buildDirLayout () with that information .
*
2007-10-22 05:52:20 +00:00
* @ param string $project Project path
* @ access public
2007-05-14 12:24:40 +00:00
*/
function execute ( $project = null ) {
2007-06-20 06:15:35 +00:00
if ( $project === null ) {
if ( isset ( $this -> args [ 0 ])) {
2007-05-27 16:13:42 +00:00
$project = $this -> args [ 0 ];
2007-05-14 12:24:40 +00:00
$this -> Dispatch -> shiftArgs ();
}
}
2007-09-11 19:03:34 +00:00
if ( $project ) {
if ( $project { 0 } == '/' || $project { 0 } == DS ) {
$this -> Dispatch -> parseParams ( array ( '-working' , $project ));
} else {
$this -> Dispatch -> parseParams ( array ( '-app' , $project ));
}
}
$project = $this -> params [ 'working' ];
2007-07-25 04:38:28 +00:00
if ( empty ( $this -> params [ 'skel' ])) {
2007-07-18 01:54:47 +00:00
$this -> params [ 'skel' ] = '' ;
if ( is_dir ( CAKE_CORE_INCLUDE_PATH . DS . 'cake' . DS . 'console' . DS . 'libs' . DS . 'templates' . DS . 'skel' ) === true ) {
$this -> params [ 'skel' ] = CAKE_CORE_INCLUDE_PATH . DS . 'cake' . DS . 'console' . DS . 'libs' . DS . 'templates' . DS . 'skel' ;
}
}
2007-05-27 16:13:42 +00:00
2007-09-11 19:03:34 +00:00
if ( $project ) {
2007-05-15 03:41:50 +00:00
$response = false ;
2007-07-08 19:33:20 +00:00
while ( $response == false && is_dir ( $project ) === true && config ( 'core' ) === true ) {
2007-05-14 12:24:40 +00:00
$response = $this -> in ( 'A project already exists in this location: ' . $project . ' Overwrite?' , array ( 'y' , 'n' ), 'n' );
2007-06-20 06:15:35 +00:00
if ( low ( $response ) === 'n' ) {
2007-10-20 05:55:37 +00:00
$response = false ;
while ( ! $response ) {
$response = $this -> in ( " What is the full path for this app including the app directory name? \n Example: " . $this -> params [ 'root' ] . DS . " myapp \n [Q]uit " , null , 'Q' );
if ( strtoupper ( $response ) === 'Q' ) {
$this -> out ( 'Bake Aborted' );
exit ();
}
$this -> params [ 'working' ] = null ;
$this -> params [ 'app' ] = null ;
$this -> execute ( $response );
exit ();
}
2007-05-14 12:24:40 +00:00
}
}
}
2007-05-27 16:13:42 +00:00
2007-05-14 12:24:40 +00:00
while ( ! $project ) {
2007-07-18 01:54:47 +00:00
$project = $this -> in ( " What is the full path for this app including the app directory name? \n Example: " . $this -> params [ 'root' ] . DS . " myapp " , null , $this -> params [ 'root' ] . DS . 'myapp' );
2007-05-14 12:24:40 +00:00
$this -> execute ( $project );
exit ();
}
2007-07-18 01:54:47 +00:00
if ( ! is_dir ( $this -> params [ 'root' ])) {
2007-05-27 16:13:42 +00:00
$this -> err ( 'The directory path you supplied was not found. Please try again.' );
2007-05-14 12:24:40 +00:00
}
2007-07-08 19:33:20 +00:00
$this -> __buildDirLayout ( $project );
2007-05-14 12:24:40 +00:00
exit ();
}
/**
* Looks for a skeleton template of a Cake application ,
* and if not found asks the user for a path . When there is a path
* this method will make a deep copy of the skeleton to the project directory .
* A default home page will be added , and the tmp file storage will be chmod ' ed to 0777.
*
2007-10-22 05:52:20 +00:00
* @ param string $path Project path
* @ access private
2007-05-14 12:24:40 +00:00
*/
function __buildDirLayout ( $path ) {
2007-07-18 01:54:47 +00:00
$skel = $this -> params [ 'skel' ];
while ( $skel == '' ) {
$skel = $this -> in ( " What is the path to the app directory you wish to copy? \n Example: " . APP , null , ROOT . DS . 'myapp' . DS );
if ( $skel == '' ) {
$this -> out ( 'The directory path you supplied was empty. Please try again.' );
} else {
while ( is_dir ( $skel ) === false ) {
$skel = $this -> in ( 'Directory path does not exist please choose another:' );
2007-05-14 12:24:40 +00:00
}
}
}
2007-07-18 01:54:47 +00:00
2007-05-14 12:24:40 +00:00
$app = basename ( $path );
2007-07-18 01:54:47 +00:00
$this -> out ( 'Bake Project' );
2007-05-14 12:24:40 +00:00
$this -> out ( " Skel Directory: $skel " );
2007-05-27 16:13:42 +00:00
$this -> out ( " Will be copied to: { $path } " );
2007-05-14 12:24:40 +00:00
$this -> hr ();
$looksGood = $this -> in ( 'Look okay?' , array ( 'y' , 'n' , 'q' ), 'y' );
if ( low ( $looksGood ) == 'y' || low ( $looksGood ) == 'yes' ) {
$verboseOuptut = $this -> in ( 'Do you want verbose output?' , array ( 'y' , 'n' ), 'n' );
$verbose = false ;
if ( low ( $verboseOuptut ) == 'y' || low ( $verboseOuptut ) == 'yes' ) {
$verbose = true ;
}
$Folder = new Folder ( $skel );
2007-06-20 06:15:35 +00:00
if ( $Folder -> copy ( $path )) {
2007-05-14 12:24:40 +00:00
$path = $Folder -> slashTerm ( $path );
$this -> hr ();
2007-09-18 04:16:04 +00:00
$this -> out ( sprintf ( __ ( " Created: %s in %s " , true ), $app , $path ));
2007-05-14 12:24:40 +00:00
$this -> hr ();
2007-10-22 05:52:20 +00:00
if ( $this -> createHome ( $path )) {
2007-05-15 03:41:50 +00:00
$this -> out ( 'Welcome page created' );
} else {
$this -> out ( 'The Welcome page was NOT created' );
}
2007-05-14 12:24:40 +00:00
2007-10-16 09:05:25 +00:00
if ( $this -> securitySalt ( $path ) === true ) {
$this -> out ( 'Random hash key created for \'Security.salt\'' );
2007-05-14 12:24:40 +00:00
} else {
2007-10-16 09:05:25 +00:00
$this -> err ( 'Unable to generate random hash for \'Security.salt\', please change this yourself in ' . CONFIGS . 'core.php' );
2007-05-14 12:24:40 +00:00
}
2007-05-27 16:13:42 +00:00
2007-06-03 23:56:33 +00:00
$corePath = $this -> corePath ( $path );
2007-06-20 07:51:52 +00:00
if ( $corePath === true ) {
2007-05-14 12:24:40 +00:00
$this -> out ( 'CAKE_CORE_INCLUDE_PATH set to ' . CAKE_CORE_INCLUDE_PATH );
2007-06-20 07:51:52 +00:00
} elseif ( $corePath === false ) {
2007-05-14 12:24:40 +00:00
$this -> err ( 'Unable to to set CAKE_CORE_INCLUDE_PATH, please change this yourself in ' . $path . 'webroot' . DS . 'index.php' );
}
2007-10-14 19:18:24 +00:00
if ( ! $Folder -> chmod ( $path . 'tmp' , 0777 )) {
2007-09-27 11:16:26 +00:00
$this -> err ( 'Could not set permissions on ' . $path . DS . 'tmp' );
2007-05-14 12:24:40 +00:00
$this -> out ( 'You must manually check that these directories can be wrote to by the server' );
}
} else {
$this -> err ( " ' " . $app . " ' could not be created properly " );
}
2007-06-20 06:15:35 +00:00
if ( $verbose ) {
foreach ( $Folder -> messages () as $message ) {
2007-05-14 12:24:40 +00:00
$this -> out ( $message );
}
}
return ;
} elseif ( low ( $looksGood ) == 'q' || low ( $looksGood ) == 'quit' ) {
$this -> out ( 'Bake Aborted.' );
} else {
2007-10-20 05:55:37 +00:00
$this -> params [ 'working' ] = null ;
$this -> params [ 'app' ] = null ;
2007-05-14 12:24:40 +00:00
$this -> execute ( false );
}
}
/**
* Writes a file with a default home page to the project .
*
2007-10-22 05:52:20 +00:00
* @ param string $dir Path to project
* @ return bool Success
* @ access public
2007-05-14 12:24:40 +00:00
*/
2007-10-22 05:52:20 +00:00
function createHome ( $dir ) {
2007-05-14 12:24:40 +00:00
$path = $dir . 'views' . DS . 'pages' . DS ;
include ( CAKE_CORE_INCLUDE_PATH . DS . 'cake' . DS . 'console' . DS . 'libs' . DS . 'templates' . DS . 'views' . DS . 'home.ctp' );
2007-05-15 03:51:40 +00:00
return $this -> createFile ( $path . 'home.ctp' , $output );
2007-05-14 12:24:40 +00:00
}
/**
2007-10-22 05:52:20 +00:00
* Generates and writes 'Security.salt'
2007-05-14 12:24:40 +00:00
*
2007-10-22 05:52:20 +00:00
* @ param string $path Project path
* @ return bool Success
* @ access public
2007-05-14 12:24:40 +00:00
*/
2007-10-16 09:05:25 +00:00
function securitySalt ( $path ) {
2007-05-14 12:24:40 +00:00
$File =& new File ( $path . 'config' . DS . 'core.php' );
$contents = $File -> read ();
2007-10-16 09:05:25 +00:00
if ( preg_match ( '/([\\t\\x20]*Configure::write\\(\\\'Security.salt\\\',[\\t\\x20\'A-z0-9]*\\);)/' , $contents , $match )) {
2007-05-14 12:24:40 +00:00
uses ( 'Security' );
$string = Security :: generateAuthKey ();
2007-10-16 09:05:25 +00:00
$result = str_replace ( $match [ 0 ], " \t " . 'Configure::write(\'Security.salt\', \'' . $string . '\');' , $contents );
2007-06-20 07:51:52 +00:00
if ( $File -> write ( $result )) {
2007-05-14 12:24:40 +00:00
return true ;
} else {
return false ;
}
} else {
return false ;
}
}
/**
2007-10-22 05:52:20 +00:00
* Generates and writes CAKE_CORE_INCLUDE_PATH
2007-05-14 12:24:40 +00:00
*
2007-10-22 05:52:20 +00:00
* @ param string $path Project path
* @ return bool Success
* @ access public
2007-05-14 12:24:40 +00:00
*/
2007-06-20 07:51:52 +00:00
function corePath ( $path ) {
2007-06-20 06:15:35 +00:00
if ( dirname ( $path ) !== CAKE_CORE_INCLUDE_PATH ) {
2007-05-14 12:24:40 +00:00
$File =& new File ( $path . 'webroot' . DS . 'index.php' );
$contents = $File -> read ();
if ( preg_match ( '/([\\t\\x20]*define\\(\\\'CAKE_CORE_INCLUDE_PATH\\\',[\\t\\x20\'A-z0-9]*\\);)/' , $contents , $match )) {
$result = str_replace ( $match [ 0 ], " \t \t define('CAKE_CORE_INCLUDE_PATH', ' " . CAKE_CORE_INCLUDE_PATH . " '); " , $contents );
2007-06-20 07:51:52 +00:00
if ( $File -> write ( $result )) {
2007-05-14 12:24:40 +00:00
return true ;
} else {
return false ;
}
} else {
return false ;
}
}
}
2007-06-03 23:56:33 +00:00
/**
2007-08-25 15:29:44 +00:00
* Enables Configure :: read ( 'Routing.admin' ) in / app / config / core . php
2007-06-03 23:56:33 +00:00
*
2007-10-22 05:52:20 +00:00
* @ param string $name Name to use as admin routing
* @ return bool Success
* @ access public
2007-06-21 14:38:46 +00:00
*/
2007-06-20 07:51:52 +00:00
function cakeAdmin ( $name ) {
2007-06-21 14:38:46 +00:00
$File =& new File ( CONFIGS . 'core.php' );
2007-06-10 06:20:39 +00:00
$contents = $File -> read ();
2007-08-25 15:38:26 +00:00
if ( preg_match ( '%([/\\t\\x20]*Configure::write\(\'Routing.admin\',[\\t\\x20\'a-z]*\\);)%' , $contents , $match )) {
2007-10-16 09:05:25 +00:00
$result = str_replace ( $match [ 0 ], " \t " . 'Configure::write(\'Routing.admin\', \'' . $name . '\');' , $contents );
2007-06-20 07:51:52 +00:00
if ( $File -> write ( $result )) {
2007-08-25 15:29:44 +00:00
Configure :: write ( 'Routing.admin' , $name );
2007-06-03 23:56:33 +00:00
return true ;
} else {
return false ;
}
} else {
return false ;
}
}
2007-05-14 12:24:40 +00:00
}
?>