* @package PHPCI * @subpackage Web */ class BuildController extends \PHPCI\Controller { public function init() { $this->_buildStore = b8\Store\Factory::getStore('Build'); } /** * View a specific build. */ public function view($buildId) { $build = $this->_buildStore->getById($buildId); $this->view->plugins = $this->getUiPlugins(); $this->view->build = $build; $this->view->data = $this->getBuildData($buildId); } protected function getUiPlugins() { $rtn = array(); $path = APPLICATION_PATH . 'public/assets/js/build-plugins/'; $dir = opendir($path); while ($item = readdir($dir)) { if (substr($item, 0, 1) == '.' || substr($item, -3) != '.js') { continue; } $rtn[] = $item; } return $rtn; } /** * AJAX call to get build data: */ public function data($buildId) { die($this->getBuildData($buildId)); } /** * AJAX call to get build meta: */ public function meta($buildId) { $build = $this->_buildStore->getById($buildId); $key = $this->getParam('key', null); $numBuilds = $this->getParam('num_builds', 1); $data = null; if ($key && $build) { $data = $this->_buildStore->getMeta($key, $build->getProjectId(), $buildId, $numBuilds); } die(json_encode($data)); } /** * Get build data from database and json encode it: */ protected function getBuildData($buildId) { $build = $this->_buildStore->getById($buildId); $data = array(); $data['status'] = (int)$build->getStatus(); $data['log'] = $this->cleanLog($build->getLog()); $data['plugins'] = json_decode($build->getPlugins(), true); $data['created'] = !is_null($build->getCreated()) ? $build->getCreated()->format('Y-m-d H:i:s') : null; $data['started'] = !is_null($build->getStarted()) ? $build->getStarted()->format('Y-m-d H:i:s') : null; $data['finished'] = !is_null($build->getFinished()) ? $build->getFinished()->format('Y-m-d H:i:s') : null; return json_encode($data); } /** * Create a build using an existing build as a template: */ public function rebuild($buildId) { $copy = $this->_buildStore->getById($buildId); $build = new Build(); $build->setProjectId($copy->getProjectId()); $build->setCommitId($copy->getCommitId()); $build->setStatus(0); $build->setBranch($copy->getBranch()); $build->setCreated(new \DateTime()); $build = $this->_buildStore->save($build); header('Location: '.PHPCI_URL.'build/view/' . $build->getId()); exit; } /** * Delete a build. */ public function delete($buildId) { if (empty($_SESSION['user']) || !$_SESSION['user']->getIsAdmin()) { throw new \Exception('You do not have permission to do that.'); } $build = $this->_buildStore->getById($buildId); $this->_buildStore->delete($build); header('Location: '.PHPCI_URL.'project/view/' . $build->getProjectId()); exit; } /** * Parse log for unix colours and replace with HTML. */ protected function cleanLog($log) { $log = str_replace('[0;32m', '', $log); $log = str_replace('[0;31m', '', $log); $log = str_replace('[0m', '', $log); return $log; } }