$value) { if(($idx = strpos($key, 'TASKMAN_PROP_')) === 0) { $name = substr($key, strlen('TASKMAN_PROP_')); $props[$name] = get($name); } } return $props; } function task($name) { global $TASKMAN_CLOSURES; if(isset($TASKMAN_CLOSURES[$name])) throw new TaskmanException("Task '$name' is already defined"); $args = func_get_args(); $TASKMAN_CLOSURES[$name] = $args; } function get_tasks() : array { global $TASKMAN_TASKS; return $TASKMAN_TASKS; } function current_task() { global $TASKMAN_CURRENT_TASK; return $TASKMAN_CURRENT_TASK; } function run($task, array $args = array()) { if($task instanceof TaskmanTask) $task_obj = $task; else $task_obj = get_task($task); return $task_obj->run($args); } function run_many($tasks, $args = array()) { foreach($tasks as $task_spec) { if(is_array($task_spec)) run($task_spec[0], $task_spec[1]); else run($task_spec, $args); } } //the lower the level the more important the message: 0 - is the highest priority function log(int $level, $msg) { global $TASKMAN_LOG_LEVEL; if($TASKMAN_LOG_LEVEL < $level) return; $logger = $GLOBALS['TASKMAN_LOGGER']; call_user_func_array($logger, array($msg)); } //obsolete function _log(string $msg, int $level = 1) { log($level, $msg); } //TODO: obsolete function msg_dbg(string $msg) { log(2, $msg); } //TODO: obsolete function msg(string $msg) { log(1, $msg); } //TODO: obsolete function msg_sys(string $msg) { log(0, $msg); } function _(string $str) : string { if(strpos($str, '%') === false) return $str; $str = preg_replace_callback( '~%\(([^\)]+)\)%~', function($m) { return get($m[1]); }, $str ); return $str; } function main($argv = array(), $help_func = null, $proc_argv = true, $read_env_vars = true) { $GLOBALS['TASKMAN_START_TIME'] = microtime(true); if($help_func) $GLOBALS['TASKMAN_HELP_FUNC'] = $help_func; if($read_env_vars) internal\_read_env_vars(); if($proc_argv) internal\_process_argv($argv); $GLOBALS['TASKMAN_SCRIPT'] = array_shift($argv); internal\_collect_tasks(); $always_tasks = array(); $default_task = null; foreach(get_tasks() as $task_obj) { if($task_obj->hasProp('always')) array_unshift($always_tasks, $task_obj); if($task_obj->hasProp('default')) { if($default_task) throw new TaskmanException("Assigned default task '" . $default_task->getName() . "' conflicts with '" . $task_obj->getName() . "'"); else $default_task = $task_obj; } } foreach($always_tasks as $always_task) run($always_task); if(sizeof($argv) > 0) { $task_str = array_shift($argv); $tasks = internal\_parse_taskstr($task_str); if(count($tasks) == 1 && !internal\_isset_task($tasks[0])) { $pattern = $tasks[0]; if($pattern[0] == '~') { $pattern = substr($pattern, 1, strlen($pattern) - 1); $is_similar = true; } elseif(substr($pattern, -1, 1) == '~') { $pattern = substr($pattern, 0, strlen($pattern) - 1); $is_similar = true; } else $is_similar = false; $hints = internal\_get_hints($pattern); if($is_similar && count($hints) == 1) $tasks = $hints; else { printf("ERROR! Task %s not found\n", $tasks[0]); if($hints) { printf("Similar tasks:\n"); foreach($hints as $hint) printf(" %s\n", $hint); } exit(1); } } run_many($tasks, $argv); } else if($default_task) run($default_task, $argv); msg_sys("***** All done (".round(microtime(true)-$GLOBALS['TASKMAN_START_TIME'],2)." sec.) *****\n"); } function usage($script_name = "") { internal\_default_usage($script_name); }