248 lines
4.9 KiB
PHP
248 lines
4.9 KiB
PHP
<?php
|
|
namespace taskman;
|
|
use Exception;
|
|
|
|
function get_task(string $task) : TaskmanTask
|
|
{
|
|
global $TASKMAN_TASKS;
|
|
global $TASKMAN_TASK_ALIASES;
|
|
|
|
if(!is_scalar($task))
|
|
throw new TaskmanException("Bad task name");
|
|
|
|
if(isset($TASKMAN_TASKS[$task]))
|
|
return $TASKMAN_TASKS[$task];
|
|
|
|
if(isset($TASKMAN_TASK_ALIASES[$task]))
|
|
return $TASKMAN_TASK_ALIASES[$task];
|
|
|
|
throw new TaskmanException("Task with name/alias '{$task}' does not exist");
|
|
}
|
|
|
|
function get($name)
|
|
{
|
|
if(!isset($GLOBALS['TASKMAN_PROP_' . $name]))
|
|
throw new TaskmanException("Property '$name' is not set");
|
|
internal\_resolve_callable_prop($name);
|
|
return $GLOBALS['TASKMAN_PROP_' . $name];
|
|
}
|
|
|
|
function getor($name, $def)
|
|
{
|
|
if(!isset($GLOBALS['TASKMAN_PROP_' . $name]))
|
|
return $def;
|
|
internal\_resolve_callable_prop($name);
|
|
return $GLOBALS['TASKMAN_PROP_' . $name];
|
|
}
|
|
|
|
function set($name, $value)
|
|
{
|
|
$GLOBALS['TASKMAN_PROP_' . $name] = $value;
|
|
}
|
|
|
|
function setor($name, $value)
|
|
{
|
|
if(!isset($GLOBALS['TASKMAN_PROP_' . $name]))
|
|
$GLOBALS['TASKMAN_PROP_' . $name] = $value;
|
|
}
|
|
|
|
function is($name)
|
|
{
|
|
return isset($GLOBALS['TASKMAN_PROP_' . $name]);
|
|
}
|
|
|
|
function del($name)
|
|
{
|
|
unset($GLOBALS['TASKMAN_PROP_' . $name]);
|
|
}
|
|
|
|
function props()
|
|
{
|
|
$props = array();
|
|
foreach($GLOBALS as $key => $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;
|
|
|
|
$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 = "<taskman-script>")
|
|
{
|
|
internal\_default_usage($script_name);
|
|
}
|
|
|