/** * Run the CLI task, which will check which command is specified and run it. */ public static function run() { CLI::taskName("help"); CLI::taskRun(array('self', 'help')); global $argv; $args = $argv; $cliname = array_shift($args); $taskName = array_shift($args); while ($taskName[0] == '-') { $taskName = array_shift($args); } if (!$taskName) { echo self::error("Specify a task from the list below.") . "\n\n"; self::help(null, null); return; } $taskData = null; foreach (self::$tasks as $name => $data) { if (strcasecmp($name, $taskName) === 0) { $taskData = $data; break; } } if (!$taskData) { echo self::error("Command not found: '{$taskName}'") . "\n\n"; self::help(null, null); return; } G::LoadThirdParty('pear/Console', 'Getopt'); $short = "h" . $taskData['opt']['short']; $long = array_merge(array("help"), $taskData['opt']['long']); $getopt = Console_GetOpt::getopt2($args, $short, $long); if (!is_array($getopt)) { echo self::error("Invalid options (" . $getopt->getMessage() . ")") . "\n\n"; self::help($taskName); return; } list($options, $arguments) = $getopt; foreach ($taskData['opt']['descriptions'] as $optName => $optDescription) { $short = str_replace(":", "", $optDescription['short']); $long = str_replace("=", "", $optDescription['long']); $validOpts[$short] = $optName; $validOpts[$long] = $optName; } $taskOpts = array(); try { foreach ($options as $opt) { list($optName, $optArg) = $opt; if ($optName === "h" || $optName === "--help") { self::help($taskName); return; } if (strpos($optName, '--') === 0) { $optName = substr($optName, 2); } if (!array_key_exists($optName, $validOpts)) { throw new Exception("option not found: {$optName}"); } if (array_key_exists($validOpts[$optName], $taskOpts)) { throw new Exception("'{$optName}' specified more then once"); } $taskOpts[$validOpts[$optName]] = $optArg; } } catch (Exception $e) { echo self::error("Invalid options: " . $e->getMessage()) . "\n\n"; self::help($taskName); return; } try { call_user_func($taskData['function'], $arguments, $taskOpts); } catch (Exception $e) { echo self::error("\n Error executing '{$taskName}':\n\n {$e->getMessage()}\n") . "\n"; } }