params['xml'])) { parent::startup(); } } /** * Main function Prints out the list of shells. * * @return void */ public function main() { if (empty($this->params['xml'])) { $this->out(__d('cake_console', "Current Paths:"), 2); $this->out(" -app: " . APP_DIR); $this->out(" -working: " . rtrim(APP, DS)); $this->out(" -root: " . rtrim(ROOT, DS)); $this->out(" -core: " . rtrim(CORE_PATH, DS)); $this->out(""); $this->out(__d('cake_console', "Changing Paths:"), 2); $this->out(__d('cake_console', "Your working path should be the same as your application path. To change your path use the '-app' param.")); $this->out(__d('cake_console', "Example: %s or %s", '-app relative/path/to/myapp', '-app /absolute/path/to/myapp'), 2); $this->out(__d('cake_console', "Available Shells:"), 2); } $shellList = $this->_getShellList(); if (empty($shellList)) { return; } if (empty($this->params['xml'])) { $this->_asText($shellList); } else { $this->_asXml($shellList); } } /** * Gets the shell command listing. * * @return array */ protected function _getShellList() { $skipFiles = array('AppShell'); $plugins = CakePlugin::loaded(); $shellList = array_fill_keys($plugins, null) + array('CORE' => null, 'app' => null); $corePath = App::core('Console/Command'); $shells = App::objects('file', $corePath[0]); $shells = array_diff($shells, $skipFiles); $this->_appendShells('CORE', $shells, $shellList); $appShells = App::objects('Console/Command', null, false); $appShells = array_diff($appShells, $shells, $skipFiles); $this->_appendShells('app', $appShells, $shellList); foreach ($plugins as $plugin) { $pluginShells = App::objects($plugin . '.Console/Command'); $this->_appendShells($plugin, $pluginShells, $shellList); } return array_filter($shellList); } /** * Scan the provided paths for shells, and append them into $shellList * * @param string $type * @param array $shells * @param array $shellList * @return void */ protected function _appendShells($type, $shells, &$shellList) { foreach ($shells as $shell) { $shellList[$type][] = Inflector::underscore(str_replace('Shell', '', $shell)); } } /** * Output text. * * @param array $shellList * @return void */ protected function _asText($shellList) { foreach ($shellList as $plugin => $commands) { sort($commands); $this->out(sprintf('[%s] %s', $plugin, implode(', ', $commands))); $this->out(); } $this->out(__d('cake_console', "To run an app or core command, type cake shell_name [args]")); $this->out(__d('cake_console', "To run a plugin command, type cake Plugin.shell_name [args]")); $this->out(__d('cake_console', "To get help on a specific command, type cake shell_name --help"), 2); } /** * Output as XML * * @param array $shellList * @return void */ protected function _asXml($shellList) { $plugins = CakePlugin::loaded(); $shells = new SimpleXmlElement(''); foreach ($shellList as $plugin => $commands) { foreach ($commands as $command) { $callable = $command; if (in_array($plugin, $plugins)) { $callable = Inflector::camelize($plugin) . '.' . $command; } $shell = $shells->addChild('shell'); $shell->addAttribute('name', $command); $shell->addAttribute('call_as', $callable); $shell->addAttribute('provider', $plugin); $shell->addAttribute('help', $callable . ' -h'); } } $this->stdout->outputAs(ConsoleOutput::RAW); $this->out($shells->saveXml()); } /** * get the option parser * * @return void */ public function getOptionParser() { $parser = parent::getOptionParser(); return $parser->description(__d('cake_console', 'Get the list of available shells for this CakePHP application.')) ->addOption('sort', array( 'help' => __d('cake_console', 'Does nothing (deprecated)'), 'boolean' => true )) ->addOption('xml', array( 'help' => __d('cake_console', 'Get the listing as XML.'), 'boolean' => true )); } }