* @copyright 2004-2005 Fabien Potencier * @license see the LICENSE file included in the distribution * @version SVN: $Id: pakeFunction.php 3263 2007-01-13 14:20:52Z fabien $ */ require_once dirname(__FILE__).'/pakeException.class.php'; require_once dirname(__FILE__).'/pakeYaml.class.php'; require_once dirname(__FILE__).'/pakeGetopt.class.php'; require_once dirname(__FILE__).'/pakeFinder.class.php'; require_once dirname(__FILE__).'/pakeTask.class.php'; require_once dirname(__FILE__).'/pakeFileTask.class.php'; require_once dirname(__FILE__).'/pakeColor.class.php'; require_once dirname(__FILE__).'/pakeApp.class.php'; function pake_import($name, $import_default_tasks = true) { $class_name = 'pake'.ucfirst(strtolower($name)).'Task'; if (!class_exists($class_name)) { // plugin available? $plugin_path = ''; foreach (pakeApp::get_plugin_dirs() as $dir) { if (file_exists($dir.DIRECTORY_SEPARATOR.$class_name.'.class.php')) { $plugin_path = $dir.DIRECTORY_SEPARATOR.$class_name.'.class.php'; break; } } if ($plugin_path) { require_once $plugin_path; } else { throw new pakeException(sprintf('Plugin "%s" does not exist.', $name)); } } if ($import_default_tasks && is_callable($class_name, 'import_default_tasks')) { call_user_func(array($class_name, 'import_default_tasks')); } } function pake_task($name) { $args = func_get_args(); array_shift($args); pakeTask::define_task($name, $args); return $name; } function pake_alias($alias, $name) { pakeTask::define_alias($alias, $name); return $alias; } function pake_desc($comment) { pakeTask::define_comment($comment); } function pake_properties($property_file) { $file = $property_file; if (!pakeFinder::isPathAbsolute($file)) { $file = getcwd().DIRECTORY_SEPARATOR.$property_file; } if (file_exists($file)) { pakeApp::get_instance()->set_properties(parse_ini_file($file, true)); } else { throw new pakeException('Properties file does not exist.'); } } function pake_file($name) { $args = func_get_args(); array_shift($args); pakeFileTask::define_task($name, $args); return $name; } function pake_mkdirs($path, $mode = 0777) { if (is_dir($path)) { return true; } pake_echo_action('dir+', $path); return @mkdir($path, $mode, true); } /* override => boolean */ function pake_copy($origin_file, $target_file, $options = array()) { if (!array_key_exists('override', $options)) { $options['override'] = false; } // we create target_dir if needed if (!is_dir(dirname($target_file))) { pake_mkdirs(dirname($target_file)); } $most_recent = false; if (file_exists($target_file)) { $stat_target = stat($target_file); $stat_origin = stat($origin_file); $most_recent = ($stat_origin['mtime'] > $stat_target['mtime']) ? true : false; } if ($options['override'] || !file_exists($target_file) || $most_recent) { pake_echo_action('file+', $target_file); copy($origin_file, $target_file); } } function pake_rename($origin, $target, $options = array()) { // we check that target does not exist if (is_readable($target)) { throw new pakeException(sprintf('Cannot rename because the target "%" already exist.', $target)); } pake_echo_action('rename', $origin.' > '.$target); rename($origin, $target); } function pake_mirror($arg, $origin_dir, $target_dir, $options = array()) { $files = pakeApp::get_files_from_argument($arg, $origin_dir, true); foreach ($files as $file) { if (is_dir($origin_dir.DIRECTORY_SEPARATOR.$file)) { pake_mkdirs($target_dir.DIRECTORY_SEPARATOR.$file); } else if (is_file($origin_dir.DIRECTORY_SEPARATOR.$file)) { pake_copy($origin_dir.DIRECTORY_SEPARATOR.$file, $target_dir.DIRECTORY_SEPARATOR.$file, $options); } else if (is_link($origin_dir.DIRECTORY_SEPARATOR.$file)) { pake_symlink($origin_dir.DIRECTORY_SEPARATOR.$file, $target_dir.DIRECTORY_SEPARATOR.$file); } else { throw new pakeException(sprintf('Unable to determine "%s" type', $file)); } } } function pake_remove($arg, $target_dir) { $files = array_reverse(pakeApp::get_files_from_argument($arg, $target_dir)); foreach ($files as $file) { if (is_dir($file) && !is_link($file)) { pake_echo_action('dir-', $file); rmdir($file); } else { pake_echo_action(is_link($file) ? 'link-' : 'file-', $file); unlink($file); } } } function pake_touch($arg, $target_dir) { $files = pakeApp::get_files_from_argument($arg, $target_dir); foreach ($files as $file) { pake_echo_action('file+', $file); touch($file); } } function pake_replace_tokens($arg, $target_dir, $begin_token, $end_token, $tokens) { $files = pakeApp::get_files_from_argument($arg, $target_dir, true); foreach ($files as $file) { $replaced = false; $content = file_get_contents($target_dir.DIRECTORY_SEPARATOR.$file); foreach ($tokens as $key => $value) { $content = str_replace($begin_token.$key.$end_token, $value, $content, $count); if ($count) $replaced = true; } pake_echo_action('tokens', $target_dir.DIRECTORY_SEPARATOR.$file); file_put_contents($target_dir.DIRECTORY_SEPARATOR.$file, $content); } } function pake_symlink($origin_dir, $target_dir, $copy_on_windows = false) { if (!function_exists('symlink') && $copy_on_windows) { $finder = pakeFinder::type('any')->ignore_version_control(); pake_mirror($finder, $origin_dir, $target_dir); return; } $ok = false; if (is_link($target_dir)) { if (readlink($target_dir) != $origin_dir) { unlink($target_dir); } else { $ok = true; } } if (!$ok) { pake_echo_action('link+', $target_dir); symlink($origin_dir, $target_dir); } } function pake_chmod($arg, $target_dir, $mode, $umask = 0000) { $current_umask = umask(); umask($umask); $files = pakeApp::get_files_from_argument($arg, $target_dir, true); foreach ($files as $file) { pake_echo_action(sprintf('chmod %o', $mode), $target_dir.DIRECTORY_SEPARATOR.$file); chmod($target_dir.DIRECTORY_SEPARATOR.$file, $mode); } umask($current_umask); } function pake_sh($cmd) { $verbose = pakeApp::get_instance()->get_verbose(); pake_echo_action('exec ', $cmd); ob_start(); passthru($cmd.' 2>&1', $return); $content = ob_get_contents(); ob_end_clean(); if ($return > 0) { throw new pakeException(sprintf('Problem executing command %s', $verbose ? "\n".$content : '')); } return $content; } function pake_strip_php_comments($arg) { /* T_ML_COMMENT does not exist in PHP 5. * The following three lines define it in order to * preserve backwards compatibility. * * The next two lines define the PHP 5-only T_DOC_COMMENT, * which we will mask as T_ML_COMMENT for PHP 4. */ if (!defined('T_ML_COMMENT')) { define('T_ML_COMMENT', T_COMMENT); } else { if (!defined('T_DOC_COMMENT')) define('T_DOC_COMMENT', T_ML_COMMENT); } $files = pakeApp::get_files_from_argument($arg); foreach ($files as $file) { if (!is_file($file)) continue; $source = file_get_contents($file); $output = ''; $tokens = token_get_all($source); foreach ($tokens as $token) { if (is_string($token)) { // simple 1-character token $output .= $token; } else { // token array list($id, $text) = $token; switch ($id) { case T_COMMENT: case T_ML_COMMENT: // we've defined this case T_DOC_COMMENT: // and this // no action on comments break; default: // anything else -> output "as is" $output .= $text; break; } } } file_put_contents($file, $output); } } function pake_format_action($section, $text, $size = null) { if (pakeApp::get_instance()->get_verbose()) { $width = 9 + strlen(pakeColor::colorize('', 'INFO')); return sprintf('>> %-'.$width.'s %s', pakeColor::colorize($section, 'INFO'), pakeApp::excerpt($text, $size))."\n"; } } function pake_echo_action($section, $text) { echo pake_format_action($section, $text); } function pake_excerpt($text) { if (pakeApp::get_instance()->get_verbose()) { echo pakeApp::excerpt($text)."\n"; } } function pake_echo($text) { if (pakeApp::get_instance()->get_verbose()) { echo $text."\n"; } } function pake_echo_comment($text) { if (pakeApp::get_instance()->get_verbose()) { echo sprintf(pakeColor::colorize(' # %s', 'COMMENT'), $text)."\n"; } } // register our default exception handler function pake_exception_default_handler($exception) { $e = new pakeException(); $e->render($exception); exit(1); } set_exception_handler('pake_exception_default_handler'); // fix php behavior if using cgi php // from http://www.sitepoint.com/article/php-command-line-1/3 if (false !== strpos(PHP_SAPI, 'cgi')) { // handle output buffering @ob_end_flush(); ob_implicit_flush(true); // PHP ini settings set_time_limit(0); ini_set('track_errors', true); ini_set('html_errors', false); ini_set('magic_quotes_runtime', false); // define stream constants define('STDIN', fopen('php://stdin', 'r')); define('STDOUT', fopen('php://stdout', 'w')); define('STDERR', fopen('php://stderr', 'w')); // change directory if (isset($_SERVER['PWD'])) { chdir($_SERVER['PWD']); } // close the streams on script termination register_shutdown_function(create_function('', 'fclose(STDIN); fclose(STDOUT); fclose(STDERR); return true;')); }