silverstripe-framework/dev/TaskRunner.php

142 lines
3.4 KiB
PHP
Raw Normal View History

<?php
/**
* @package framework
* @subpackage dev
*/
class TaskRunner extends Controller {
2014-08-15 08:53:05 +02:00
private static $url_handlers = array(
'' => 'index',
'$TaskName' => 'runTask'
);
2014-08-15 08:53:05 +02:00
private static $allowed_actions = array(
'index',
'runTask',
);
2014-08-15 08:53:05 +02:00
public function init() {
parent::init();
$isRunningTests = (class_exists('SapphireTest', false) && SapphireTest::is_running_test());
$canAccess = (
2014-08-15 08:53:05 +02:00
Director::isDev()
// We need to ensure that DevelopmentAdminTest can simulate permission failures when running
// "dev/tasks" from CLI.
|| (Director::is_cli() && !$isRunningTests)
|| Permission::check("ADMIN")
);
if(!$canAccess) return Security::permissionFailure($this);
}
2014-08-15 08:53:05 +02:00
public function index() {
$tasks = $this->getTasks();
// Web mode
if(!Director::is_cli()) {
$renderer = new DebugView();
$renderer->writeHeader();
$renderer->writeInfo("SilverStripe Development Tools: Tasks", Director::absoluteBaseURL());
$base = Director::absoluteBaseURL();
2014-08-15 08:53:05 +02:00
echo "<div class=\"options\">";
echo "<ul>";
foreach($tasks as $task) {
echo "<li><p>";
echo "<a href=\"{$base}dev/tasks/" . $task['segment'] . "\">" . $task['title'] . "</a><br />";
echo "<span class=\"description\">" . $task['description'] . "</span>";
echo "</p></li>\n";
}
echo "</ul></div>";
$renderer->writeFooter();
// CLI mode
} else {
echo "SILVERSTRIPE DEVELOPMENT TOOLS: Tasks\n--------------------------\n\n";
foreach($tasks as $task) {
echo " * $task[title]: sake dev/tasks/" . $task['segment'] . "\n";
}
}
}
2014-08-15 08:53:05 +02:00
/**
* Runs a BuildTask
* @param SS_HTTPRequest $request
*/
public function runTask($request) {
$name = $request->param('TaskName');
$tasks = $this->getTasks();
$title = function ($content) {
printf(Director::is_cli() ? "%s\n\n" : '<h1>%s</h1>', $content);
};
$message = function ($content) {
printf(Director::is_cli() ? "%s\n" : '<p>%s</p>', $content);
};
foreach ($tasks as $task) {
if ($task['segment'] == $name) {
$inst = Injector::inst()->create($task['class']); /** @var BuildTask $inst */
$title(sprintf('Running Task %s', $inst->getTitle()));
if (!$inst->isEnabled()) {
$message('The task is disabled');
return;
}
$inst->run($request);
return;
}
}
2014-08-13 07:29:12 +02:00
$message(sprintf('The build task "%s" could not be found', Convert::raw2xml($name)));
}
/**
* @return array Array of associative arrays for each task (Keys: 'class', 'title', 'description')
*/
protected function getTasks() {
$availableTasks = array();
2014-08-15 08:53:05 +02:00
$taskClasses = ClassInfo::subclassesFor('BuildTask');
// remove the base class
array_shift($taskClasses);
2014-08-15 08:53:05 +02:00
if($taskClasses) foreach($taskClasses as $class) {
if (!$this->taskEnabled($class)) continue;
2014-08-15 08:53:05 +02:00
$desc = (Director::is_cli())
? Convert::html2raw(singleton($class)->getDescription())
: singleton($class)->getDescription();
2014-08-15 08:53:05 +02:00
$availableTasks[] = array(
'class' => $class,
'title' => singleton($class)->getTitle(),
'segment' => str_replace('\\', '-', $class),
'description' => $desc,
);
}
2014-08-15 08:53:05 +02:00
return $availableTasks;
}
/**
* @param string $class
* @return boolean
*/
protected function taskEnabled($class) {
$reflectionClass = new ReflectionClass($class);
if ($reflectionClass->isAbstract()) {
return false;
} else if (!singleton($class)->isEnabled()) {
return false;
}
return true;
}
}