diff --git a/PHPCI/Application.php b/PHPCI/Application.php
index 8dcdf76d..9f2cc86e 100644
--- a/PHPCI/Application.php
+++ b/PHPCI/Application.php
@@ -11,9 +11,14 @@ namespace PHPCI;
use b8;
use b8\Exception\HttpException;
+use b8\Http\Request;
use b8\Http\Response;
use b8\Http\Response\RedirectResponse;
+use b8\Http\Router;
use b8\View;
+use PHPCI\Store\UserStore;
+use PHPCI\Store\ProjectStore;
+use Symfony\Component\DependencyInjection\Container;
/**
* PHPCI Front Controller
@@ -26,6 +31,46 @@ class Application extends b8\Application
*/
protected $controller;
+ /**
+ * @var \PHPCI\Store\UserStore
+ */
+ protected $userStore;
+
+ /**
+ * @var \PHPCI\Store\ProjectStore
+ */
+ protected $projectStore;
+
+ /**
+ * Create the PHPCI web application.
+ *
+ * @param Config $config
+ * @param Request $request
+ * @param Response $response
+ * @param UserStore $userStore
+ * @param ProjectStore $projectStore
+ * @param Container $container
+ */
+ public function __construct(
+ Config $config,
+ Request $request,
+ Response $response,
+ UserStore $userStore,
+ ProjectStore $projectStore,
+ Container $container
+ ) {
+ $this->config = $config;
+ $this->response = $response;
+ $this->request = $request;
+ $this->userStore = $userStore;
+ $this->projectStore = $projectStore;
+ $this->container = $container;
+
+ $this->router = new Router($this, $this->request, $this->config);
+
+ $this->init();
+ }
+
/**
* Initialise PHPCI - Handles session verification, routing, etc.
*/
@@ -38,7 +83,7 @@ class Application extends b8\Application
// Inlined as a closure to fix "using $this when not in object context" on 5.3
$validateSession = function () {
if (!empty($_SESSION['phpci_user_id'])) {
- $user = b8\Store\Factory::getStore('User')->getByPrimaryKey($_SESSION['phpci_user_id']);
+ $user = $this->userStore->getByPrimaryKey($_SESSION['phpci_user_id']);
if ($user) {
$_SESSION['phpci_user'] = $user;
@@ -106,8 +151,7 @@ class Application extends b8\Application
if ($this->response->hasLayout() && $this->controller->layout) {
$this->setLayoutVariables($this->controller->layout);
-
- $this->controller->layout->content = $this->response->getContent();
+ $this->controller->layout->content = $this->response->getContent();
$this->response->setContent($this->controller->layout->render());
}
@@ -115,29 +159,49 @@ class Application extends b8\Application
}
/**
- * Loads a particular controller, and injects our layout view into it.
- * @param $class
- * @return mixed
+ * @return \PHPCI\Controller
*/
- protected function loadController($class)
+ public function getController()
{
- $controller = parent::loadController($class);
- $controller->layout = new View('layout');
- $controller->layout->title = 'PHPCI';
- $controller->layout->breadcrumb = array();
+ if (empty($this->controller)) {
+ $this->controller = $this->container->get($this->getControllerId($this->route));
+ }
- return $controller;
+ return $this->controller;
+ }
+
+ /**
+ * Check if the specified controller exist.
+ *
+ * @param array $route
+ *
+ * @return boolean
+ */
+ public function controllerExists($route)
+ {
+ return $this->container->has($this->getControllerId($route));
+ }
+
+ /**
+ * Create controller service Id based on specified route.
+ *
+ * @param array $route
+ *
+ * @return string
+ */
+ protected function getControllerId($route)
+ {
+ return 'application.controller.' . strtolower($route['controller']);
}
/**
* Injects variables into the layout before rendering it.
+ *
* @param View $layout
*/
protected function setLayoutVariables(View &$layout)
{
- /** @var \PHPCI\Store\ProjectStore $projectStore */
- $projectStore = b8\Store\Factory::getStore('Project');
- $layout->projects = $projectStore->getWhere(
+ $layout->projects = $this->projectStore->getWhere(
array('archived' => (int)isset($_GET['archived'])),
50,
0,
@@ -148,17 +212,16 @@ class Application extends b8\Application
/**
* Check whether we should skip auth (because it is disabled)
+ *
* @return bool
*/
protected function shouldSkipAuth()
{
- $config = b8\Config::getInstance();
- $state = (bool)$config->get('phpci.authentication_settings.state', false);
- $userId = $config->get('phpci.authentication_settings.user_id', 0);
+ $state = (bool) $this->config->get('phpci.authentication_settings.state', false);
+ $userId = $this->config->get('phpci.authentication_settings.user_id', 0);
if (false !== $state && 0 != (int)$userId) {
- $user = b8\Store\Factory::getStore('User')
- ->getByPrimaryKey($userId);
+ $user = $this->userStore->getByPrimaryKey($userId);
if ($user) {
$_SESSION['phpci_user'] = $user;
diff --git a/PHPCI/BuildFactory.php b/PHPCI/BuildFactory.php
index ecc37c43..280bfe6b 100644
--- a/PHPCI/BuildFactory.php
+++ b/PHPCI/BuildFactory.php
@@ -11,6 +11,7 @@ namespace PHPCI;
use b8\Store\Factory;
use PHPCI\Model\Build;
+use PHPCI\Store\BuildStore;
/**
* PHPCI Build Factory - Takes in a generic "Build" and returns a type-specific build model.
@@ -18,20 +19,30 @@ use PHPCI\Model\Build;
*/
class BuildFactory
{
+ /**
+ * @var BuildStore
+ */
+ protected $buildStore;
+
+ public function __construct(BuildStore $buildStore)
+ {
+ $this->buildStore = $buildStore;
+ }
+
/**
* @param $buildId
* @return Build
* @throws \Exception
*/
- public static function getBuildById($buildId)
+ public function getBuildById($buildId)
{
- $build = Factory::getStore('Build')->getById($buildId);
+ $build = $this->buildStore->getById($buildId);
if (empty($build)) {
throw new \Exception('Build ID ' . $buildId . ' does not exist.');
}
- return self::getBuild($build);
+ return $this->getBuild($build);
}
/**
@@ -39,7 +50,7 @@ class BuildFactory
* @param Build $base The build from which to get a more specific build type.
* @return Build
*/
- public static function getBuild(Build $base)
+ public function getBuild(Build $base)
{
switch($base->getProject()->getType())
{
diff --git a/PHPCI/Builder.php b/PHPCI/Builder.php
index 39e8ca41..930777c5 100644
--- a/PHPCI/Builder.php
+++ b/PHPCI/Builder.php
@@ -99,6 +99,7 @@ class Builder implements LoggerAwareInterface
/**
* Set up the builder.
+ *
* @param \PHPCI\Model\Build $build
* @param LoggerInterface $logger
*/
@@ -130,6 +131,7 @@ class Builder implements LoggerAwareInterface
/**
* Set the config array, as read from phpci.yml
+ *
* @param array|null $config
* @throws \Exception
*/
@@ -144,6 +146,7 @@ class Builder implements LoggerAwareInterface
/**
* Access a variable from the phpci.yml file.
+ *
* @param string
* @return mixed
*/
@@ -160,6 +163,7 @@ class Builder implements LoggerAwareInterface
/**
* Access a variable from the config.yml
+ *
* @param $key
* @return mixed
*/
@@ -259,6 +263,7 @@ class Builder implements LoggerAwareInterface
/**
* Find a binary required by a plugin.
+ *
* @param string $binary
* @param bool $quiet
*
@@ -272,6 +277,7 @@ class Builder implements LoggerAwareInterface
/**
* Replace every occurrence of the interpolation vars in the given string
* Example: "This is build %PHPCI_BUILD%" => "This is build 182"
+ *
* @param string $input
* @return string
*/
@@ -328,6 +334,7 @@ class Builder implements LoggerAwareInterface
/**
* Write to the build log.
+ *
* @param $message
* @param string $level
* @param array $context
@@ -339,6 +346,7 @@ class Builder implements LoggerAwareInterface
/**
* Add a success-coloured message to the log.
+ *
* @param string
*/
public function logSuccess($message)
@@ -348,6 +356,7 @@ class Builder implements LoggerAwareInterface
/**
* Add a failure-coloured message to the log.
+ *
* @param string $message
* @param \Exception $exception The exception that caused the error.
*/
@@ -359,6 +368,7 @@ class Builder implements LoggerAwareInterface
* Returns a configured instance of the plugin factory.
*
* @param Build $build
+ *
* @return PluginFactory
*/
private function buildPluginFactory(Build $build)
diff --git a/PHPCI/Command/CreateAdminCommand.php b/PHPCI/Command/CreateAdminCommand.php
index 265f03b4..a6488834 100644
--- a/PHPCI/Command/CreateAdminCommand.php
+++ b/PHPCI/Command/CreateAdminCommand.php
@@ -11,7 +11,6 @@ namespace PHPCI\Command;
use PHPCI\Service\UserService;
use PHPCI\Helper\Lang;
-use PHPCI\Store\UserStore;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
@@ -25,18 +24,18 @@ use Symfony\Component\Console\Output\OutputInterface;
class CreateAdminCommand extends Command
{
/**
- * @var UserStore
+ * @var UserService
*/
- protected $userStore;
+ protected $userService;
/**
- * @param UserStore $userStore
+ * @param UserService $userService
*/
- public function __construct(UserStore $userStore)
+ public function __construct(UserService $userService)
{
parent::__construct();
- $this->userStore = $userStore;
+ $this->userService = $userService;
}
protected function configure()
@@ -53,8 +52,6 @@ class CreateAdminCommand extends Command
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
- $userService = new UserService($this->userStore);
-
/** @var $dialog \Symfony\Component\Console\Helper\DialogHelper */
$dialog = $this->getHelperSet()->get('dialog');
@@ -72,7 +69,7 @@ class CreateAdminCommand extends Command
$adminPass = $dialog->askHiddenResponse($output, Lang::get('enter_password'));
try {
- $userService->createUser($adminName, $adminEmail, $adminPass, true);
+ $this->userService->createUser($adminName, $adminEmail, $adminPass, true);
$output->writeln(Lang::get('user_created'));
} catch (\Exception $e) {
$output->writeln(sprintf('%s', Lang::get('failed_to_create')));
diff --git a/PHPCI/Command/DaemonCommand.php b/PHPCI/Command/DaemonCommand.php
index cb303eff..8bf26de2 100644
--- a/PHPCI/Command/DaemonCommand.php
+++ b/PHPCI/Command/DaemonCommand.php
@@ -48,11 +48,12 @@ class DaemonCommand extends Command
*/
protected $processControl;
- public function __construct(Logger $logger, ProcessControlInterface $processControl = null, $name = null)
+ public function __construct(Logger $logger, ProcessControlInterface $processControl)
{
- parent::__construct($name);
+ parent::__construct();
+
$this->logger = $logger;
- $this->processControl = $processControl ?: Factory::getInstance();
+ $this->processControl = $processControl;
}
protected function configure()
diff --git a/PHPCI/Command/DaemoniseCommand.php b/PHPCI/Command/DaemoniseCommand.php
index eadd334e..c9e97295 100644
--- a/PHPCI/Command/DaemoniseCommand.php
+++ b/PHPCI/Command/DaemoniseCommand.php
@@ -47,9 +47,9 @@ class DaemoniseCommand extends Command
* @param \Monolog\Logger $logger
* @param string $name
*/
- public function __construct(Logger $logger, $name = null)
+ public function __construct(Logger $logger)
{
- parent::__construct($name);
+ parent::__construct();
$this->logger = $logger;
}
diff --git a/PHPCI/Command/PollCommand.php b/PHPCI/Command/PollCommand.php
index a8729515..e930adff 100644
--- a/PHPCI/Command/PollCommand.php
+++ b/PHPCI/Command/PollCommand.php
@@ -9,15 +9,16 @@
namespace PHPCI\Command;
-use b8\Store\Factory;
use b8\HttpClient;
use Monolog\Logger;
use PHPCI\Helper\Lang;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
-use Symfony\Component\Yaml\Parser;
+use PHPCI\Config;
use PHPCI\Model\Build;
+use PHPCI\Store\BuildStore;
+use PHPCI\Store\ProjectStore;
/**
* Run console command - Poll github for latest commit id
@@ -28,14 +29,39 @@ use PHPCI\Model\Build;
class PollCommand extends Command
{
/**
- * @var \Monolog\Logger
+ * @var Config
+ */
+ protected $config;
+
+ /**
+ * @var Logger
*/
protected $logger;
- public function __construct(Logger $logger, $name = null)
+ /**
+ * @var BuildStore
+ */
+ protected $buildStore;
+
+ /**
+ * @var ProjectStore
+ */
+ protected $projectStore;
+
+ /**
+ * @var HttpClient
+ */
+ protected $githubClient;
+
+ public function __construct(Config $config, Logger $logger, BuildStore $buildStore, ProjectStore $projectStore, HttpClient $githubClient)
{
- parent::__construct($name);
+ parent::__construct();
+
+ $this->config = $config;
$this->logger = $logger;
+ $this->buildStore = $buildStore;
+ $this->projectStore = $projectStore;
+ $this->githubClient = $githubClient;
}
protected function configure()
@@ -50,27 +76,19 @@ class PollCommand extends Command
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
- $parser = new Parser();
- $yaml = file_get_contents(APPLICATION_PATH . 'PHPCI/config.yml');
- $this->settings = $parser->parse($yaml);
-
- $token = $this->settings['phpci']['github']['token'];
+ $token = $this->config->get('phpci.github.token');
if (!$token) {
$this->logger->error(Lang::get('no_token'));
return;
}
- $buildStore = Factory::getStore('Build');
-
$this->logger->addInfo(Lang::get('finding_projects'));
- $projectStore = Factory::getStore('Project');
- $result = $projectStore->getWhere();
+ $result = $this->projectStore->getWhere();
$this->logger->addInfo(Lang::get('found_n_projects', count($result['items'])));
foreach ($result['items'] as $project) {
- $http = new HttpClient('https://api.github.com');
- $commits = $http->get('/repos/' . $project->getReference() . '/commits', array('access_token' => $token));
+ $commits = $this->githubClient->get('/repos/' . $project->getReference() . '/commits', array('access_token' => $token));
$last_commit = $commits['body'][0]['sha'];
$last_committer = $commits['body'][0]['commit']['committer']['email'];
@@ -89,14 +107,14 @@ class PollCommand extends Command
$build->setStatus(Build::STATUS_NEW);
$build->setBranch($project->getBranch());
$build->setCreated(new \DateTime());
- $build->setCommitMessage($message);
+ $build->setCommitMessage($message);
if (!empty($last_committer)) {
$build->setCommitterEmail($last_committer);
}
- $buildStore->save($build);
+ $this->buildStore->save($build);
$project->setLastCommit($last_commit);
- $projectStore->save($project);
+ $this->projectStore->save($project);
}
}
diff --git a/PHPCI/Command/RebuildCommand.php b/PHPCI/Command/RebuildCommand.php
index 4c24b359..fc9ef0ab 100644
--- a/PHPCI/Command/RebuildCommand.php
+++ b/PHPCI/Command/RebuildCommand.php
@@ -12,6 +12,7 @@ namespace PHPCI\Command;
use b8\Store\Factory;
use Monolog\Logger;
use PHPCI\Service\BuildService;
+use PHPCI\Store\BuildStore;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\ArgvInput;
use Symfony\Component\Console\Input\InputInterface;
@@ -46,13 +47,28 @@ class RebuildCommand extends Command
protected $sleep;
/**
- * @param \Monolog\Logger $logger
- * @param string $name
+ * @param BuildStore
*/
- public function __construct(Logger $logger, $name = null)
+ protected $buildStore;
+
+ /**
+ * @param BuildService
+ */
+ protected $buildService;
+
+ /**
+ * @param RunCommand
+ */
+ protected $runCommand;
+
+ public function __construct(Logger $logger, BuildStore $buildStore, BuildService $buildService, RunCommand $runCommand)
{
- parent::__construct($name);
+ parent::__construct();
+
$this->logger = $logger;
+ $this->buildStore = $buildStore;
+ $this->buildService = $buildService;
+ $this->runCommand = $runCommand;
}
protected function configure()
@@ -67,17 +83,12 @@ class RebuildCommand extends Command
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
- $runner = new RunCommand($this->logger);
- $runner->setMaxBuilds(1);
- $runner->setDaemon(false);
+ $this->runCommand->setMaxBuilds(1);
+ $this->runCommand->setDaemon(false);
- /** @var \PHPCI\Store\BuildStore $store */
- $store = Factory::getStore('Build');
- $service = new BuildService($store);
-
- $builds = $store->getLatestBuilds(null, 1);
+ $builds = $this->buildStore->getLatestBuilds(null, 1);
$lastBuild = array_shift($builds);
- $service->createDuplicateBuild($lastBuild);
+ $this->buildService->createDuplicateBuild($lastBuild);
$runner->run(new ArgvInput(array()), $output);
}
diff --git a/PHPCI/Command/RunCommand.php b/PHPCI/Command/RunCommand.php
index c2c352e6..8d86e86e 100644
--- a/PHPCI/Command/RunCommand.php
+++ b/PHPCI/Command/RunCommand.php
@@ -41,6 +41,11 @@ class RunCommand extends Command
*/
protected $logger;
+ /**
+ * @var BuildFactory
+ */
+ protected $buildFactory;
+
/**
* @var int
*/
@@ -52,12 +57,14 @@ class RunCommand extends Command
protected $isFromDaemon = false;
/**
- * @param \Monolog\Logger $logger
- * @param string $name
+ * @param BuildFactory $buildFactory
+ * @param Logger $logger
*/
- public function __construct(Logger $logger, $name = null)
+ public function __construct(BuildFactory $buildFactory, Logger $logger)
{
- parent::__construct($name);
+ parent::__construct();
+
+ $this->buildFactory = $buildFactory;
$this->logger = $logger;
}
@@ -95,7 +102,7 @@ class RunCommand extends Command
while (count($result['items'])) {
$build = array_shift($result['items']);
- $build = BuildFactory::getBuild($build);
+ $build = $this->buildFactory->getBuild($build);
// Skip build (for now) if there's already a build running in that project:
if (!$this->isFromDaemon && in_array($build->getProjectId(), $running)) {
@@ -156,7 +163,7 @@ class RunCommand extends Command
foreach ($running['items'] as $build) {
/** @var \PHPCI\Model\Build $build */
- $build = BuildFactory::getBuild($build);
+ $build = $this->buildFactory->getBuild($build);
$now = time();
$start = $build->getStarted()->getTimestamp();
diff --git a/PHPCI/Command/UpdateCommand.php b/PHPCI/Command/UpdateCommand.php
index 13e31f79..492ffeff 100644
--- a/PHPCI/Command/UpdateCommand.php
+++ b/PHPCI/Command/UpdateCommand.php
@@ -9,7 +9,7 @@
namespace PHPCI\Command;
-use b8\Config;
+use PHPCI\Config;
use Monolog\Logger;
use PHPCI\Helper\Lang;
use Symfony\Component\Console\Command\Command;
@@ -29,10 +29,17 @@ class UpdateCommand extends Command
*/
protected $logger;
- public function __construct(Logger $logger, $name = null)
+ /**
+ * @var Config
+ */
+ protected $config;
+
+ public function __construct(Logger $logger, Config $config)
{
- parent::__construct($name);
+ parent::__construct();
+
$this->logger = $logger;
+ $this->config = $config;
}
protected function configure()
@@ -60,8 +67,7 @@ class UpdateCommand extends Command
protected function verifyInstalled(OutputInterface $output)
{
- $config = Config::getInstance();
- $phpciUrl = $config->get('phpci.url');
+ $phpciUrl = $this->config->get('phpci.url');
return !empty($phpciUrl);
}
diff --git a/PHPCI/Controller.php b/PHPCI/Controller.php
index 68b1c845..29eab80f 100644
--- a/PHPCI/Controller.php
+++ b/PHPCI/Controller.php
@@ -9,7 +9,6 @@
namespace PHPCI;
-use b8\Config;
use b8\Exception\HttpException\ForbiddenException;
use b8\Http\Request;
use b8\Http\Response;
@@ -53,6 +52,10 @@ class Controller extends \b8\Controller
{
parent::__construct($config, $request, $response);
+ $this->layout = new View('layout');
+ $this->layout->title = 'PHPCI';
+ $this->layout->breadcrumb = array();
+
$class = explode('\\', get_class($this));
$this->className = substr(array_pop($class), 0, -10);
$this->setControllerView();
diff --git a/PHPCI/Controller/BuildController.php b/PHPCI/Controller/BuildController.php
index e4660ba7..9ad8d793 100644
--- a/PHPCI/Controller/BuildController.php
+++ b/PHPCI/Controller/BuildController.php
@@ -12,11 +12,15 @@ namespace PHPCI\Controller;
use b8;
use b8\Exception\HttpException\NotFoundException;
use b8\Http\Response\JsonResponse;
+use b8\Http\Request;
+use b8\Http\Response;
+use PHPCI\Config;
use PHPCI\BuildFactory;
use PHPCI\Helper\AnsiConverter;
use PHPCI\Helper\Lang;
use PHPCI\Model\Build;
use PHPCI\Model\Project;
+use PHPCI\Store\BuildStore;
use PHPCI\Service\BuildService;
/**
@@ -28,22 +32,42 @@ use PHPCI\Service\BuildService;
class BuildController extends \PHPCI\Controller
{
/**
- * @var \PHPCI\Store\BuildStore
+ * @var BuildStore
*/
protected $buildStore;
/**
- * @var \PHPCI\Service\BuildService
+ * @var BuildService
*/
protected $buildService;
/**
- * Initialise the controller, set up stores and services.
+ * @var BuildFactory
*/
- public function init()
- {
- $this->buildStore = b8\Store\Factory::getStore('Build');
- $this->buildService = new BuildService($this->buildStore);
+ protected $buildFactory;
+
+ /**
+ * Create the Build controller
+ *
+ * @param Config $config
+ * @param Request $request
+ * @param Response $response
+ * @param BuildStore $buildStore
+ * @param BuildService $buildService
+ */
+ public function __construct(
+ Config $config,
+ Request $request,
+ Response $response,
+ BuildStore $buildStore,
+ BuildService $buildService,
+ BuildFactory $buildFactory
+ ) {
+ parent::__construct($config, $request, $response);
+
+ $this->buildStore = $buildStore;
+ $this->buildService = $buildService;
+ $this->buildFactory = $buildFactory;
}
/**
@@ -52,7 +76,7 @@ class BuildController extends \PHPCI\Controller
public function view($buildId)
{
try {
- $build = BuildFactory::getBuildById($buildId);
+ $build = $this->buildFactory->getBuildById($buildId);
} catch (\Exception $ex) {
$build = null;
}
@@ -110,7 +134,7 @@ class BuildController extends \PHPCI\Controller
public function data($buildId)
{
$response = new JsonResponse();
- $build = BuildFactory::getBuildById($buildId);
+ $build = $this->buildFactory->getBuildById($buildId);
if (!$build) {
$response->setResponseCode(404);
@@ -127,7 +151,7 @@ class BuildController extends \PHPCI\Controller
*/
public function meta($buildId)
{
- $build = BuildFactory::getBuildById($buildId);
+ $build = $this->buildFactory->getBuildById($buildId);
$key = $this->getParam('key', null);
$numBuilds = $this->getParam('num_builds', 1);
$data = null;
@@ -161,7 +185,7 @@ class BuildController extends \PHPCI\Controller
*/
public function rebuild($buildId)
{
- $copy = BuildFactory::getBuildById($buildId);
+ $copy = $this->buildFactory->getBuildById($buildId);
if (empty($copy)) {
throw new NotFoundException(Lang::get('build_x_not_found', $buildId));
@@ -181,7 +205,7 @@ class BuildController extends \PHPCI\Controller
{
$this->requireAdmin();
- $build = BuildFactory::getBuildById($buildId);
+ $build = $this->buildFactory->getBuildById($buildId);
if (empty($build)) {
throw new NotFoundException(Lang::get('build_x_not_found', $buildId));
@@ -214,6 +238,7 @@ class BuildController extends \PHPCI\Controller
$response = new JsonResponse();
$response->setContent($rtn);
+
return $response;
}
diff --git a/PHPCI/Controller/BuildStatusController.php b/PHPCI/Controller/BuildStatusController.php
index 0090e85f..d2ffcf63 100644
--- a/PHPCI/Controller/BuildStatusController.php
+++ b/PHPCI/Controller/BuildStatusController.php
@@ -11,11 +11,20 @@ namespace PHPCI\Controller;
use b8;
use b8\Exception\HttpException\NotFoundException;
+use b8\Exception\HttpException\NotAuthorizedException;
use b8\Store;
+use b8\HttpClient;
+use b8\Http\Request;
+use b8\Http\Response;
+use Exception;
+use PHPCI\Config;
use PHPCI\BuildFactory;
+use PHPCI\Helper\Lang;
use PHPCI\Model\Project;
use PHPCI\Model\Build;
use PHPCI\Service\BuildStatusService;
+use PHPCI\Store\BuildStore;
+use PHPCI\Store\ProjectStore;
/**
* Build Status Controller - Allows external access to build status information / images.
@@ -25,69 +34,73 @@ use PHPCI\Service\BuildStatusService;
*/
class BuildStatusController extends \PHPCI\Controller
{
- /* @var \PHPCI\Store\ProjectStore */
- protected $projectStore;
- /* @var \PHPCI\Store\BuildStore */
+ /**
+ * @var BuildStore
+ */
protected $buildStore;
/**
- * Initialise the controller, set up stores and services.
+ * @var ProjectStore
*/
- public function init()
- {
- $this->response->disableLayout();
- $this->buildStore = Store\Factory::getStore('Build');
- $this->projectStore = Store\Factory::getStore('Project');
- }
+ protected $projectStore;
/**
- * Returns status of the last build
- * @param $projectId
- * @return string
+ * @var BuildFactory
*/
- protected function getStatus($projectId)
- {
- $branch = $this->getParam('branch', 'master');
- try {
- $project = $this->projectStore->getById($projectId);
- $status = 'passing';
+ protected $buildFactory;
- if (!$project->getAllowPublicStatus()) {
- return null;
- }
+ /**
+ * Create the BuildStatus controller.
+ *
+ * @param Config $config
+ * @param Request $request
+ * @param Response $response
+ * @param BuildStore $buildStore
+ * @param ProjectStore $projectStore
+ * @param HttpClient $shieldsClient
+ * @param BuildFactory $buildFactory
+ */
+ public function __construct(
+ Config $config,
+ Request $request,
+ Response $response,
+ BuildStore $buildStore,
+ ProjectStore $projectStore,
+ HttpClient $shieldsClient,
+ BuildFactory $buildFactory
+ ) {
+ parent::__construct($config, $request, $response);
- if (isset($project) && $project instanceof Project) {
- $build = $project->getLatestBuild($branch, array(2,3));
-
- if (isset($build) && $build instanceof Build && $build->getStatus() != 2) {
- $status = 'failed';
- }
- }
- } catch (\Exception $e) {
- $status = 'error';
- }
-
- return $status;
+ $this->buildStore = $buildStore;
+ $this->projectStore = $projectStore;
+ $this->shieldsClient = $shieldsClient;
+ $this->buildFactory = $buildFactory;
}
/**
* Displays projects information in ccmenu format
*
- * @param $projectId
- * @return bool
- * @throws \Exception
- * @throws b8\Exception\HttpException
+ * @param int $projectId
+ *
+ * @return Response
+ *
+ * @throws Exception
+ * @throws HttpException
*/
public function ccxml($projectId)
{
/* @var Project $project */
$project = $this->projectStore->getById($projectId);
- $xml = new \SimpleXMLElement('');
- if (!$project instanceof Project || !$project->getAllowPublicStatus()) {
- return $this->renderXml($xml);
+ if (!$project instanceof Project) {
+ throw new NotFoundException(Lang::get('project_x_not_found', $projectId));
}
+ if (!$project->getAllowPublicStatus()) {
+ throw new NotAuthorizedException();
+ }
+
+ $xml = new \SimpleXMLElement('');
try {
$branchList = $this->buildStore->getBuildBranches($projectId);
@@ -104,56 +117,51 @@ class BuildStatusController extends \PHPCI\Controller
}
}
}
-
} catch (\Exception $e) {
$xml = new \SimpleXMLElement('');
}
- return $this->renderXml($xml);
- }
-
- /**
- * @param \SimpleXMLElement $xml
- * @return bool
- */
- protected function renderXml(\SimpleXMLElement $xml = null)
- {
+ $this->response->disableLayout();
$this->response->setHeader('Content-Type', 'text/xml');
$this->response->setContent($xml->asXML());
- $this->response->flush();
- echo $xml->asXML();
- return true;
+ return $this->response;
}
/**
* Returns the appropriate build status image in SVG format for a given project.
+ *
+ * @param int $projectId
+ *
+ * @return Response
*/
public function image($projectId)
{
- $style = $this->getParam('style', 'plastic');
- $label = $this->getParam('label', 'build');
+ $project = $this->projectStore->getById($projectId);
- $status = $this->getStatus($projectId);
-
- if (is_null($status)) {
- $response = new b8\Http\Response\RedirectResponse();
- $response->setHeader('Location', '/');
- return $response;
+ if (empty($project)) {
+ throw new NotFoundException(Lang::get('project_x_not_found', $projectId));
}
+ if (!$project->getAllowPublicStatus()) {
+ throw new NotAuthorizedException();
+ }
+
+ $style = $this->getParam('style', 'plastic');
+ $label = $this->getParam('label', 'build');
+ $branch = $this->getParam('branch', 'master');
+ $status = $this->getStatus($project, $branch);
+
$color = ($status == 'passing') ? 'green' : 'red';
- $image = file_get_contents(sprintf(
- 'http://img.shields.io/badge/%s-%s-%s.svg?style=%s',
- $label,
- $status,
- $color,
- $style
- ));
+ $image = $this->shieldsClient->get(
+ sprintf('/badge/%s-%s-%s.svg', $label, $status, $color),
+ array('style' => $style)
+ );
$this->response->disableLayout();
$this->response->setHeader('Content-Type', 'image/svg+xml');
- $this->response->setContent($image);
+ $this->response->setContent($image['body']);
+
return $this->response;
}
@@ -168,11 +176,11 @@ class BuildStatusController extends \PHPCI\Controller
$project = $this->projectStore->getById($projectId);
if (empty($project)) {
- throw new NotFoundException('Project with id: ' . $projectId . ' not found');
+ throw new NotFoundException(Lang::get('project_x_not_found', $projectId));
}
if (!$project->getAllowPublicStatus()) {
- throw new NotFoundException('Project with id: ' . $projectId . ' not found');
+ throw new NotAuthorizedException();
}
$builds = $this->getLatestBuilds($projectId);
@@ -197,9 +205,33 @@ class BuildStatusController extends \PHPCI\Controller
$builds = $this->buildStore->getWhere($criteria, 10, 0, array(), $order);
foreach ($builds['items'] as &$build) {
- $build = BuildFactory::getBuild($build);
+ $build = $this->buildFactory->getBuild($build);
}
return $builds['items'];
}
+
+ /**
+ * Returns status of the last build
+ *
+ * @param int $projectId
+ *
+ * @return string
+ *
+ * @throws Exception
+ */
+ protected function getStatus($project, $branch)
+ {
+ try {
+ $build = $project->getLatestBuild($branch, array(2,3));
+
+ if (isset($build) && $build instanceof Build && $build->getStatus() != 2) {
+ return 'failed';
+ }
+ } catch (Exception $e) {
+ return 'error';
+ }
+
+ return 'passing';
+ }
}
diff --git a/PHPCI/Controller/HomeController.php b/PHPCI/Controller/HomeController.php
index d0e5a14b..37970240 100644
--- a/PHPCI/Controller/HomeController.php
+++ b/PHPCI/Controller/HomeController.php
@@ -10,9 +10,14 @@
namespace PHPCI\Controller;
use b8;
+use b8\Http\Request;
+use b8\Http\Response;
+use PHPCI\Config;
use PHPCI\BuildFactory;
use PHPCI\Helper\Lang;
use PHPCI\Model\Build;
+use PHPCI\Store\BuildStore;
+use PHPCI\Store\ProjectStore;
/**
* Home Controller - Displays the PHPCI Dashboard.
@@ -23,22 +28,43 @@ use PHPCI\Model\Build;
class HomeController extends \PHPCI\Controller
{
/**
- * @var \b8\Store\BuildStore
+ * @var BuildStore
*/
protected $buildStore;
/**
- * @var \b8\Store\ProjectStore
+ * @var BuildFactory
+ */
+ protected $buildFactory;
+
+ /**
+ * @var ProjectStore
*/
protected $projectStore;
/**
- * Initialise the controller, set up stores and services.
+ * Create the Home controller.
+ *
+ * @param Config $config
+ * @param Request $request
+ * @param Response $response
+ * @param BuildStore $buildStore
+ * @param ProjectStore $projectStore
+ * @param BuildFactory $buildFactory
*/
- public function init()
- {
- $this->buildStore = b8\Store\Factory::getStore('Build');
- $this->projectStore = b8\Store\Factory::getStore('Project');
+ public function __construct(
+ Config $config,
+ Request $request,
+ Response $response,
+ BuildStore $buildStore,
+ ProjectStore $projectStore,
+ BuildFactory $buildFactory
+ ) {
+ parent::__construct($config, $request, $response);
+
+ $this->buildStore = $buildStore;
+ $this->projectStore = $projectStore;
+ $this->buildFactory = $buildFactory;
}
/**
@@ -59,7 +85,7 @@ class HomeController extends \PHPCI\Controller
$builds = $this->buildStore->getLatestBuilds(null, 10);
foreach ($builds as &$build) {
- $build = BuildFactory::getBuild($build);
+ $build = $this->buildFactory->getBuild($build);
}
$this->view->builds = $builds;
@@ -140,7 +166,7 @@ class HomeController extends \PHPCI\Controller
$view = new b8\View('BuildsTable');
foreach ($builds['items'] as &$build) {
- $build = BuildFactory::getBuild($build);
+ $build = $this->buildFactory->getBuild($build);
}
$view->builds = $builds['items'];
diff --git a/PHPCI/Controller/ProjectController.php b/PHPCI/Controller/ProjectController.php
index 3a55f49b..3de30be5 100644
--- a/PHPCI/Controller/ProjectController.php
+++ b/PHPCI/Controller/ProjectController.php
@@ -13,11 +13,16 @@ use b8;
use b8\Form;
use b8\Exception\HttpException\NotFoundException;
use b8\Store;
+use b8\Http\Request;
+use b8\Http\Response;
use PHPCI;
+use PHPCI\Config;
use PHPCI\BuildFactory;
use PHPCI\Helper\Github;
use PHPCI\Helper\Lang;
use PHPCI\Helper\SshKey;
+use PHPCI\Store\BuildStore;
+use PHPCI\Store\ProjectStore;
use PHPCI\Service\BuildService;
use PHPCI\Service\ProjectService;
@@ -30,34 +35,59 @@ use PHPCI\Service\ProjectService;
class ProjectController extends PHPCI\Controller
{
/**
- * @var \PHPCI\Store\ProjectStore
+ * @var ProjectStore
*/
protected $projectStore;
/**
- * @var \PHPCI\Service\ProjectService
+ * @var ProjectService
*/
protected $projectService;
/**
- * @var \PHPCI\Store\BuildStore
+ * @var BuildStore
*/
protected $buildStore;
/**
- * @var \PHPCI\Service\BuildService
+ * @var BuildService
*/
protected $buildService;
/**
- * Initialise the controller, set up stores and services.
+ * @var BuildFactory
*/
- public function init()
- {
- $this->buildStore = Store\Factory::getStore('Build');
- $this->projectStore = Store\Factory::getStore('Project');
- $this->projectService = new ProjectService($this->projectStore);
- $this->buildService = new BuildService($this->buildStore);
+ protected $buildFactory;
+
+ /**
+ * Create the Project controller.
+ *
+ * @param Config $config
+ * @param Request $request
+ * @param Response $response
+ * @param BuildStore $buildStore
+ * @param ProjectStore $projectStore
+ * @param ProjectService $projectService
+ * @param BuildService $buildService
+ * @param BuildFactory $buildFactory
+ */
+ public function __construct(
+ Config $config,
+ Request $request,
+ Response $response,
+ BuildStore $buildStore,
+ ProjectStore $projectStore,
+ ProjectService $projectService,
+ BuildService $buildService,
+ BuildFactory $buildFactory
+ ) {
+ parent::__construct($config, $request, $response);
+
+ $this->buildStore = $buildStore;
+ $this->projectStore = $projectStore;
+ $this->projectService = $projectService;
+ $this->buildService = $buildService;
+ $this->buildFactory = $buildFactory;
}
/**
@@ -122,8 +152,12 @@ class ProjectController extends PHPCI\Controller
}
/**
- * Delete a project.
- */
+ * Delete a project.
+ *
+ * @param int $projectId
+ *
+ * @return Response
+ */
public function delete($projectId)
{
$this->requireAdmin();
@@ -169,7 +203,7 @@ class ProjectController extends PHPCI\Controller
$view = new b8\View('BuildsTable');
foreach ($builds['items'] as &$build) {
- $build = BuildFactory::getBuild($build);
+ $build = $this->buildFactory->getBuild($build);
}
$view->builds = $builds['items'];
@@ -313,7 +347,7 @@ class ProjectController extends PHPCI\Controller
'local' => Lang::get('local'),
'hg' => Lang::get('hg'),
'svn' => Lang::get('svn'),
- );
+ );
$field = Form\Element\Select::create('type', Lang::get('where_hosted'), true);
$field->setPattern('^(github|bitbucket|gitlab|remote|local|hg|svn)');
diff --git a/PHPCI/Controller/SessionController.php b/PHPCI/Controller/SessionController.php
index 2995c514..93e2fa27 100644
--- a/PHPCI/Controller/SessionController.php
+++ b/PHPCI/Controller/SessionController.php
@@ -10,8 +10,12 @@
namespace PHPCI\Controller;
use b8;
+use b8\Http\Request;
+use b8\Http\Response;
+use PHPCI\Config;
use PHPCI\Helper\Email;
use PHPCI\Helper\Lang;
+use PHPCI\Store\UserStore;
/**
* Session Controller - Handles user login / logout.
@@ -22,22 +26,33 @@ use PHPCI\Helper\Lang;
class SessionController extends \PHPCI\Controller
{
/**
- * @var \PHPCI\Store\UserStore
+ * @var UserStore
*/
protected $userStore;
/**
- * Initialise the controller, set up stores and services.
+ * Create the Sesssion controller.
+ *
+ * @param Config $config
+ * @param Request $request
+ * @param Response $response
+ * @param UserStore $userStore
*/
- public function init()
- {
+ public function __construct(
+ Config $config,
+ Request $request,
+ Response $response,
+ UserStore $userStore
+ ) {
+ parent::__construct($config, $request, $response);
+
$this->response->disableLayout();
- $this->userStore = b8\Store\Factory::getStore('User');
+ $this->userStore = $userStore;
}
/**
- * Handles user login (form and processing)
- */
+ * Handles user login (form and processing)
+ */
public function login()
{
$isLoginFailure = false;
diff --git a/PHPCI/Controller/UserController.php b/PHPCI/Controller/UserController.php
index 19a7313f..0dafc984 100644
--- a/PHPCI/Controller/UserController.php
+++ b/PHPCI/Controller/UserController.php
@@ -12,8 +12,12 @@ namespace PHPCI\Controller;
use b8;
use b8\Exception\HttpException\NotFoundException;
use b8\Form;
+use b8\Http\Request;
+use b8\Http\Response;
+use PHPCI\Config;
use PHPCI\Controller;
use PHPCI\Helper\Lang;
+use PHPCI\Store\UserStore;
use PHPCI\Service\UserService;
/**
@@ -25,22 +29,35 @@ use PHPCI\Service\UserService;
class UserController extends Controller
{
/**
- * @var \PHPCI\Store\UserStore
+ * @var UserStore
*/
protected $userStore;
/**
- * @var \PHPCI\Service\UserService
+ * @var UserService
*/
protected $userService;
/**
- * Initialise the controller, set up stores and services.
+ * Create the User controller.
+ *
+ * @param Config $config
+ * @param Request $request
+ * @param Response $response
+ * @param UserStore $userStore
+ * @param UserService $userService
*/
- public function init()
- {
- $this->userStore = b8\Store\Factory::getStore('User');
- $this->userService = new UserService($this->userStore);
+ public function __construct(
+ Config $config,
+ Request $request,
+ Response $response,
+ UserStore $userStore,
+ UserService $userService
+ ) {
+ parent::__construct($config, $request, $response);
+
+ $this->userStore = $userStore;
+ $this->userService = $userService;
}
/**
@@ -48,8 +65,8 @@ class UserController extends Controller
*/
public function index()
{
- $users = $this->userStore->getWhere(array(), 1000, 0, array(), array('email' => 'ASC'));
- $this->view->users = $users;
+ $users = $this->userStore->getWhere(array(), 1000, 0, array(), array('email' => 'ASC'));
+ $this->view->users = $users;
$this->layout->title = Lang::get('manage_users');
@@ -275,8 +292,14 @@ class UserController extends Controller
}
/**
- * Delete a user.
- */
+ * Delete a user.
+ *
+ * @param int $userId
+ *
+ * @return Response
+ *
+ * @throws NotFoundException
+ */
public function delete($userId)
{
$this->requireAdmin();
@@ -291,6 +314,7 @@ class UserController extends Controller
$response = new b8\Http\Response\RedirectResponse();
$response->setHeader('Location', PHPCI_URL . 'user');
+
return $response;
}
}
diff --git a/PHPCI/Controller/WebhookController.php b/PHPCI/Controller/WebhookController.php
index 45a775ad..5c87451f 100644
--- a/PHPCI/Controller/WebhookController.php
+++ b/PHPCI/Controller/WebhookController.php
@@ -11,7 +11,10 @@ namespace PHPCI\Controller;
use b8;
use b8\Store;
+use b8\Http\Request;
+use b8\Http\Response;
use Exception;
+use PHPCI\Config;
use PHPCI\BuildFactory;
use PHPCI\Model\Project;
use PHPCI\Service\BuildService;
@@ -46,13 +49,36 @@ class WebhookController extends \b8\Controller
protected $buildService;
/**
- * Initialise the controller, set up stores and services.
+ * @var BuildFactory
*/
- public function init()
- {
- $this->buildStore = Store\Factory::getStore('Build');
- $this->projectStore = Store\Factory::getStore('Project');
- $this->buildService = new BuildService($this->buildStore);
+ protected $buildFactory;
+
+ /**
+ * Create the Webhook controller.
+ *
+ * @param Config $config
+ * @param Request $request
+ * @param Response $response
+ * @param BuildStore $buildStore
+ * @param ProjectStore $projectStore
+ * @param BuildService $buildService
+ * @param BuildFactory $buildFactory
+ */
+ public function __construct(
+ Config $config,
+ Request $request,
+ Response $response,
+ BuildStore $buildStore,
+ ProjectStore $projectStore,
+ BuildService $buildService,
+ BuildFactory $buildFactory
+ ) {
+ parent::__construct($config, $request, $response);
+
+ $this->buildStore = $buildStore;
+ $this->projectStore = $projectStore;
+ $this->buildService = $buildService;
+ $this->buildFactory = $buildFactory;
}
/** Handle the action, Ensuring to return a JsonResponse.
@@ -364,7 +390,7 @@ class WebhookController extends \b8\Controller
// If not, create a new build job for it:
$build = $this->buildService->createBuild($project, $commitId, $branch, $committer, $commitMessage, $extra);
- $build = BuildFactory::getBuild($build);
+ $build = $this->buildFactory->getBuild($build);
// Send a status postback if the build type provides one:
$build->sendStatusPostback();
diff --git a/PHPCI/Helper/BaseCommandExecutor.php b/PHPCI/Helper/BaseCommandExecutor.php
index bd948834..0b3d3398 100644
--- a/PHPCI/Helper/BaseCommandExecutor.php
+++ b/PHPCI/Helper/BaseCommandExecutor.php
@@ -34,9 +34,19 @@ abstract class BaseCommandExecutor implements CommandExecutor
*/
protected $verbose;
+ /**
+ * @var string
+ */
protected $lastOutput;
+
+ /**
+ * @var string
+ */
protected $lastError;
+ /**
+ * @var bool
+ */
public $logExecOutput = true;
/**
diff --git a/PHPCI/Helper/LoginIsDisabled.php b/PHPCI/Helper/LoginIsDisabled.php
index 437b95cd..5732c172 100644
--- a/PHPCI/Helper/LoginIsDisabled.php
+++ b/PHPCI/Helper/LoginIsDisabled.php
@@ -12,15 +12,17 @@ namespace PHPCI\Helper;
use b8\Config;
/**
-* Login Is Disabled Helper - Checks if login is disalbed in the view
-* @author Stephen Ball
-* @package PHPCI
-* @subpackage Web
-*/
+ * Login Is Disabled Helper - Checks if login is disalbed in the view
+ *
+ * @author Stephen Ball
+ * @package PHPCI
+ * @subpackage Web
+ */
class LoginIsDisabled
{
/**
* Checks if
+ *
* @param $method
* @param array $params
* @return mixed|null
@@ -28,7 +30,7 @@ class LoginIsDisabled
public function __call($method, $params = array())
{
unset($method, $params);
-
+
$config = Config::getInstance();
$state = (bool) $config->get('phpci.authentication_settings.state', false);
diff --git a/PHPCI/Helper/MailerFactory.php b/PHPCI/Helper/MailerFactory.php
index 641c06b9..37fed72a 100644
--- a/PHPCI/Helper/MailerFactory.php
+++ b/PHPCI/Helper/MailerFactory.php
@@ -11,6 +11,7 @@ namespace PHPCI\Helper;
/**
* Class MailerFactory helps to set up and configure a SwiftMailer object.
+ *
* @package PHPCI\Helper
*/
class MailerFactory
@@ -22,6 +23,7 @@ class MailerFactory
/**
* Set the mailer factory configuration.
+ *
* @param array $config
*/
public function __construct($config = array())
@@ -34,7 +36,8 @@ class MailerFactory
}
/**
- * Returns an instance of Swift_Mailer based on the config.s
+ * Returns an instance of Swift_Mailer based on the config.
+ *
* @return \Swift_Mailer
*/
public function getSwiftMailerFromConfig()
@@ -61,7 +64,9 @@ class MailerFactory
/**
* Return a specific configuration value by key.
+ *
* @param $configName
+ *
* @return null|string
*/
public function getMailConfig($configName)
@@ -70,7 +75,6 @@ class MailerFactory
return $this->emailConfig[$configName];
} else {
// Check defaults
-
switch($configName) {
case 'smtp_address':
return "localhost";
diff --git a/PHPCI/Plugin/Codeception.php b/PHPCI/Plugin/Codeception.php
index b906fb70..9d78d3bc 100644
--- a/PHPCI/Plugin/Codeception.php
+++ b/PHPCI/Plugin/Codeception.php
@@ -137,13 +137,11 @@ class Codeception implements \PHPCI\Plugin, \PHPCI\ZeroConfigPlugin
$configPath = $this->phpci->buildPath . $configPath;
$success = $this->phpci->executeCommand($cmd, $this->phpci->buildPath, $configPath);
-
- $this->phpci->log(
- 'Codeception XML path: '. $this->phpci->buildPath . $this->path . 'report.xml',
- Loglevel::DEBUG
- );
- $xml = file_get_contents($this->phpci->buildPath . $this->path . 'report.xml', false);
-
+ $this->phpci->log(
+ 'Codeception XML path: '. $this->phpci->buildPath . $this->path . 'report.xml',
+ Loglevel::DEBUG
+ );
+ $xml = file_get_contents($this->phpci->buildPath . $this->path . 'report.xml', false);
$parser = new Parser($this->phpci, $xml);
$output = $parser->parse();
diff --git a/PHPCI/Plugin/Util/Factory.php b/PHPCI/Plugin/Util/Factory.php
index 30c68340..62a64c78 100644
--- a/PHPCI/Plugin/Util/Factory.php
+++ b/PHPCI/Plugin/Util/Factory.php
@@ -2,6 +2,8 @@
namespace PHPCI\Plugin\Util;
+use Pimple\Container;
+
/**
* Plugin Factory - Loads Plugins and passes required dependencies.
* @package PHPCI\Plugin\Util
@@ -15,19 +17,19 @@ class Factory
private $currentPluginOptions;
/**
- * @var \Pimple
+ * @var Container
*/
private $container;
/**
- * @param \Pimple $container
+ * @param Container $container
*/
- public function __construct(\Pimple $container = null)
+ public function __construct(Container $container = null)
{
if ($container) {
$this->container = $container;
} else {
- $this->container = new \Pimple();
+ $this->container = new Container();
}
$self = $this;
diff --git a/PHPCI/Store/Base/BuildMetaStoreBase.php b/PHPCI/Store/Base/BuildMetaStoreBase.php
index 7a3d4159..7a493691 100644
--- a/PHPCI/Store/Base/BuildMetaStoreBase.php
+++ b/PHPCI/Store/Base/BuildMetaStoreBase.php
@@ -22,8 +22,10 @@ class BuildMetaStoreBase extends Store
/**
* Returns a BuildMeta model by primary key.
+ *
* @param mixed $value
* @param string $useConnection
+ *
* @return \@appNamespace\Model\BuildMeta|null
*/
public function getByPrimaryKey($value, $useConnection = 'read')
@@ -33,10 +35,13 @@ class BuildMetaStoreBase extends Store
/**
* Returns a BuildMeta model by Id.
+ *
* @param mixed $value
* @param string $useConnection
- * @throws HttpException
+ *
* @return \@appNamespace\Model\BuildMeta|null
+ *
+ * @throws HttpException
*/
public function getById($value, $useConnection = 'read')
{
@@ -59,11 +64,14 @@ class BuildMetaStoreBase extends Store
/**
* Returns an array of BuildMeta models by ProjectId.
+ *
* @param mixed $value
* @param int $limit
* @param string $useConnection
- * @throws HttpException
+ *
* @return array
+ *
+ * @throws HttpException
*/
public function getByProjectId($value, $limit = 1000, $useConnection = 'read')
{
@@ -71,7 +79,6 @@ class BuildMetaStoreBase extends Store
throw new HttpException('Value passed to ' . __FUNCTION__ . ' cannot be null.');
}
-
$query = 'SELECT * FROM `build_meta` WHERE `project_id` = :project_id LIMIT :limit';
$stmt = Database::getConnection($useConnection)->prepare($query);
$stmt->bindValue(':project_id', $value);
@@ -95,11 +102,14 @@ class BuildMetaStoreBase extends Store
/**
* Returns an array of BuildMeta models by BuildId.
+ *
* @param mixed $value
* @param int $limit
* @param string $useConnection
- * @throws HttpException
+ *
* @return array
+ *
+ * @throws HttpException
*/
public function getByBuildId($value, $limit = 1000, $useConnection = 'read')
{
@@ -107,7 +117,6 @@ class BuildMetaStoreBase extends Store
throw new HttpException('Value passed to ' . __FUNCTION__ . ' cannot be null.');
}
-
$query = 'SELECT * FROM `build_meta` WHERE `build_id` = :build_id LIMIT :limit';
$stmt = Database::getConnection($useConnection)->prepare($query);
$stmt->bindValue(':build_id', $value);
diff --git a/PHPCI/Store/Base/BuildStoreBase.php b/PHPCI/Store/Base/BuildStoreBase.php
index 0560d72b..3d1d5cec 100644
--- a/PHPCI/Store/Base/BuildStoreBase.php
+++ b/PHPCI/Store/Base/BuildStoreBase.php
@@ -22,8 +22,10 @@ class BuildStoreBase extends Store
/**
* Returns a Build model by primary key.
+ *
* @param mixed $value
* @param string $useConnection
+ *
* @return \@appNamespace\Model\Build|null
*/
public function getByPrimaryKey($value, $useConnection = 'read')
@@ -33,10 +35,13 @@ class BuildStoreBase extends Store
/**
* Returns a Build model by Id.
+ *
* @param mixed $value
* @param string $useConnection
- * @throws HttpException
+ *
* @return \@appNamespace\Model\Build|null
+ *
+ * @throws HttpException
*/
public function getById($value, $useConnection = 'read')
{
@@ -59,10 +64,13 @@ class BuildStoreBase extends Store
/**
* Returns an array of Build models by ProjectId.
+ *
* @param mixed $value
* @param int $limit
* @param string $useConnection
+ *
* @throws HttpException
+ *
* @return array
*/
public function getByProjectId($value, $limit = 1000, $useConnection = 'read')
@@ -95,11 +103,14 @@ class BuildStoreBase extends Store
/**
* Returns an array of Build models by Status.
+ *
* @param mixed $value
* @param int $limit
* @param string $useConnection
- * @throws HttpException
+ *
* @return array
+ *
+ * @throws HttpException
*/
public function getByStatus($value, $limit = 1000, $useConnection = 'read')
{
@@ -107,7 +118,6 @@ class BuildStoreBase extends Store
throw new HttpException('Value passed to ' . __FUNCTION__ . ' cannot be null.');
}
-
$query = 'SELECT * FROM `build` WHERE `status` = :status LIMIT :limit';
$stmt = Database::getConnection($useConnection)->prepare($query);
$stmt->bindValue(':status', $value);
diff --git a/PHPCI/Store/Base/ProjectStoreBase.php b/PHPCI/Store/Base/ProjectStoreBase.php
index 562afba2..4fab932c 100644
--- a/PHPCI/Store/Base/ProjectStoreBase.php
+++ b/PHPCI/Store/Base/ProjectStoreBase.php
@@ -22,8 +22,10 @@ class ProjectStoreBase extends Store
/**
* Returns a Project model by primary key.
+ *
* @param mixed $value
* @param string $useConnection
+ *
* @return \@appNamespace\Model\Project|null
*/
public function getByPrimaryKey($value, $useConnection = 'read')
@@ -33,10 +35,13 @@ class ProjectStoreBase extends Store
/**
* Returns a Project model by Id.
+ *
* @param mixed $value
* @param string $useConnection
- * @throws HttpException
+ *
* @return \@appNamespace\Model\Project|null
+ *
+ * @throws HttpException
*/
public function getById($value, $useConnection = 'read')
{
@@ -59,11 +64,14 @@ class ProjectStoreBase extends Store
/**
* Returns an array of Project models by Title.
+ *
* @param mixed $value
* @param int $limit
* @param string $useConnection
- * @throws HttpException
+ *
* @return array
+ *
+ * @throws HttpException
*/
public function getByTitle($value, $limit = 1000, $useConnection = 'read')
{
@@ -71,7 +79,6 @@ class ProjectStoreBase extends Store
throw new HttpException('Value passed to ' . __FUNCTION__ . ' cannot be null.');
}
-
$query = 'SELECT * FROM `project` WHERE `title` = :title LIMIT :limit';
$stmt = Database::getConnection($useConnection)->prepare($query);
$stmt->bindValue(':title', $value);
diff --git a/PHPCI/Store/Base/UserStoreBase.php b/PHPCI/Store/Base/UserStoreBase.php
index f2893ac5..36cbb389 100644
--- a/PHPCI/Store/Base/UserStoreBase.php
+++ b/PHPCI/Store/Base/UserStoreBase.php
@@ -22,8 +22,10 @@ class UserStoreBase extends Store
/**
* Returns a User model by primary key.
+ *
* @param mixed $value
* @param string $useConnection
+ *
* @return \@appNamespace\Model\User|null
*/
public function getByPrimaryKey($value, $useConnection = 'read')
@@ -33,10 +35,13 @@ class UserStoreBase extends Store
/**
* Returns a User model by Id.
+ *
* @param mixed $value
* @param string $useConnection
- * @throws HttpException
+ *
* @return \@appNamespace\Model\User|null
+ *
+ * @throws HttpException
*/
public function getById($value, $useConnection = 'read')
{
@@ -59,10 +64,13 @@ class UserStoreBase extends Store
/**
* Returns a User model by Email.
+ *
* @param string $value
* @param string $useConnection
+ *
+ * @return \@appNamespace\Model\User|null
+ *
* @throws HttpException
- * @return \@appNamespace\Model\User|null
*/
public function getByEmail($value, $useConnection = 'read')
{
@@ -82,13 +90,16 @@ class UserStoreBase extends Store
return null;
}
-
+
/**
* Returns a User model by Email.
+ *
* @param string $value
* @param string $useConnection
- * @throws HttpException
+ *
* @return \@appNamespace\Model\User|null
+ *
+ * @throws HttpException
*/
public function getByLoginOrEmail($value, $useConnection = 'read')
{
diff --git a/Tests/PHPCI/Command/CreateAdminCommandTest.php b/Tests/PHPCI/Command/CreateAdminCommandTest.php
index 10b7b7f3..d68f4ba5 100644
--- a/Tests/PHPCI/Command/CreateAdminCommandTest.php
+++ b/Tests/PHPCI/Command/CreateAdminCommandTest.php
@@ -35,7 +35,7 @@ class CreateAdminCommandTest extends \PHPUnit_Framework_TestCase
parent::setup();
$this->command = $this->getMockBuilder('PHPCI\\Command\\CreateAdminCommand')
- ->setConstructorArgs(array($this->getMock('PHPCI\\Store\\UserStore')))
+ ->setConstructorArgs(array($this->getMock('PHPCI\\Service\\UserService', array(), array(), '', false)))
->setMethods(array('reloadConfig'))
->getMock()
;
diff --git a/Tests/PHPCI/Controller/BuildStatusControllerTest.php b/Tests/PHPCI/Controller/BuildStatusControllerTest.php
new file mode 100644
index 00000000..05d9dc8c
--- /dev/null
+++ b/Tests/PHPCI/Controller/BuildStatusControllerTest.php
@@ -0,0 +1,131 @@
+prophesize('PHPCI\Store\BuildStore');
+ $projectStore = $this->prophesize('PHPCI\Store\ProjectStore');
+
+ $project = new Project();
+ $project->setAllowPublicStatus(false);
+
+ $projectStore->getById(Argument::any())->willReturn($project);
+
+ $webController = new BuildStatusController(
+ $this->prophesize('PHPCI\Config')->reveal(),
+ $this->prophesize('b8\Http\Request')->reveal(),
+ new \b8\Http\Response(),
+ $buildStore->reveal(),
+ $projectStore->reveal(),
+ $this->prophesize('b8\HttpClient')->reveal()
+ );
+
+ $result = $webController->handleAction('ccxml', [1]);
+ }
+
+ public function test_ccxml_visible_for_public_project()
+ {
+ $buildStore = $this->prophesize('PHPCI\Store\BuildStore');
+ $projectStore = $this->prophesize('PHPCI\Store\ProjectStore');
+ $project = new Project();
+ $project->setId(1);
+ $project->setBranch('test');
+ $project->setAllowPublicStatus(true);
+
+ $projectStore->getById(1)->willReturn($project);
+
+ $webController = new BuildStatusController(
+ $this->prophesize('PHPCI\Config')->reveal(),
+ $this->prophesize('b8\Http\Request')->reveal(),
+ new \b8\Http\Response(),
+ $buildStore->reveal(),
+ $projectStore->reveal(),
+ $this->prophesize('b8\HttpClient')->reveal()
+ );
+
+ $result = $webController->handleAction('ccxml', [1]);
+ $this->assertInstanceOf('b8\Http\Response', $result);
+
+ $responseData = $result->getData();
+ $this->assertEquals('text/xml', $responseData['headers']['Content-Type']);
+ $this->assertXmlStringEqualsXmlString('', $responseData['body']);
+ }
+
+
+ /**
+ * @expectedException \b8\Exception\HttpException\NotAuthorizedException
+ */
+ public function test_image_hidden_for_non_public_project()
+ {
+ $buildStore = $this->prophesize('PHPCI\Store\BuildStore');
+ $projectStore = $this->prophesize('PHPCI\Store\ProjectStore');
+
+ $project = new Project();
+ $project->setAllowPublicStatus(false);
+
+ $projectStore->getById(Argument::any())->willReturn($project);
+
+ $webController = new BuildStatusController(
+ $this->prophesize('PHPCI\Config')->reveal(),
+ $this->prophesize('b8\Http\Request')->reveal(),
+ new \b8\Http\Response(),
+ $buildStore->reveal(),
+ $projectStore->reveal(),
+ $this->prophesize('b8\HttpClient')->reveal()
+ );
+
+ $result = $webController->handleAction('image', [1]);
+ }
+
+ public function test_image_visible_for_public_project()
+ {
+ $buildStore = $this->prophesize('PHPCI\Store\BuildStore');
+ $projectStore = $this->prophesize('PHPCI\Store\ProjectStore');
+ $project = new Project();
+ $project->setId(1);
+ $project->setBranch('test');
+ $project->setAllowPublicStatus(true);
+
+ $projectStore->getById(1)->willReturn($project);
+
+ $shieldsClient = $this->prophesize('b8\HttpClient');
+ $shieldsClient->get(Argument::any(), Argument::any())->willReturn(array(
+ 'body' => '',
+ ));
+
+ $webController = new BuildStatusController(
+ $this->prophesize('PHPCI\Config')->reveal(),
+ $this->prophesize('b8\Http\Request')->reveal(),
+ new \b8\Http\Response(),
+ $buildStore->reveal(),
+ $projectStore->reveal(),
+ $shieldsClient->reveal()
+ );
+
+ $result = $webController->handleAction('image', [1]);
+ $this->assertInstanceOf('b8\Http\Response', $result);
+
+ $responseData = $result->getData();
+ $this->assertEquals('image/svg+xml', $responseData['headers']['Content-Type']);
+ $this->assertXmlStringEqualsXmlString('', $responseData['body']);
+ }
+}
diff --git a/bootstrap.php b/bootstrap.php
index 18d91d07..c6e809aa 100644
--- a/bootstrap.php
+++ b/bootstrap.php
@@ -7,15 +7,30 @@
* @link http://www.phptesting.org/
*/
-// Let PHP take a guess as to the default timezone, if the user hasn't set one:
-use PHPCI\Logging\LoggerConfig;
+// If composer has not been run, fail at this point and tell the user to install:
+if (!file_exists(__DIR__ . '/vendor/autoload.php') && defined('PHPCI_IS_CONSOLE') && PHPCI_IS_CONSOLE) {
+ $message = 'Please install PHPCI with "composer install" (or "php composer.phar install"';
+ $message .= ' for Windows) before using console';
+ file_put_contents('php://stderr', $message);
+ exit(1);
+}
+
+// Load Composer autoloader:
+require_once(__DIR__ . '/vendor/autoload.php');
+
+// Let PHP take a guess as to the default timezone, if the user hasn't set one:
$timezone = ini_get('date.timezone');
if (empty($timezone)) {
date_default_timezone_set('UTC');
}
-$configFile = dirname(__FILE__) . '/PHPCI/config.yml';
+use PHPCI\Logging\LoggerConfig;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\Config\FileLocator;
+use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
+
+$configFile = __DIR__ . '/PHPCI/config.yml';
$configEnv = getenv('phpci_config_file');
if (!empty($configEnv) && file_exists($configEnv)) {
@@ -30,34 +45,18 @@ if (!file_exists($configFile) && (!defined('PHPCI_IS_CONSOLE') || !PHPCI_IS_CONS
die($message);
}
-// If composer has not been run, fail at this point and tell the user to install:
-if (!file_exists(dirname(__FILE__) . '/vendor/autoload.php') && defined('PHPCI_IS_CONSOLE') && PHPCI_IS_CONSOLE) {
- $message = 'Please install PHPCI with "composer install" (or "php composer.phar install"';
- $message .= ' for Windows) before using console';
-
- file_put_contents('php://stderr', $message);
- exit(1);
-}
-
-// Load Composer autoloader:
-require_once(dirname(__FILE__) . '/vendor/autoload.php');
-
\PHPCI\ErrorHandler::register();
if (defined('PHPCI_IS_CONSOLE') && PHPCI_IS_CONSOLE) {
$loggerConfig = LoggerConfig::newFromFile(__DIR__ . "/loggerconfig.php");
}
-// Load configuration if present:
-$conf = array();
-$conf['b8']['app']['namespace'] = 'PHPCI';
-$conf['b8']['app']['default_controller'] = 'Home';
-$conf['b8']['view']['path'] = dirname(__FILE__) . '/PHPCI/View/';
-
-$config = new b8\Config($conf);
+$container = new ContainerBuilder();
+$loader = new YamlFileLoader($container, new FileLocator(__DIR__));
+$loader->load('services.yml');
if (file_exists($configFile)) {
- $config->loadYaml($configFile);
+ $container->set('config_file', $configFile);
}
/**
@@ -66,11 +65,11 @@ if (file_exists($configFile)) {
*
* @ticket 781
*/
-$localVarsFile = dirname(__FILE__) . '/local_vars.php';
+$localVarsFile = __DIR__ . '/local_vars.php';
if (is_readable($localVarsFile)) {
require_once $localVarsFile;
}
-require_once(dirname(__FILE__) . '/vars.php');
+require_once(__DIR__ . '/vars.php');
-\PHPCI\Helper\Lang::init($config);
+\PHPCI\Helper\Lang::init($container->get('config'));
diff --git a/composer.json b/composer.json
index 3de523e5..de51da75 100644
--- a/composer.json
+++ b/composer.json
@@ -45,10 +45,11 @@
"symfony/console": "~2.1",
"psr/log": "~1.0",
"monolog/monolog": "~1.6",
- "pimple/pimple": "~1.1",
+ "pimple/pimple": "~3.0",
"robmorgan/phinx": "~0.4",
"sensiolabs/ansi-to-html": "~1.1",
- "jakub-onderka/php-parallel-lint": "0.8.*"
+ "jakub-onderka/php-parallel-lint": "0.8.*",
+ "symfony/dependency-injection": "~2.7"
},
"autoload-dev": {
diff --git a/composer.lock b/composer.lock
index 21e42d42..a32dc7ae 100644
--- a/composer.lock
+++ b/composer.lock
@@ -1,10 +1,10 @@
{
"_readme": [
"This file locks the dependencies of your project to a known state",
- "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
],
- "hash": "0be92d5565a805ffe462c6061ed1dcf4",
+ "hash": "4c1675c48cc8ac6ab60ff9a6663bcdb8",
"packages": [
{
"name": "block8/b8framework",
@@ -216,16 +216,16 @@
},
{
"name": "pimple/pimple",
- "version": "v1.1.1",
+ "version": "v3.0.0",
"source": {
"type": "git",
- "url": "https://github.com/fabpot/Pimple.git",
- "reference": "2019c145fe393923f3441b23f29bbdfaa5c58c4d"
+ "url": "https://github.com/silexphp/Pimple.git",
+ "reference": "876bf0899d01feacd2a2e83f04641e51350099ef"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/fabpot/Pimple/zipball/2019c145fe393923f3441b23f29bbdfaa5c58c4d",
- "reference": "2019c145fe393923f3441b23f29bbdfaa5c58c4d",
+ "url": "https://api.github.com/repos/silexphp/Pimple/zipball/876bf0899d01feacd2a2e83f04641e51350099ef",
+ "reference": "876bf0899d01feacd2a2e83f04641e51350099ef",
"shasum": ""
},
"require": {
@@ -234,12 +234,12 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.1.x-dev"
+ "dev-master": "3.0.x-dev"
}
},
"autoload": {
"psr-0": {
- "Pimple": "lib/"
+ "Pimple": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -249,9 +249,7 @@
"authors": [
{
"name": "Fabien Potencier",
- "email": "fabien@symfony.com",
- "homepage": "http://fabien.potencier.org",
- "role": "Lead Developer"
+ "email": "fabien@symfony.com"
}
],
"description": "Pimple is a simple Dependency Injection Container for PHP 5.3",
@@ -260,7 +258,7 @@
"container",
"dependency injection"
],
- "time": "2013-11-22 08:30:29"
+ "time": "2014-07-24 09:48:15"
},
{
"name": "psr/log",
@@ -563,6 +561,66 @@
"homepage": "http://symfony.com",
"time": "2015-01-25 04:39:26"
},
+ {
+ "name": "symfony/dependency-injection",
+ "version": "v2.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/DependencyInjection.git",
+ "reference": "137bf489c5151c7eb1e4b7dd34a123f9a74b966d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/DependencyInjection/zipball/137bf489c5151c7eb1e4b7dd34a123f9a74b966d",
+ "reference": "137bf489c5151c7eb1e4b7dd34a123f9a74b966d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.9"
+ },
+ "conflict": {
+ "symfony/expression-language": "<2.6"
+ },
+ "require-dev": {
+ "symfony/config": "~2.2",
+ "symfony/expression-language": "~2.6",
+ "symfony/phpunit-bridge": "~2.7",
+ "symfony/yaml": "~2.1"
+ },
+ "suggest": {
+ "symfony/config": "",
+ "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them",
+ "symfony/yaml": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.7-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\DependencyInjection\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony DependencyInjection Component",
+ "homepage": "https://symfony.com",
+ "time": "2015-05-29 14:44:44"
+ },
{
"name": "symfony/filesystem",
"version": "v2.6.4",
@@ -1925,66 +1983,6 @@
],
"time": "2015-03-04 02:07:03"
},
- {
- "name": "symfony/dependency-injection",
- "version": "v2.6.4",
- "target-dir": "Symfony/Component/DependencyInjection",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/DependencyInjection.git",
- "reference": "42bbb43fab66292a1865dc9616c299904c3d4d14"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/DependencyInjection/zipball/42bbb43fab66292a1865dc9616c299904c3d4d14",
- "reference": "42bbb43fab66292a1865dc9616c299904c3d4d14",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.3"
- },
- "conflict": {
- "symfony/expression-language": "<2.6"
- },
- "require-dev": {
- "symfony/config": "~2.2",
- "symfony/expression-language": "~2.6",
- "symfony/yaml": "~2.1"
- },
- "suggest": {
- "symfony/config": "",
- "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them",
- "symfony/yaml": ""
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.6-dev"
- }
- },
- "autoload": {
- "psr-0": {
- "Symfony\\Component\\DependencyInjection\\": ""
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Symfony Community",
- "homepage": "http://symfony.com/contributors"
- },
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- }
- ],
- "description": "Symfony DependencyInjection Component",
- "homepage": "http://symfony.com",
- "time": "2015-01-25 04:39:26"
- },
{
"name": "symfony/finder",
"version": "v2.6.4",
diff --git a/console b/console
index 36645768..31103d33 100755
--- a/console
+++ b/console
@@ -12,29 +12,7 @@ define('PHPCI_IS_CONSOLE', true);
require('bootstrap.php');
-use PHPCI\Command\RunCommand;
-use PHPCI\Command\RebuildCommand;
-use PHPCI\Command\GenerateCommand;
-use PHPCI\Command\UpdateCommand;
-use PHPCI\Command\InstallCommand;
-use PHPCI\Command\DaemonCommand;
-use PHPCI\Command\PollCommand;
-use PHPCI\Command\CreateAdminCommand;
-use PHPCI\Command\CreateBuildCommand;
-use PHPCI\Service\BuildService;
-use Symfony\Component\Console\Application;
-use b8\Store\Factory;
-
-$application = new Application();
-
-$application->add(new RunCommand($loggerConfig->getFor('RunCommand')));
-$application->add(new RebuildCommand($loggerConfig->getFor('RunCommand')));
-$application->add(new InstallCommand);
-$application->add(new UpdateCommand($loggerConfig->getFor('UpdateCommand')));
-$application->add(new GenerateCommand);
-$application->add(new DaemonCommand($loggerConfig->getFor('DaemonCommand')));
-$application->add(new PollCommand($loggerConfig->getFor('PollCommand')));
-$application->add(new CreateAdminCommand(Factory::getStore('User')));
-$application->add(new CreateBuildCommand(Factory::getStore('Project'), new BuildService(Factory::getStore('Build'))));
+/** @var \Symfony\Component\Console\Application */
+$application = $container->get('console.application');
$application->run();
diff --git a/daemonise b/daemonise
index c6238568..fbe21ceb 100755
--- a/daemonise
+++ b/daemonise
@@ -12,9 +12,7 @@ define('PHPCI_IS_CONSOLE', true);
require('bootstrap.php');
-use PHPCI\Command\DaemoniseCommand;
-use Symfony\Component\Console\Application;
+/** @var \Symfony\Component\Console\Application */
+$application = $container->get('daemon.application');
-$application = new Application();
-$application->add(new DaemoniseCommand($loggerConfig->getFor('DaemoniseCommand')));
$application->run();
diff --git a/public/index.php b/public/index.php
index 56ebed12..27986c77 100644
--- a/public/index.php
+++ b/public/index.php
@@ -10,7 +10,9 @@
session_set_cookie_params(43200); // Set session cookie to last 12 hours.
session_start();
-require_once('../bootstrap.php');
+require_once(__DIR__ . '/../bootstrap.php');
-$fc = new PHPCI\Application($config, new b8\Http\Request());
-print $fc->handleRequest();
+/** @var PHPCI\Application */
+$app = $container->get('application');
+
+print $app->handleRequest();
diff --git a/services.yml b/services.yml
new file mode 100644
index 00000000..638a57b0
--- /dev/null
+++ b/services.yml
@@ -0,0 +1,215 @@
+parameters:
+ application.name: PHPCI
+ application.version: 1.7-dev
+ config_file: PHPCI/config.yml
+ storage.factory: b8\Store\Factory
+
+services:
+ storage.user:
+ class: PHPCI\Store\UserStore
+ factory: [%storage.factory%, getStore]
+ arguments:
+ - User
+ storage.project:
+ class: PHPCI\Store\ProjectStore
+ factory: [%storage.factory%, getStore]
+ arguments:
+ - Project
+ storage.build:
+ class: PHPCI\Store\BuildStore
+ factory: [%storage.factory%, getStore]
+ arguments:
+ - Build
+ storage.build_meta:
+ class: PHPCI\Store\BuildMetaStore
+ factory: [%storage.factory%, getStore]
+ arguments:
+ - BuildMeta
+ factory.build:
+ class: PHPCI\BuildFactory
+ arguments:
+ - @storage.build
+ http.request:
+ class: b8\Http\Request
+ arguments: []
+ http.response:
+ class: b8\Http\Response
+ arguments: []
+ http_client.github:
+ class: b8\HttpClient
+ arguments:
+ - https://api.github.com
+ http_client.shields:
+ class: b8\HttpClient
+ arguments:
+ - http://img.shields.io
+ config:
+ class: PHPCI\Config
+ arguments: [%config_file%]
+ application:
+ class: PHPCI\Application
+ arguments:
+ - @config
+ - @http.request
+ - @http.response
+ - @storage.user
+ - @storage.project
+ - @service_container
+ application.controller.home:
+ class: PHPCI\Controller\HomeController
+ arguments:
+ - @config
+ - @http.request
+ - @http.response
+ - @storage.build
+ - @storage.project
+ - @factory.build
+ application.controller.project:
+ class: PHPCI\Controller\ProjectController
+ arguments:
+ - @config
+ - @http.request
+ - @http.response
+ - @storage.build
+ - @storage.project
+ - @service.project
+ - @service.build
+ - @factory.build
+ application.controller.build:
+ class: PHPCI\Controller\BuildController
+ arguments:
+ - @config
+ - @http.request
+ - @http.response
+ - @storage.build
+ - @service.build
+ - @factory.build
+ application.controller.buildstatus:
+ class: PHPCI\Controller\BuildStatusController
+ arguments:
+ - @config
+ - @http.request
+ - @http.response
+ - @storage.build
+ - @storage.project
+ - @http_client.shields
+ - @factory.build
+ application.controller.user:
+ class: PHPCI\Controller\UserController
+ arguments:
+ - @config
+ - @http.request
+ - @http.response
+ - @storage.user
+ - @service.user
+ application.controller.session:
+ class: PHPCI\Controller\SessionController
+ arguments:
+ - @config
+ - @http.request
+ - @http.response
+ - @storage.user
+ application.controller.settings:
+ class: PHPCI\Controller\SettingsController
+ arguments:
+ - @config
+ - @http.request
+ - @http.response
+ - @storage.user
+ - @service.user
+ application.controller.plugin:
+ class: PHPCI\Controller\PluginController
+ arguments:
+ - @config
+ - @http.request
+ - @http.response
+ application.controller.webhook:
+ class: PHPCI\Controller\WebhookController
+ arguments:
+ - @config
+ - @http.request
+ - @http.response
+ - @storage.build
+ - @storage.project
+ - @service.build
+ - @factory.build
+ service.build:
+ class: PHPCI\Service\BuildService
+ arguments: [@storage.build]
+ service.user:
+ class: PHPCI\Service\UserService
+ arguments: [@storage.user]
+ service.project:
+ class: PHPCI\Service\ProjectService
+ arguments: [@storage.project]
+ process_control:
+ factory: [PHPCI\ProcessControl\Factory, getInstance]
+ console.application:
+ class: Symfony\Component\Console\Application
+ arguments:
+ - %application.name%
+ - %application.version%
+ calls:
+ - [add, ['@console.command.run']]
+ - [add, ['@console.command.rebuild']]
+ - [add, ['@console.command.install']]
+ - [add, ['@console.command.update']]
+ - [add, ['@console.command.generate']]
+ - [add, ['@console.command.daemon']]
+ - [add, ['@console.command.poll']]
+ - [add, ['@console.command.create_admin']]
+ - [add, ['@console.command.create_build']]
+ daemon.application:
+ class: Symfony\Component\Console\Application
+ arguments:
+ - %application.name%
+ - %application.version%
+ calls:
+ - [add, ['@console.command.daemon']]
+ console.logger:
+ class: Monolog\Logger
+ arguments:
+ - cli
+ console.command.run:
+ class: PHPCI\Command\RunCommand
+ arguments:
+ - @factory.build
+ - @console.logger
+ console.command.rebuild:
+ class: PHPCI\Command\RebuildCommand
+ arguments:
+ - @console.logger
+ - @storage.build
+ - @service.build
+ - @console.command.run
+ console.command.update:
+ class: PHPCI\Command\UpdateCommand
+ arguments:
+ - @console.logger
+ - @config
+ console.command.daemon:
+ class: PHPCI\Command\DaemonCommand
+ arguments:
+ - @console.logger
+ - @process_control
+ console.command.poll:
+ class: PHPCI\Command\PollCommand
+ arguments:
+ - @config
+ - @console.logger
+ - @storage.build
+ - @storage.project
+ - @http_client.github
+ console.command.create_admin:
+ class: PHPCI\Command\CreateAdminCommand
+ arguments:
+ - @service.user
+ console.command.create_build:
+ class: PHPCI\Command\CreateBuildCommand
+ arguments:
+ - @storage.project
+ - @service.build
+ console.command.install:
+ class: PHPCI\Command\InstallCommand
+ console.command.generate:
+ class: PHPCI\Command\GenerateCommand
diff --git a/vars.php b/vars.php
index 98c07377..40c1a6c4 100644
--- a/vars.php
+++ b/vars.php
@@ -2,13 +2,13 @@
// Define our APPLICATION_PATH, if not already defined:
if (!defined('APPLICATION_PATH')) {
- define('APPLICATION_PATH', dirname(__FILE__) . '/');
+ define('APPLICATION_PATH', __DIR__ . '/');
define('PHPCI_DIR', APPLICATION_PATH);
}
// Define our PHPCI_URL, if not already defined:
-if (!defined('PHPCI_URL') && isset($config)) {
- define('PHPCI_URL', $config->get('phpci.url', '') . '/');
+if (!defined('PHPCI_URL')) {
+ define('PHPCI_URL', isset($container) ? $container->get('config')->get('phpci.url') : '');
}
// Define PHPCI_BIN_DIR
@@ -38,5 +38,5 @@ if (!defined('IS_WIN')) {
// If an environment variable is set defining our config location, use that
// otherwise fall back to PHPCI/config.yml.
if (!defined('PHPCI_CONFIG_FILE')) {
- define('PHPCI_CONFIG_FILE', $configFile);
+ define('PHPCI_CONFIG_FILE', isset($container) ? $container->get('config_file') : 'PHPCI/config.yml');
}