diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 00000000..c2f33e73 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,41 @@ +Contributions to PHPCI are very much encouraged, and we do our best to make it as welcoming and simple as possible. + +### Before You Start +Before you start, please make sure that you are aware of, and agree to, the following conditions of contribution: + +* By making a contribution to PHPCI, you accept that you are granting copyright ownership for that contribution to Block 8 Limited - the company responsible for PHPCI. In countries where copyright reassignment is not permitted, you grant Block 8 Limited a perpetual, non-exclusive licence to use your contribution in any way and for any purpose. + +* By making a contribution to PHPCI, you accept that your code will be released under the open-source [BSD 2-Clause Licence](https://github.com/Block8/PHPCI/blob/master/LICENSE.md). + +Block 8 are committed to PHPCI being a truly free and open source project, providing easy to use continuous integration and testing to as many developers as possible. We may, at our sole discretion, provide paid services based upon PHPCI - but PHPCI will always remain free (as in cost, and freedom) and open source. + +### The Contribution Process + +1. If you are thinking of making a large change or feature addition, [open an issue](/Block8/PHPCI/issues) titled "Intent to implement: ". Describe your idea in detail and discuss it with the community. It might be that someone already has a plan, could help you out, or your idea may simply not be suitable for the project at this time. +2. Fork the PHPCI project on Github +3. Add a feature or fix a bug - We recommend that you do this on a branch within your repository. +4. Create a pull request containing just the one change you want to contribute back to PHPCI. If you have more than one feature or bug fix, please create separate branches within your repository, and then submit a separate pull request for each one. Your pull request should use the template detailed below. +5. We'll then review your pull request and give any necessary feedback, this could be: + * Suggestions to improve your implementation + * Questions + * Issues/bugs related to the change + * Coding standards pointers +6. Once everyone is happy with the submission, we'll merge it back into PHPCI. Your change will then be included in the next project release. + +### Not sure what to start with? +We maintain two labels within our issue tracker that may be of interest to new contributors: + +* [The "Easy Fix" List](https://github.com/Block8/PHPCI/labels/flag:easy-fix) +* [The "Priority" List](https://github.com/Block8/PHPCI/labels/flag:priority) + +### Coding Standards +We require that all contributions meet at least the following guidelines: + +* PSR-1 & PSR-2 compliance for all code +* Doc-blocks for all classes and methods +* All files must contain the standard file-level docblock, including the copyright, license and link tags. + +All pull requests will be checked against these standards. If you're modifying a file as part of your change which does not comply with the above, please make the necessary changes to bring it into compliance prior to submitting the pull request. + +### Other Requirements +When you're adding new features or functionality, or you're updating existing functionality, please ensure that the relevant documentation is also either created or updated on the Wiki. diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..16692061 --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,28 @@ +Before submitting your issue, please make sure that you've checked all of the checkboxes below. + +- [ ] You're running the [latest release](https://github.com/Block8/PHPCI/releases/latest) version of PHPCI. +- [ ] Ensure that you're running at least PHP 5.3.6, you can check this by running `php -v` +- [ ] You've run `composer install --no-dev -o` from the root of your installation. +- [ ] You have set up either the PHPCI [Worker](https://github.com/Block8/PHPCI/wiki/Run-Builds-Using-a-Worker), [Daemon](https://github.com/Block8/PHPCI/wiki/Run-Builds-Using-a-Daemon) or [Cron Job](https://github.com/Block8/PHPCI/wiki/Run-Builds-Using-Cron) to run builds. + +To help us better understand your issue, please answer the following. + +### Expected behaviour + +*Please describe what you're expecting to see happen.* + +### Actual behaviour + +*Please describe what you're actually seeing happen.* + +### Steps to reproduce + +*If your issue requires any specific steps to reproduce, please outline them here.* + +### Environment info +Operating System: +PHP Version: +MySQL Version: + +### Logs or other output that would be helpful +(If logs are large, please upload as attachment). \ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..65d060ab --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,23 @@ +Contribution Type: bug fix | new plugin | new feature | refactor | cosmetic +Link to Intent to Implement: +Link to Bug: + +This pull request affects the following areas: + +* [ ] Front-End +* [ ] Builder +* [ ] Build Plugins + +**In raising this pull request, I confirm the following (please check boxes):** + +- [ ] I have read and understood the [contributing guidelines](/.github/CONTRIBUTING.md)? +- [ ] I have checked that another pull request for this purpose does not exist. +- [ ] I have considered, and confirmed that this submission will be valuable to others. +- [ ] I have created or updated the relevant documentation for this change on the PHPCI Wiki. +- [ ] Do the PHPCI tests pass? + + +Detailed description of change: + + + diff --git a/.phpci.yml b/.phpci.yml index b4fd52ec..d6ea0921 100644 --- a/.phpci.yml +++ b/.phpci.yml @@ -13,7 +13,6 @@ build_settings: setup: composer: action: "install" - prefer_dist: false test: php_parallel_lint: diff --git a/PHPCI/Builder.php b/PHPCI/Builder.php index 0edc44d8..1aed3d3f 100644 --- a/PHPCI/Builder.php +++ b/PHPCI/Builder.php @@ -213,8 +213,6 @@ class Builder implements LoggerAwareInterface $this->build->setStatus(Build::STATUS_FAILED); } - // Complete stage plugins are always run - $this->pluginExecutor->executePlugins($this->config, 'complete'); if ($success) { $this->pluginExecutor->executePlugins($this->config, 'success'); @@ -236,6 +234,9 @@ class Builder implements LoggerAwareInterface } catch (\Exception $ex) { $this->build->setStatus(Build::STATUS_FAILED); $this->buildLogger->logFailure(Lang::get('exception') . $ex->getMessage()); + }finally{ + // Complete stage plugins are always run + $this->pluginExecutor->executePlugins($this->config, 'complete'); } diff --git a/PHPCI/Command/InstallCommand.php b/PHPCI/Command/InstallCommand.php index d10f34b7..5f5cbd67 100644 --- a/PHPCI/Command/InstallCommand.php +++ b/PHPCI/Command/InstallCommand.php @@ -16,10 +16,12 @@ use b8\Config; use b8\Store\Factory; use PHPCI\Helper\Lang; use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Helper\DialogHelper; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use PHPCI\Service\UserService; +use Symfony\Component\Console\Question\ConfirmationQuestion; /** * Install console command - Installs PHPCI. @@ -46,6 +48,9 @@ class InstallCommand extends Command ->addOption('admin-pass', null, InputOption::VALUE_OPTIONAL, Lang::get('admin_pass')) ->addOption('admin-mail', null, InputOption::VALUE_OPTIONAL, Lang::get('admin_email')) ->addOption('config-path', null, InputOption::VALUE_OPTIONAL, Lang::get('config_path'), $defaultPath) + ->addOption('queue-disabled', null, InputOption::VALUE_NONE, 'Don\'t ask for queue details') + ->addOption('queue-server', null, InputOption::VALUE_OPTIONAL, 'Beanstalkd queue server hostname') + ->addOption('queue-name', null, InputOption::VALUE_OPTIONAL, 'Beanstalkd queue name') ->setDescription(Lang::get('install_phpci')); } @@ -229,10 +234,45 @@ class InstallCommand extends Command } $phpci['url'] = $url; + $phpci['worker'] = $this->getQueueInformation($input, $output, $dialog); return $phpci; } + /** + * If the user wants to use a queue, get the necessary details. + * @param InputInterface $input + * @param OutputInterface $output + * @param DialogHelper $dialog + * @return array + */ + protected function getQueueInformation(InputInterface $input, OutputInterface $output, DialogHelper $dialog) + { + if ($input->getOption('queue-disabled')) { + return null; + } + + $rtn = []; + + $helper = $this->getHelper('question'); + $question = new ConfirmationQuestion('Use beanstalkd to manage build queue? ', true); + + if (!$helper->ask($input, $output, $question)) { + $output->writeln('Skipping beanstalkd configuration.'); + return null; + } + + if (!$rtn['host'] = $input->getOption('queue-server')) { + $rtn['host'] = $dialog->ask($output, 'Enter your beanstalkd hostname [localhost]: ', 'localhost'); + } + + if (!$rtn['queue'] = $input->getOption('queue-name')) { + $rtn['queue'] = $dialog->ask($output, 'Enter the queue (tube) name to use [phpci]: ', 'phpci'); + } + + return $rtn; + } + /** * Load configuration for DB form CLI options or ask info to user. * diff --git a/PHPCI/Command/RebuildQueueCommand.php b/PHPCI/Command/RebuildQueueCommand.php new file mode 100644 index 00000000..4b0af6d8 --- /dev/null +++ b/PHPCI/Command/RebuildQueueCommand.php @@ -0,0 +1,85 @@ + +* @package PHPCI +* @subpackage Console +*/ +class RebuildQueueCommand extends Command +{ + /** + * @var OutputInterface + */ + protected $output; + + /** + * @var Logger + */ + protected $logger; + + /** + * @param \Monolog\Logger $logger + * @param string $name + */ + public function __construct(Logger $logger, $name = null) + { + parent::__construct($name); + $this->logger = $logger; + } + + protected function configure() + { + $this + ->setName('phpci:rebuild-queue') + ->setDescription('Rebuilds the PHPCI worker queue.'); + } + + protected function execute(InputInterface $input, OutputInterface $output) + { + $this->output = $output; + + // For verbose mode we want to output all informational and above + // messages to the symphony output interface. + if ($input->hasOption('verbose') && $input->getOption('verbose')) { + $this->logger->pushHandler( + new OutputLogHandler($this->output, Logger::INFO) + ); + } + + $store = Factory::getStore('Build'); + $result = $store->getByStatus(0); + + $this->logger->addInfo(Lang::get('found_n_builds', count($result['items']))); + + $buildService = new BuildService($store); + + while (count($result['items'])) { + $build = array_shift($result['items']); + $build = BuildFactory::getBuild($build); + + $this->logger->addInfo('Added build #' . $build->getId() . ' to queue.'); + $buildService->addBuildToQueue($build); + } + } +} diff --git a/PHPCI/Command/WorkerCommand.php b/PHPCI/Command/WorkerCommand.php index 49685656..5ceb6a84 100644 --- a/PHPCI/Command/WorkerCommand.php +++ b/PHPCI/Command/WorkerCommand.php @@ -50,7 +50,8 @@ class WorkerCommand extends Command { $this ->setName('phpci:worker') - ->setDescription('Runs the PHPCI build worker.'); + ->setDescription('Runs the PHPCI build worker.') + ->addOption('debug', null, null, 'Run PHPCI in Debug Mode'); } protected function execute(InputInterface $input, OutputInterface $output) @@ -65,6 +66,12 @@ class WorkerCommand extends Command ); } + // Allow PHPCI to run in "debug mode" + if ($input->hasOption('debug') && $input->getOption('debug')) { + $output->writeln('Debug mode enabled.'); + define('PHPCI_DEBUG_MODE', true); + } + $config = Config::getInstance()->get('phpci.worker', []); if (empty($config['host']) || empty($config['queue'])) { diff --git a/PHPCI/Controller/BuildController.php b/PHPCI/Controller/BuildController.php index f68a739c..55ccbb37 100644 --- a/PHPCI/Controller/BuildController.php +++ b/PHPCI/Controller/BuildController.php @@ -180,7 +180,7 @@ class BuildController extends \PHPCI\Controller $errorView->build = $build; $errorView->errors = $errors; - $data['errors'] = count($errors); + $data['errors'] = $errorStore->getErrorTotalForBuild($build->getId()); $data['error_html'] = $errorView->render(); $data['since'] = (new \DateTime())->format('Y-m-d H:i:s'); @@ -200,6 +200,10 @@ class BuildController extends \PHPCI\Controller $build = $this->buildService->createDuplicateBuild($copy); + if ($this->buildService->queueError) { + $_SESSION['global_error'] = Lang::get('add_to_queue_failed'); + } + $response = new b8\Http\Response\RedirectResponse(); $response->setHeader('Location', PHPCI_URL.'build/view/' . $build->getId()); return $response; diff --git a/PHPCI/Controller/BuildStatusController.php b/PHPCI/Controller/BuildStatusController.php index 0090e85f..62cb9ba7 100644 --- a/PHPCI/Controller/BuildStatusController.php +++ b/PHPCI/Controller/BuildStatusController.php @@ -104,7 +104,6 @@ class BuildStatusController extends \PHPCI\Controller } } } - } catch (\Exception $e) { $xml = new \SimpleXMLElement(''); } diff --git a/PHPCI/Controller/ProjectController.php b/PHPCI/Controller/ProjectController.php index be5dee19..72be46e5 100644 --- a/PHPCI/Controller/ProjectController.php +++ b/PHPCI/Controller/ProjectController.php @@ -116,6 +116,10 @@ class ProjectController extends PHPCI\Controller $email = $_SESSION['phpci_user']->getEmail(); $build = $this->buildService->createBuild($project, null, urldecode($branch), $email); + if ($this->buildService->queueError) { + $_SESSION['global_error'] = Lang::get('add_to_queue_failed'); + } + $response = new b8\Http\Response\RedirectResponse(); $response->setHeader('Location', PHPCI_URL.'build/view/' . $build->getId()); return $response; diff --git a/PHPCI/Controller/SettingsController.php b/PHPCI/Controller/SettingsController.php index ea15bc3b..645e19a4 100644 --- a/PHPCI/Controller/SettingsController.php +++ b/PHPCI/Controller/SettingsController.php @@ -444,7 +444,7 @@ class SettingsController extends Controller $field->setClass('form-control'); $field->setContainerClass('form-group'); $field->setOptions(Lang::getLanguageOptions()); - $field->setValue('en'); + $field->setValue(Lang::getLanguage()); $form->addField($field); diff --git a/PHPCI/Controller/WebhookController.php b/PHPCI/Controller/WebhookController.php index c448f163..4b444d03 100644 --- a/PHPCI/Controller/WebhookController.php +++ b/PHPCI/Controller/WebhookController.php @@ -27,6 +27,8 @@ use PHPCI\Store\ProjectStore; * @author Guillaume Perréal * @package PHPCI * @subpackage Web + * + * @SuppressWarnings(PHPMD.ExcessiveClassComplexity) */ class WebhookController extends \b8\Controller { @@ -80,11 +82,64 @@ class WebhookController extends \b8\Controller } /** - * Called by Bitbucket POST service. + * Called by Bitbucket. */ public function bitbucket($projectId) { $project = $this->fetchProject($projectId, 'bitbucket'); + + // Support both old services and new webhooks + if ($payload = $this->getParam('payload')) { + return $this->bitbucketService(json_decode($payload, true), $project); + } + + $payload = json_decode(file_get_contents("php://input"), true); + + if (empty($payload['push']['changes'])) { + // Invalid event from bitbucket + return [ + 'status' => 'failed', + 'commits' => [] + ]; + } + + return $this->bitbucketWebhook($payload, $project); + } + + /** + * Bitbucket webhooks. + */ + protected function bitbucketWebhook($payload, $project) + { + $results = array(); + $status = 'failed'; + foreach ($payload['push']['changes'] as $commit) { + try { + $email = $commit['new']['target']['author']['raw']; + $email = substr($email, 0, strpos($email, '>')); + $email = substr($email, strpos($email, '<') + 1); + + $results[$commit['new']['target']['hash']] = $this->createBuild( + $project, + $commit['new']['target']['hash'], + $commit['new']['name'], + $email, + $commit['new']['target']['message'] + ); + $status = 'ok'; + } catch (Exception $ex) { + $results[$commit['new']['target']['hash']] = array('status' => 'failed', 'error' => $ex->getMessage()); + } + } + + return array('status' => $status, 'commits' => $results); + } + + /** + * Bitbucket POST service. + */ + protected function bitbucketService($payload, $project) + { $payload = json_decode($this->getParam('payload'), true); $results = array(); diff --git a/PHPCI/Helper/BaseCommandExecutor.php b/PHPCI/Helper/BaseCommandExecutor.php index bd948834..b3b47f7b 100644 --- a/PHPCI/Helper/BaseCommandExecutor.php +++ b/PHPCI/Helper/BaseCommandExecutor.php @@ -76,6 +76,7 @@ abstract class BaseCommandExecutor implements CommandExecutor $this->lastOutput = array(); $command = call_user_func_array('sprintf', $args); + $this->logger->logDebug($command); if ($this->quiet) { $this->logger->log('Executing: ' . $command); @@ -89,7 +90,6 @@ abstract class BaseCommandExecutor implements CommandExecutor ); $pipes = array(); - $process = proc_open($command, $descriptorSpec, $pipes, $this->buildPath, null); if (is_resource($process)) { diff --git a/PHPCI/Languages/lang.de.php b/PHPCI/Languages/lang.de.php index cb7e3336..8e5bb3b2 100644 --- a/PHPCI/Languages/lang.de.php +++ b/PHPCI/Languages/lang.de.php @@ -39,7 +39,7 @@ PHPCI', 'reset_email_title' => 'PHPCI Passwort zurücksetzen für %s', 'reset_invalid' => 'Fehlerhafte Anfrage für das Zurücksetzen eines Passwortes', 'email_address' => 'Emailadresse', - 'login' => 'Login / Email Address', + 'login' => 'Login / Emailadresse', 'password' => 'Passwort', 'log_in' => 'Einloggen', @@ -103,7 +103,7 @@ generiert. Um es zu verwenden, fügen Sie einfach den folgenden Public Key im Ab 'local' => 'Lokaler Pfad', 'hg' => 'Mercurial', 'svn' => 'Subversion', - + 'where_hosted' => 'Wo wird Ihr Projekt gehostet?', 'choose_github' => 'Wählen Sie ein GitHub Repository:', @@ -115,8 +115,8 @@ generiert. Um es zu verwenden, fügen Sie einfach den folgenden Public Key im Ab (falls Sie Ihrem Projektrepository kein phpci.yml hinzufügen können)', 'default_branch' => 'Name des Standardbranches', 'allow_public_status' => 'Öffentliche Statusseite und -bild für dieses Projekt einschalten?', - 'archived' => 'Archived', - 'archived_menu' => 'Archived', + 'archived' => 'Archiviert', + 'archived_menu' => 'Archiviert', 'save_project' => 'Projekt speichern', 'error_mercurial' => 'Mercurial Repository-URL muss mit http://, oder https:// beginnen', @@ -130,7 +130,7 @@ generiert. Um es zu verwenden, fügen Sie einfach den folgenden Public Key im Ab 'all_branches' => 'Alle Branches', 'builds' => 'Builds', 'id' => 'ID', - 'date' => 'Date', + 'date' => 'Datum', 'project' => 'Projekt', 'commit' => 'Commit', 'branch' => 'Branch', @@ -151,6 +151,9 @@ generiert. Um es zu verwenden, fügen Sie einfach den folgenden Public Key im Ab 'webhooks_help_bitbucket' => 'Um für dieses Projekt automatisch einen Build zu starten, wenn neue Commits gepushed werden, fügen Sie die untenstehende URL als "POST" Service in der Services-Sektion Ihres Bitbucket Repositories hinzu.', // View Build + 'errors' => 'Fehler', + 'information' => 'Information', + 'build_x_not_found' => 'Build mit ID %d existiert nicht.', 'build_n' => 'Build %d', 'rebuild_now' => 'Build neu starten', @@ -192,8 +195,8 @@ generiert. Um es zu verwenden, fügen Sie einfach den folgenden Public Key im Ab 'codeception_suite' => 'Suite', 'codeception_time' => 'Zeit', 'codeception_synopsis' => '%1$d Tests in %2$f Sekunden ausgeführt. - %3$d Fehler.', - + %3$d Fehler.', + 'file' => 'Datei', 'line' => 'Zeile', 'class' => 'Klasse', @@ -209,14 +212,14 @@ generiert. Um es zu verwenden, fügen Sie einfach den folgenden Public Key im Ab 'build_created' => 'Build erstellt', 'build_started' => 'Build gestartet', 'build_finished' => 'Build abgeschlossen', - 'test_message' => 'Message', - 'test_no_message' => 'No message', - 'test_success' => 'Successful: %d', - 'test_fail' => 'Failures: %d', - 'test_skipped' => 'Skipped: %d', - 'test_error' => 'Errors: %d', + 'test_message' => 'Nachricht', + 'test_no_message' => 'Keine Nachricht', + 'test_success' => 'Erfolgreich: %d', + 'test_fail' => 'Fehlschläge: %d', + 'test_skipped' => 'Übersprungen: %d', + 'test_error' => 'Fehler: %d', 'test_todo' => 'Todos: %d', - 'test_total' => '%d test(s)', + 'test_total' => '%d Test(s)', // Users 'name' => 'Name', @@ -292,6 +295,19 @@ generiert. Um es zu verwenden, fügen Sie einfach den folgenden Public Key im Ab 'search_packagist_for_more' => 'Packagist nach mehr Packages durchsuchen', 'search' => 'Suchen »', + // Summary plugin + 'build-summary' => 'Zusammenfassung', + 'stage' => 'Abschnitt', + 'duration' => 'Dauer', + 'plugin' => 'Plugin', + 'stage_setup' => 'Vorbereitung', + 'stage_test' => 'Test', + 'stage_complete' => 'Vollständig', + 'stage_success' => 'Erfolg', + 'stage_failure' => 'Fehlschlag', + 'stage_broken' => 'Defekt', + 'stage_fixed' => 'Behoben', + // Installer 'installation_url' => 'PHPCI Installations-URL', 'db_host' => 'Datenbankserver', @@ -400,5 +416,18 @@ generiert. Um es zu verwenden, fügen Sie einfach den folgenden Public Key im Ab 'build_file_missing' => 'Angegebene Builddatei existiert nicht.', 'property_file_missing' => 'Angegebene Eigenschaftsdatei existiert nicht.', 'could_not_process_report' => 'Konnte den von diesem Tool erstellten Bericht nicht verarbeiten.', - 'shell_not_enabled' => 'Das Shell-Plugin ist nicht aktiviert. Bitte aktivieren Sie es via config.yml.' + 'shell_not_enabled' => 'Das Shell-Plugin ist nicht aktiviert. Bitte aktivieren Sie es via config.yml.', + + // Error Levels: + 'critical' => 'Kritisch', + 'high' => 'Hoch', + 'normal' => 'Normal', + 'low' => 'Niedrig', + + // Plugins that generate errors: + 'php_mess_detector' => 'PHP Mess Detector', + 'php_code_sniffer' => 'PHP Code Sniffer', + 'php_unit' => 'PHP Unit', + 'php_cpd' => 'PHP Copy/Paste Detector', + 'php_docblock_checker' => 'PHP Docblock Checker', ); diff --git a/PHPCI/Languages/lang.en.php b/PHPCI/Languages/lang.en.php index eec2ee07..63df75d2 100644 --- a/PHPCI/Languages/lang.en.php +++ b/PHPCI/Languages/lang.en.php @@ -372,6 +372,9 @@ PHPCI', 'project_id_argument' => 'A project ID', 'commit_id_option' => 'Commit ID to build', 'branch_name_option' => 'Branch to build', + 'add_to_queue_failed' => 'Build created successfully, but failed to add to build queue. This usually happens + when PHPCI is set to use a beanstalkd server that does not exist, + or your beanstalkd server has stopped.', // Run Command 'run_all_pending' => 'Run all pending PHPCI builds.', diff --git a/PHPCI/Languages/lang.pl.php b/PHPCI/Languages/lang.pl.php index 837fea6e..e1d3c3bf 100644 --- a/PHPCI/Languages/lang.pl.php +++ b/PHPCI/Languages/lang.pl.php @@ -130,7 +130,7 @@ od wybranego kodu źródłowego platformy hostingowej.', 'all_branches' => 'Wszystkie Gałęzie', 'builds' => 'Budowania', 'id' => 'ID', - 'date' => 'Date', + 'date' => 'Data', 'project' => 'Projekt', 'commit' => 'Commit', 'branch' => 'Gałąź', @@ -206,14 +206,14 @@ Services repozytoria Bitbucket.', 'build_created' => 'Budowanie Stworzone', 'build_started' => 'Budowanie Rozpoczęte', 'build_finished' => 'Budowanie Zakończone', - 'test_message' => 'Message', - 'test_no_message' => 'No message', - 'test_success' => 'Successful: %d', - 'test_fail' => 'Failures: %d', - 'test_skipped' => 'Skipped: %d', - 'test_error' => 'Errors: %d', - 'test_todo' => 'Todos: %d', - 'test_total' => '%d test(s)', + 'test_message' => 'Wiadomość', + 'test_no_message' => 'Brak wiadomości', + 'test_success' => 'Powodzenie: %d', + 'test_fail' => 'Niepowodzenia: %d', + 'test_skipped' => 'Pominęte: %d', + 'test_error' => 'Błędy: %d', + 'test_todo' => 'Do zrobienia: %d', + 'test_total' => '%d test(ów)', // Users 'name' => 'Nazwa', @@ -344,10 +344,10 @@ Przejrzyj powyższą listę błędów przed kontynuowaniem.', 'incorrect_format' => 'Niepoprawny format', // Create Build Command - 'create_build_project' => 'Create a build for a project', - 'project_id_argument' => 'A project ID', - 'commit_id_option' => 'Commit ID to build', - 'branch_name_option' => 'Branch to build', + 'create_build_project' => 'Utwórz budowanie dla projektu', + 'project_id_argument' => 'ID projektu', + 'commit_id_option' => 'ID Commita do budowania', + 'branch_name_option' => 'Gałąź do budowania', // Run Command 'run_all_pending' => 'Uruchom wszystkie oczekujące budowy w PHPCI', diff --git a/PHPCI/Logging/BuildLogger.php b/PHPCI/Logging/BuildLogger.php index 73f3b464..a68e9e6d 100644 --- a/PHPCI/Logging/BuildLogger.php +++ b/PHPCI/Logging/BuildLogger.php @@ -67,7 +67,7 @@ class BuildLogger implements LoggerAwareInterface } } - /** + /** * Add a success-coloured message to the log. * @param string */ @@ -98,6 +98,17 @@ class BuildLogger implements LoggerAwareInterface ); } + /** + * Add a debug message to the log. + * @param string + */ + public function logDebug($message) + { + if (defined('PHPCI_DEBUG_MODE') && PHPCI_DEBUG_MODE) { + $this->log("\033[0;33m" . $message . "\033[0m"); + } + } + /** * Sets a logger instance on the object * diff --git a/PHPCI/Migrations/20140730143702_fix_database_columns.php b/PHPCI/Migrations/20140730143702_fix_database_columns.php index 809fc878..a1ac2493 100644 --- a/PHPCI/Migrations/20140730143702_fix_database_columns.php +++ b/PHPCI/Migrations/20140730143702_fix_database_columns.php @@ -20,7 +20,7 @@ class FixDatabaseColumns extends AbstractMigration $build->changeColumn('project_id', 'integer', array('null' => false)); $build->changeColumn('commit_id', 'string', array('limit' => 50, 'null' => false)); $build->changeColumn('status', 'integer', array('null' => false)); - $build->changeColumn('log', 'text', array('null' => true, 'default' => '')); + $build->changeColumn('log', 'text', array('null' => true)); $build->changeColumn('branch', 'string', array('limit' => 50, 'null' => false, 'default' => 'master')); $build->changeColumn('created', 'datetime', array('null' => true)); $build->changeColumn('started', 'datetime', array('null' => true)); diff --git a/PHPCI/Migrations/20150203105015_fix_column_types.php b/PHPCI/Migrations/20150203105015_fix_column_types.php index f9bcf68a..53db2ad6 100644 --- a/PHPCI/Migrations/20150203105015_fix_column_types.php +++ b/PHPCI/Migrations/20150203105015_fix_column_types.php @@ -14,7 +14,6 @@ class FixColumnTypes extends AbstractMigration $build = $this->table('build'); $build->changeColumn('log', 'text', array( 'null' => true, - 'default' => '', 'limit' => MysqlAdapter::TEXT_MEDIUM, )); diff --git a/PHPCI/Migrations/20160623100223_project_table_defaults.php b/PHPCI/Migrations/20160623100223_project_table_defaults.php new file mode 100644 index 00000000..079db327 --- /dev/null +++ b/PHPCI/Migrations/20160623100223_project_table_defaults.php @@ -0,0 +1,18 @@ +table('project') + ->changeColumn('build_config', MysqlAdapter::PHINX_TYPE_TEXT, array('null' => true)) + ->changeColumn('archived', MysqlAdapter::PHINX_TYPE_INTEGER, array( + 'length' => MysqlAdapter::INT_TINY, + 'default' => 0, + )) + ->save(); + } +} diff --git a/PHPCI/Model/Build.php b/PHPCI/Model/Build.php index bf8d9379..a8bfd683 100644 --- a/PHPCI/Model/Build.php +++ b/PHPCI/Model/Build.php @@ -258,7 +258,7 @@ class Build extends BuildBase if (empty($this->currentBuildPath)) { $buildDirectory = $this->getId() . '_' . substr(md5(microtime(true)), 0, 5); - $this->currentBuildPath = PHPCI_BUILD_ROOT_DIR . $buildDirectory . '/'; + $this->currentBuildPath = PHPCI_BUILD_ROOT_DIR . $buildDirectory . DIRECTORY_SEPARATOR; } return $this->currentBuildPath; diff --git a/PHPCI/Model/Project.php b/PHPCI/Model/Project.php index 717b0d9a..4b5268b2 100644 --- a/PHPCI/Model/Project.php +++ b/PHPCI/Model/Project.php @@ -96,7 +96,7 @@ class Project extends ProjectBase $info = $this->data['access_information']; // Handle old-format (serialized) access information first: - if (!empty($info) && substr($info, 0, 1) != '{') { + if (!empty($info) && !in_array(substr($info, 0, 1), array('{', '['))) { $data = unserialize($info); } else { $data = json_decode($info, true); diff --git a/PHPCI/Plugin/Campfire.php b/PHPCI/Plugin/Campfire.php index 325e6e40..59ab9128 100644 --- a/PHPCI/Plugin/Campfire.php +++ b/PHPCI/Plugin/Campfire.php @@ -38,19 +38,19 @@ class Campfire implements \PHPCI\Plugin */ public function __construct(Builder $phpci, Build $build, array $options = array()) { - $this->phpci = $phpci; - $this->build = $build; - - $this->message = $options['message']; + $this->phpci = $phpci; + $this->build = $build; + $this->message = $options['message']; $this->userAgent = "PHPCI/1.0 (+http://www.phptesting.org/)"; - $this->cookie = "phpcicookie"; + $this->cookie = "phpcicookie"; $buildSettings = $phpci->getConfig('build_settings'); + if (isset($buildSettings['campfire'])) { - $campfire = $buildSettings['campfire']; - $this->url = $campfire['url']; + $campfire = $buildSettings['campfire']; + $this->url = $campfire['url']; $this->authToken = $campfire['authToken']; - $this->roomId = $campfire['roomId']; + $this->roomId = $campfire['roomId']; } else { throw new \Exception(Lang::get('no_campfire_settings')); } @@ -63,7 +63,7 @@ class Campfire implements \PHPCI\Plugin */ public function execute() { - $url = PHPCI_URL."build/view/".$this->build->getId(); + $url = PHPCI_URL . "build/view/" . $this->build->getId(); $message = str_replace("%buildurl%", $url, $this->message); $this->joinRoom($this->roomId); $status = $this->speak($message, $this->roomId); @@ -101,6 +101,7 @@ class Campfire implements \PHPCI\Plugin public function speak($message, $roomId, $isPaste = false) { $page = '/room/'.$roomId.'/speak.json'; + if ($isPaste) { $type = 'PasteMessage'; } else { @@ -143,10 +144,12 @@ class Campfire implements \PHPCI\Plugin // We tend to get one space with an otherwise blank response $output = trim($output); + if (strlen($output)) { /* Responses are JSON. Decode it to a data structure */ return json_decode($output); } + // Simple 200 OK response (such as for joining a room) return true; } diff --git a/PHPCI/Plugin/CleanBuild.php b/PHPCI/Plugin/CleanBuild.php index 2d33aee4..684e8e7a 100644 --- a/PHPCI/Plugin/CleanBuild.php +++ b/PHPCI/Plugin/CleanBuild.php @@ -39,9 +39,9 @@ class CleanBuild implements \PHPCI\Plugin */ public function __construct(Builder $phpci, Build $build, array $options = array()) { - $this->phpci = $phpci; - $this->build = $build; - $this->remove = isset($options['remove']) && is_array($options['remove']) ? $options['remove'] : array(); + $this->phpci = $phpci; + $this->build = $build; + $this->remove = isset($options['remove']) && is_array($options['remove']) ? $options['remove'] : array(); } /** @@ -57,7 +57,7 @@ class CleanBuild implements \PHPCI\Plugin $this->phpci->executeCommand($cmd, $this->phpci->buildPath . 'composer.lock'); $success = true; - + foreach ($this->remove as $file) { $ok = $this->phpci->executeCommand($cmd, $this->phpci->buildPath . $file); diff --git a/PHPCI/Plugin/Codeception.php b/PHPCI/Plugin/Codeception.php index 79f05cdf..c28e3a48 100644 --- a/PHPCI/Plugin/Codeception.php +++ b/PHPCI/Plugin/Codeception.php @@ -83,7 +83,7 @@ class Codeception implements \PHPCI\Plugin, \PHPCI\ZeroConfigPlugin { $this->phpci = $phpci; $this->build = $build; - $this->path = 'tests/_output/'; + $this->path = 'tests' . DIRECTORY_SEPARATOR . '_output' . DIRECTORY_SEPARATOR; if (empty($options['config'])) { $this->ymlConfigFile = self::findConfigFile($this->phpci->buildPath); @@ -148,9 +148,9 @@ class Codeception implements \PHPCI\Plugin, \PHPCI\ZeroConfigPlugin $output = $parser->parse(); $meta = array( - 'tests' => $parser->getTotalTests(), + 'tests' => $parser->getTotalTests(), 'timetaken' => $parser->getTotalTimeTaken(), - 'failures' => $parser->getTotalFailures() + 'failures' => $parser->getTotalFailures() ); $this->build->storeMeta('codeception-meta', $meta); diff --git a/PHPCI/Plugin/Composer.php b/PHPCI/Plugin/Composer.php index 38cf4d0e..7bd86ac3 100644 --- a/PHPCI/Plugin/Composer.php +++ b/PHPCI/Plugin/Composer.php @@ -38,7 +38,7 @@ class Composer implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin */ public static function canExecute($stage, Builder $builder, Build $build) { - $path = $builder->buildPath . '/composer.json'; + $path = $builder->buildPath . DIRECTORY_SEPARATOR . 'composer.json'; if (file_exists($path) && $stage == 'setup') { return true; @@ -55,16 +55,17 @@ class Composer implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin */ public function __construct(Builder $phpci, Build $build, array $options = array()) { - $path = $phpci->buildPath; - $this->phpci = $phpci; - $this->build = $build; - $this->directory = $path; - $this->action = 'install'; + $path = $phpci->buildPath; + $this->phpci = $phpci; + $this->build = $build; + $this->directory = $path; + $this->action = 'install'; $this->preferDist = false; - $this->nodev = false; + $this->preferSource = false; + $this->nodev = false; if (array_key_exists('directory', $options)) { - $this->directory = $path . '/' . $options['directory']; + $this->directory = $path . DIRECTORY_SEPARATOR . $options['directory']; } if (array_key_exists('action', $options)) { @@ -75,6 +76,11 @@ class Composer implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin $this->preferDist = (bool)$options['prefer_dist']; } + if (array_key_exists('prefer_source', $options)) { + $this->preferDist = false; + $this->preferSource = (bool)$options['prefer_source']; + } + if (array_key_exists('no_dev', $options)) { $this->nodev = (bool)$options['no_dev']; } @@ -97,10 +103,12 @@ class Composer implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin if ($this->preferDist) { $this->phpci->log('Using --prefer-dist flag'); - $cmd .= '--prefer-dist'; - } else { + $cmd .= ' --prefer-dist'; + } + + if ($this->preferSource) { $this->phpci->log('Using --prefer-source flag'); - $cmd .= '--prefer-source'; + $cmd .= ' --prefer-source'; } if ($this->nodev) { diff --git a/PHPCI/Plugin/CopyBuild.php b/PHPCI/Plugin/CopyBuild.php index 7f447291..f9646cac 100644 --- a/PHPCI/Plugin/CopyBuild.php +++ b/PHPCI/Plugin/CopyBuild.php @@ -35,12 +35,12 @@ class CopyBuild implements \PHPCI\Plugin */ public function __construct(Builder $phpci, Build $build, array $options = array()) { - $path = $phpci->buildPath; - $this->phpci = $phpci; - $this->build = $build; - $this->directory = isset($options['directory']) ? $options['directory'] : $path; - $this->wipe = isset($options['wipe']) ? (bool)$options['wipe'] : false; - $this->ignore = isset($options['respect_ignore']) ? (bool)$options['respect_ignore'] : false; + $path = $phpci->buildPath; + $this->phpci = $phpci; + $this->build = $build; + $this->directory = isset($options['directory']) ? $options['directory'] : $path; + $this->wipe = isset($options['wipe']) ? (bool)$options['wipe'] : false; + $this->ignore = isset($options['respect_ignore']) ? (bool)$options['respect_ignore'] : false; } /** diff --git a/PHPCI/Plugin/Deployer.php b/PHPCI/Plugin/Deployer.php index 2db839e3..9c56a340 100644 --- a/PHPCI/Plugin/Deployer.php +++ b/PHPCI/Plugin/Deployer.php @@ -23,6 +23,7 @@ class Deployer implements \PHPCI\Plugin { protected $webhookUrl; protected $reason; + protected $updateOnly; /** * Set up the plugin, configure options, etc. @@ -43,6 +44,8 @@ class Deployer implements \PHPCI\Plugin if (isset($options['reason'])) { $this->reason = $options['reason']; } + + $this->updateOnly = isset($options['update_only']) ? (bool) $options['update_only'] : true; } /** @@ -61,6 +64,8 @@ class Deployer implements \PHPCI\Plugin 'reason' => $this->phpci->interpolate($this->reason), 'source' => 'PHPCI', 'url' => $this->phpci->interpolate('%BUILD_URI%'), + 'branch' => $this->phpci->interpolate('%BRANCH%'), + 'update_only' => $this->updateOnly )); return $response['success']; diff --git a/PHPCI/Plugin/Email.php b/PHPCI/Plugin/Email.php index 8faa5bb7..17e235e2 100644 --- a/PHPCI/Plugin/Email.php +++ b/PHPCI/Plugin/Email.php @@ -52,9 +52,9 @@ class Email implements \PHPCI\Plugin Build $build, array $options = array() ) { - $this->phpci = $phpci; - $this->build = $build; - $this->options = $options; + $this->phpci = $phpci; + $this->build = $build; + $this->options = $options; } /** diff --git a/PHPCI/Plugin/Env.php b/PHPCI/Plugin/Env.php index 4e4b6563..b89bf67d 100644 --- a/PHPCI/Plugin/Env.php +++ b/PHPCI/Plugin/Env.php @@ -52,7 +52,7 @@ class Env implements \PHPCI\Plugin // This allows the standard syntax: "FOO: bar" $env_var = "$key=$value"; } - + if (!putenv($this->phpci->interpolate($env_var))) { $success = false; $this->phpci->logFailure(Lang::get('unable_to_set_env')); diff --git a/PHPCI/Plugin/Grunt.php b/PHPCI/Plugin/Grunt.php index 1ad0ceec..4d62ffd8 100644 --- a/PHPCI/Plugin/Grunt.php +++ b/PHPCI/Plugin/Grunt.php @@ -52,7 +52,7 @@ class Grunt implements \PHPCI\Plugin // Handle options: if (isset($options['directory'])) { - $this->directory = $path . '/' . $options['directory']; + $this->directory = $path . DIRECTORY_SEPARATOR . $options['directory']; } if (isset($options['task'])) { diff --git a/PHPCI/Plugin/Gulp.php b/PHPCI/Plugin/Gulp.php index 97ad9246..b6c6cab4 100644 --- a/PHPCI/Plugin/Gulp.php +++ b/PHPCI/Plugin/Gulp.php @@ -52,7 +52,7 @@ class Gulp implements \PHPCI\Plugin // Handle options: if (isset($options['directory'])) { - $this->directory = $path . '/' . $options['directory']; + $this->directory = $path . DIRECTORY_SEPARATOR . $options['directory']; } if (isset($options['task'])) { diff --git a/PHPCI/Plugin/Lint.php b/PHPCI/Plugin/Lint.php index 90436d70..a7ddc55c 100644 --- a/PHPCI/Plugin/Lint.php +++ b/PHPCI/Plugin/Lint.php @@ -41,9 +41,9 @@ class Lint implements PHPCI\Plugin */ public function __construct(Builder $phpci, Build $build, array $options = array()) { - $this->phpci = $phpci; + $this->phpci = $phpci; $this->build = $build; - $this->directories = array(''); + $this->directories = array(''); $this->ignore = $phpci->ignore; if (!empty($options['directory'])) { @@ -93,7 +93,7 @@ class Lint implements PHPCI\Plugin if ($item->isFile() && $item->getExtension() == 'php' && !$this->lintFile($php, $itemPath)) { $success = false; - } elseif ($item->isDir() && $this->recursive && !$this->lintDirectory($php, $itemPath . '/')) { + } elseif ($item->isDir() && $this->recursive && !$this->lintDirectory($php, $itemPath . DIRECTORY_SEPARATOR)) { $success = false; } diff --git a/PHPCI/Plugin/PackageBuild.php b/PHPCI/Plugin/PackageBuild.php index 09e4de0d..fb116640 100644 --- a/PHPCI/Plugin/PackageBuild.php +++ b/PHPCI/Plugin/PackageBuild.php @@ -33,12 +33,12 @@ class PackageBuild implements \PHPCI\Plugin */ public function __construct(Builder $phpci, Build $build, array $options = array()) { - $path = $phpci->buildPath; - $this->build = $build; - $this->phpci = $phpci; - $this->directory = isset($options['directory']) ? $options['directory'] : $path; - $this->filename = isset($options['filename']) ? $options['filename'] : 'build'; - $this->format = isset($options['format']) ? $options['format'] : 'zip'; + $path = $phpci->buildPath; + $this->build = $build; + $this->phpci = $phpci; + $this->directory = isset($options['directory']) ? $options['directory'] : $path; + $this->filename = isset($options['filename']) ? $options['filename'] : 'build'; + $this->format = isset($options['format']) ? $options['format'] : 'zip'; } /** @@ -46,7 +46,7 @@ class PackageBuild implements \PHPCI\Plugin */ public function execute() { - $path = $this->phpci->buildPath; + $path = $this->phpci->buildPath; $build = $this->build; if ($this->directory == $path) { diff --git a/PHPCI/Plugin/Pgsql.php b/PHPCI/Plugin/Pgsql.php index 9d0f924d..60057464 100644 --- a/PHPCI/Plugin/Pgsql.php +++ b/PHPCI/Plugin/Pgsql.php @@ -73,9 +73,9 @@ class Pgsql implements \PHPCI\Plugin } /** - * Connects to PgSQL and runs a specified set of queries. - * @return boolean - */ + * Connects to PgSQL and runs a specified set of queries. + * @return boolean + */ public function execute() { try { diff --git a/PHPCI/Plugin/Phar.php b/PHPCI/Plugin/Phar.php index 0500fddc..c734bb6c 100644 --- a/PHPCI/Plugin/Phar.php +++ b/PHPCI/Plugin/Phar.php @@ -213,7 +213,7 @@ class Phar implements \PHPCI\Plugin $content = ''; $filename = $this->getStub(); if ($filename) { - $content = file_get_contents($this->getPHPCI()->buildPath . '/' . $this->getStub()); + $content = file_get_contents($this->getPHPCI()->buildPath . DIRECTORY_SEPARATOR . $this->getStub()); } return $content; } @@ -227,7 +227,8 @@ class Phar implements \PHPCI\Plugin $success = false; try { - $phar = new PHPPhar($this->getDirectory() . '/' . $this->getFilename(), 0, $this->getFilename()); + $file = $this->getDirectory() . DIRECTORY_SEPARATOR . $this->getFilename(); + $phar = new PHPPhar($file, 0, $this->getFilename()); $phar->buildFromDirectory($this->getPHPCI()->buildPath, $this->getRegExp()); $stub = $this->getStubContent(); @@ -236,7 +237,6 @@ class Phar implements \PHPCI\Plugin } $success = true; - } catch (Exception $e) { $this->getPHPCI()->log(Lang::get('phar_internal_error')); $this->getPHPCI()->log($e->getMessage()); diff --git a/PHPCI/Plugin/Phing.php b/PHPCI/Plugin/Phing.php index 3a5bd834..e322b72e 100644 --- a/PHPCI/Plugin/Phing.php +++ b/PHPCI/Plugin/Phing.php @@ -47,7 +47,7 @@ class Phing implements \PHPCI\Plugin * Set working directory */ if (isset($options['directory'])) { - $directory = $phpci->buildPath . '/' . $options['directory']; + $directory = $phpci->buildPath . DIRECTORY_SEPARATOR . $options['directory']; } else { $directory = $phpci->buildPath; } @@ -255,7 +255,7 @@ class Phing implements \PHPCI\Plugin */ public function setPropertyFile($propertyFile) { - if (!file_exists($this->getDirectory() . '/' . $propertyFile)) { + if (!file_exists($this->getDirectory() . DIRECTORY_SEPARATOR . $propertyFile)) { throw new \Exception(Lang::get('property_file_missing')); } diff --git a/PHPCI/Plugin/PhpCpd.php b/PHPCI/Plugin/PhpCpd.php old mode 100644 new mode 100755 index cb766a16..aa076d2d --- a/PHPCI/Plugin/PhpCpd.php +++ b/PHPCI/Plugin/PhpCpd.php @@ -50,17 +50,12 @@ class PhpCpd implements \PHPCI\Plugin $this->build = $build; $this->path = $phpci->buildPath; - $this->standard = 'PSR1'; $this->ignore = $phpci->ignore; if (!empty($options['path'])) { $this->path = $phpci->buildPath . $options['path']; } - if (!empty($options['standard'])) { - $this->standard = $options['standard']; - } - if (!empty($options['ignore'])) { $this->ignore = $options['ignore']; } @@ -75,9 +70,9 @@ class PhpCpd implements \PHPCI\Plugin if (count($this->ignore)) { $map = function ($item) { // remove the trailing slash - $item = (substr($item, -1) == '/' ? substr($item, 0, -1) : $item); + $item = rtrim($item, DIRECTORY_SEPARATOR); - if (is_file($this->path . '/' . $item)) { + if (is_file(rtrim($this->path, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . $item)) { return ' --names-exclude ' . $item; } else { return ' --exclude ' . $item; diff --git a/PHPCI/Plugin/PhpCsFixer.php b/PHPCI/Plugin/PhpCsFixer.php index 817f3efc..9aa0d33f 100644 --- a/PHPCI/Plugin/PhpCsFixer.php +++ b/PHPCI/Plugin/PhpCsFixer.php @@ -32,10 +32,10 @@ class PhpCsFixer implements \PHPCI\Plugin protected $build; protected $workingDir = ''; - protected $level = ' --level=psr2'; - protected $verbose = ''; - protected $diff = ''; - protected $levels = array('psr0', 'psr1', 'psr2', 'symfony'); + protected $level = ' --level=psr2'; + protected $verbose = ''; + protected $diff = ''; + protected $levels = array('psr0', 'psr1', 'psr2', 'symfony'); /** * Standard Constructor diff --git a/PHPCI/Plugin/PhpLoc.php b/PHPCI/Plugin/PhpLoc.php index 76887493..c8dedb91 100644 --- a/PHPCI/Plugin/PhpLoc.php +++ b/PHPCI/Plugin/PhpLoc.php @@ -69,19 +69,20 @@ class PhpLoc implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin public function execute() { $ignore = ''; - if (count($this->phpci->ignore)) { - $map = function ($item) { - return ' --exclude ' . (substr($item, -1) == '/' ? substr($item, 0, -1) : $item); - }; - $ignore = array_map($map, $this->phpci->ignore); + if (count($this->phpci->ignore)) { + $map = function ($item) { + return ' --exclude ' . rtrim($item, DIRECTORY_SEPARATOR); + }; + + $ignore = array_map($map, $this->phpci->ignore); $ignore = implode('', $ignore); } $phploc = $this->phpci->findBinary('phploc'); $success = $this->phpci->executeCommand($phploc . ' %s "%s"', $ignore, $this->directory); - $output = $this->phpci->getLastOutput(); + $output = $this->phpci->getLastOutput(); if (preg_match_all('/\((LOC|CLOC|NCLOC|LLOC)\)\s+([0-9]+)/', $output, $matches)) { $data = array(); diff --git a/PHPCI/Plugin/PhpParallelLint.php b/PHPCI/Plugin/PhpParallelLint.php index 8b7528de..febed528 100644 --- a/PHPCI/Plugin/PhpParallelLint.php +++ b/PHPCI/Plugin/PhpParallelLint.php @@ -55,10 +55,10 @@ class PhpParallelLint implements \PHPCI\Plugin */ public function __construct(Builder $phpci, Build $build, array $options = array()) { - $this->phpci = $phpci; - $this->build = $build; - $this->directory = $phpci->buildPath; - $this->ignore = $this->phpci->ignore; + $this->phpci = $phpci; + $this->build = $build; + $this->directory = $phpci->buildPath; + $this->ignore = $this->phpci->ignore; if (isset($options['directory'])) { $this->directory = $phpci->buildPath.$options['directory']; diff --git a/PHPCI/Plugin/PhpTalLint.php b/PHPCI/Plugin/PhpTalLint.php index e12b6c34..8513ec36 100644 --- a/PHPCI/Plugin/PhpTalLint.php +++ b/PHPCI/Plugin/PhpTalLint.php @@ -155,7 +155,7 @@ class PhpTalLint implements PHPCI\Plugin if (!$this->lintFile($itemPath)) { $success = false; } - } elseif ($item->isDir() && $this->recursive && !$this->lintDirectory($itemPath . '/')) { + } elseif ($item->isDir() && $this->recursive && !$this->lintDirectory($itemPath . DIRECTORY_SEPARATOR)) { $success = false; } @@ -202,7 +202,9 @@ class PhpTalLint implements PHPCI\Plugin list($suffixes, $tales) = $this->getFlags(); - $lint = dirname(__FILE__) . '/../../vendor/phptal/phptal/tools/phptal_lint.php'; + $lint = dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR; + $lint .= 'vendor' . DIRECTORY_SEPARATOR . 'phptal' . DIRECTORY_SEPARATOR . 'phptal' . DIRECTORY_SEPARATOR; + $lint .= 'tools' . DIRECTORY_SEPARATOR . 'phptal_lint.php'; $cmd = '/usr/bin/env php ' . $lint . ' %s %s "%s"'; $this->phpci->executeCommand($cmd, $suffixes, $tales, $this->phpci->buildPath . $path); @@ -222,7 +224,7 @@ class PhpTalLint implements PHPCI\Plugin $row = str_replace('(use -i to include your custom modifier functions)', '', $row); $message = str_replace($name . ': ', '', $row); - + $parts = explode(' (line ', $message); $message = trim($parts[0]); diff --git a/PHPCI/Plugin/PhpUnit.php b/PHPCI/Plugin/PhpUnit.php index 9b8aeccc..f716f079 100644 --- a/PHPCI/Plugin/PhpUnit.php +++ b/PHPCI/Plugin/PhpUnit.php @@ -76,8 +76,8 @@ class PhpUnit implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin return 'phpunit.xml'; } - if (file_exists($buildPath . 'tests/phpunit.xml')) { - return 'tests/phpunit.xml'; + if (file_exists($buildPath . 'tests' . DIRECTORY_SEPARATOR . 'phpunit.xml')) { + return 'tests' . DIRECTORY_SEPARATOR . 'phpunit.xml'; } if (file_exists($buildPath . 'phpunit.xml.dist')) { @@ -85,7 +85,7 @@ class PhpUnit implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin } if (file_exists($buildPath . 'tests/phpunit.xml.dist')) { - return 'tests/phpunit.xml.dist'; + return 'tests' . DIRECTORY_SEPARATOR . 'phpunit.xml.dist'; } return null; @@ -194,7 +194,7 @@ class PhpUnit implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin } else { if ($this->runFrom) { $curdir = getcwd(); - chdir($this->phpci->buildPath.'/'.$this->runFrom); + chdir($this->phpci->buildPath . DIRECTORY_SEPARATOR . $this->runFrom); } $phpunit = $this->phpci->findBinary('phpunit'); diff --git a/PHPCI/Plugin/TechnicalDebt.php b/PHPCI/Plugin/TechnicalDebt.php index b7aa5bd8..6d4711b5 100755 --- a/PHPCI/Plugin/TechnicalDebt.php +++ b/PHPCI/Plugin/TechnicalDebt.php @@ -163,7 +163,7 @@ class TechnicalDebt implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin } // Ignore hidden files, else .git, .sass_cache, etc. all get looped over - if (stripos($filePath, '/.') !== false) { + if (stripos($filePath, DIRECTORY_SEPARATOR . '.') !== false) { $skipFile = true; } diff --git a/PHPCI/Plugin/Util/Factory.php b/PHPCI/Plugin/Util/Factory.php index 30c68340..b6d11e5e 100644 --- a/PHPCI/Plugin/Util/Factory.php +++ b/PHPCI/Plugin/Util/Factory.php @@ -8,8 +8,8 @@ namespace PHPCI\Plugin\Util; */ class Factory { - const TYPE_ARRAY = "array"; - const TYPE_CALLABLE = "callable"; + const TYPE_ARRAY = "array"; + const TYPE_CALLABLE = "callable"; const INTERFACE_PHPCI_PLUGIN = '\PHPCI\Plugin'; private $currentPluginOptions; diff --git a/PHPCI/Plugin/Util/FilesPluginInformation.php b/PHPCI/Plugin/Util/FilesPluginInformation.php index d5ccebd5..35587283 100644 --- a/PHPCI/Plugin/Util/FilesPluginInformation.php +++ b/PHPCI/Plugin/Util/FilesPluginInformation.php @@ -56,6 +56,7 @@ class FilesPluginInformation implements InstalledPluginInformation if ($this->pluginInfo === null) { $this->loadPluginInfo(); } + return $this->pluginInfo; } @@ -83,7 +84,7 @@ class FilesPluginInformation implements InstalledPluginInformation $this->pluginInfo = array(); foreach ($this->files as $fileInfo) { if ($fileInfo instanceof \SplFileInfo) { - if ($fileInfo->isFile() && $fileInfo->getExtension()=='php') { + if ($fileInfo->isFile() && $fileInfo->getExtension() == 'php') { $this->addPluginFromFile($fileInfo); } } @@ -99,11 +100,11 @@ class FilesPluginInformation implements InstalledPluginInformation $class = $this->getFullClassFromFile($fileInfo); if (!is_null($class)) { - $newPlugin = new \stdClass(); - $newPlugin->class = $class; + $newPlugin = new \stdClass(); + $newPlugin->class = $class; $newPlugin->source = "core"; - $parts = explode('\\', $newPlugin->class); - $newPlugin->name = end($parts); + $parts = explode('\\', $newPlugin->class); + $newPlugin->name = end($parts); $this->pluginInfo[] = $newPlugin; } @@ -123,11 +124,11 @@ class FilesPluginInformation implements InstalledPluginInformation if (isset($matches[1])) { $className = $matches[1]; - + $matches = array(); preg_match('#namespace +([A-Za-z\\\\]+);#i', $contents, $matches); $namespace = $matches[1]; - + return $namespace . '\\' . $className; } else { return null; diff --git a/PHPCI/Plugin/Util/PluginInformationCollection.php b/PHPCI/Plugin/Util/PluginInformationCollection.php index 16341733..906935e5 100644 --- a/PHPCI/Plugin/Util/PluginInformationCollection.php +++ b/PHPCI/Plugin/Util/PluginInformationCollection.php @@ -32,9 +32,11 @@ class PluginInformationCollection implements InstalledPluginInformation public function getInstalledPlugins() { $arr = array(); + foreach ($this->pluginInformations as $single) { $arr = array_merge($arr, $single->getInstalledPlugins()); } + return $arr; } @@ -47,9 +49,11 @@ class PluginInformationCollection implements InstalledPluginInformation public function getPluginClasses() { $arr = array(); + foreach ($this->pluginInformations as $single) { $arr = array_merge($arr, $single->getPluginClasses()); } + return $arr; } } diff --git a/PHPCI/Plugin/Util/TapParser.php b/PHPCI/Plugin/Util/TapParser.php index b48f6f00..86981566 100644 --- a/PHPCI/Plugin/Util/TapParser.php +++ b/PHPCI/Plugin/Util/TapParser.php @@ -235,18 +235,20 @@ class TapParser */ protected function processYamlBlock($indent) { - $startLine = $this->lineNumber+1; - $endLine = $indent.'...'; + $startLine = $this->lineNumber + 1; + $endLine = $indent . '...'; $yamlLines = array(); + do { $line = $this->nextLine(); + if ($line === false) { throw new Exception(Lang::get('tap_error_endless_yaml', $startLine)); } elseif ($line === $endLine) { break; } - $yamlLines[] = substr($line, strlen($indent)); + $yamlLines[] = substr($line, strlen($indent)); } while (true); return Yaml::parse(join("\n", $yamlLines)); diff --git a/PHPCI/Plugin/Util/TestResultParsers/Codeception.php b/PHPCI/Plugin/Util/TestResultParsers/Codeception.php index 249579be..24af62e4 100644 --- a/PHPCI/Plugin/Util/TestResultParsers/Codeception.php +++ b/PHPCI/Plugin/Util/TestResultParsers/Codeception.php @@ -20,6 +20,7 @@ class Codeception implements ParserInterface protected $totalTests; protected $totalTimeTaken; protected $totalFailures; + protected $totalErrors; /** * @param Builder $phpci @@ -29,7 +30,6 @@ class Codeception implements ParserInterface { $this->phpci = $phpci; $this->resultsXml = $resultsXml; - $this->totalTests = 0; } @@ -47,6 +47,7 @@ class Codeception implements ParserInterface $this->totalTests += (int) $testsuite['tests']; $this->totalTimeTaken += (float) $testsuite['time']; $this->totalFailures += (int) $testsuite['failures']; + $this->totalErrors += (int) $testsuite['errors']; foreach ($testsuite->testcase as $testcase) { $testresult = array( @@ -67,9 +68,9 @@ class Codeception implements ParserInterface $testresult['feature'] = sprintf('%s::%s', $testresult['class'], $testresult['name']); } - if (isset($testcase->failure)) { + if (isset($testcase->failure) || isset($testcase->error)) { $testresult['pass'] = false; - $testresult['message'] = (string) $testcase->failure; + $testresult['message'] = (string)$testcase->failure . (string)$testcase->error; } else { $testresult['pass'] = true; } @@ -108,6 +109,6 @@ class Codeception implements ParserInterface */ public function getTotalFailures() { - return $this->totalFailures; + return $this->totalFailures + $this->totalErrors; } } diff --git a/PHPCI/Plugin/Xmpp.php b/PHPCI/Plugin/Xmpp.php index 0362aa85..ccfc4399 100644 --- a/PHPCI/Plugin/Xmpp.php +++ b/PHPCI/Plugin/Xmpp.php @@ -132,8 +132,9 @@ class XMPP implements \PHPCI\Plugin */ public function findConfigFile() { - if (file_exists($this->phpci->buildPath . '/.sendxmpprc')) { - if (md5(file_get_contents($this->phpci->buildPath . '/.sendxmpprc')) !== md5($this->getConfigFormat())) { + if (file_exists($this->phpci->buildPath . DIRECTORY_SEPARATOR . '.sendxmpprc')) { + if (md5(file_get_contents($this->phpci->buildPath . DIRECTORY_SEPARATOR . '.sendxmpprc')) + !== md5($this->getConfigFormat())) { return null; } @@ -160,7 +161,7 @@ class XMPP implements \PHPCI\Plugin /* * Try to build conf file */ - $config_file = $this->phpci->buildPath . '/.sendxmpprc'; + $config_file = $this->phpci->buildPath . DIRECTORY_SEPARATOR . '.sendxmpprc'; if (is_null($this->findConfigFile())) { file_put_contents($config_file, $this->getConfigFormat()); chmod($config_file, 0600); @@ -174,7 +175,7 @@ class XMPP implements \PHPCI\Plugin $tls = ' -t'; } - $message_file = $this->phpci->buildPath . '/' . uniqid('xmppmessage'); + $message_file = $this->phpci->buildPath . DIRECTORY_SEPARATOR . uniqid('xmppmessage'); if ($this->buildMessage($message_file) === false) { return false; } diff --git a/PHPCI/Service/BuildService.php b/PHPCI/Service/BuildService.php index dca0fc0d..a120a64e 100644 --- a/PHPCI/Service/BuildService.php +++ b/PHPCI/Service/BuildService.php @@ -30,6 +30,11 @@ class BuildService */ protected $buildStore; + /** + * @var bool + */ + public $queueError = false; + /** * @param BuildStore $buildStore */ @@ -155,27 +160,30 @@ class BuildService } $config = Config::getInstance(); - $settings = $config->get('phpci.worker', []); if (!empty($settings['host']) && !empty($settings['queue'])) { - $jobData = array( - 'type' => 'phpci.build', - 'build_id' => $build->getId(), - ); + try { + $jobData = array( + 'type' => 'phpci.build', + 'build_id' => $build->getId(), + ); - if ($config->get('using_custom_file')) { - $jobData['config'] = $config->getArray(); + if ($config->get('using_custom_file')) { + $jobData['config'] = $config->getArray(); + } + + $pheanstalk = new Pheanstalk($settings['host']); + $pheanstalk->useTube($settings['queue']); + $pheanstalk->put( + json_encode($jobData), + PheanstalkInterface::DEFAULT_PRIORITY, + PheanstalkInterface::DEFAULT_DELAY, + $config->get('phpci.worker.job_timeout', 600) + ); + } catch (\Exception $ex) { + $this->queueError = true; } - - $pheanstalk = new Pheanstalk($settings['host']); - $pheanstalk->useTube($settings['queue']); - $pheanstalk->put( - json_encode($jobData), - PheanstalkInterface::DEFAULT_PRIORITY, - PheanstalkInterface::DEFAULT_DELAY, - $config->get('phpci.worker.job_timeout', 600) - ); } } } diff --git a/PHPCI/Store/BuildErrorStore.php b/PHPCI/Store/BuildErrorStore.php index 9ba92310..c2d32468 100644 --- a/PHPCI/Store/BuildErrorStore.php +++ b/PHPCI/Store/BuildErrorStore.php @@ -31,7 +31,7 @@ class BuildErrorStore extends BuildErrorStoreBase $query .= ' AND created_date > :since'; } - $query .= ' LIMIT 5000'; + $query .= ' LIMIT 15000'; $stmt = Database::getConnection('read')->prepare($query); @@ -54,4 +54,27 @@ class BuildErrorStore extends BuildErrorStoreBase return array(); } } + + /** + * Gets the total number of errors for a given build. + * @param $buildId + * @param string $since date string + * @return array + */ + public function getErrorTotalForBuild($buildId) + { + $query = 'SELECT COUNT(*) AS total FROM build_error + WHERE build_id = :build'; + + $stmt = Database::getConnection('read')->prepare($query); + + $stmt->bindValue(':build', $buildId, \PDO::PARAM_INT); + + if ($stmt->execute()) { + $res = $stmt->fetch(\PDO::FETCH_ASSOC); + return $res['total']; + } else { + return array(); + } + } } diff --git a/PHPCI/Store/BuildStore.php b/PHPCI/Store/BuildStore.php index 9974c7b3..d6feb084 100644 --- a/PHPCI/Store/BuildStore.php +++ b/PHPCI/Store/BuildStore.php @@ -165,6 +165,7 @@ class BuildStore extends BuildStoreBase $stmt->bindValue(':projectId', (int)$projectId, \PDO::PARAM_INT); $stmt->bindValue(':buildId', (int)$buildId, \PDO::PARAM_INT); $stmt->bindValue(':numResults', (int)$numResults, \PDO::PARAM_INT); + if (!is_null($branch)) { $stmt->bindValue(':branch', $branch, \PDO::PARAM_STR); } @@ -183,7 +184,6 @@ class BuildStore extends BuildStoreBase } else { return $rtn; } - } else { return null; } diff --git a/PHPCI/View/Build/view.phtml b/PHPCI/View/Build/view.phtml index 03f23368..61fafd33 100644 --- a/PHPCI/View/Build/view.phtml +++ b/PHPCI/View/Build/view.phtml @@ -149,7 +149,6 @@ - diff --git a/PHPCI/View/layout.phtml b/PHPCI/View/layout.phtml index 2e105c18..1960aff6 100644 --- a/PHPCI/View/layout.phtml +++ b/PHPCI/View/layout.phtml @@ -292,6 +292,14 @@
+ ' . $message . ''; + } + ?> +
diff --git a/README.md b/README.md index b30439e5..77683b91 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,13 @@ PHPCI is a free and open source (BSD License) continuous integration tool specif We have a chat room for discussing PHPCI, you can access it here: [![Gitter](https://badges.gitter.im/Join Chat.svg)](https://gitter.im/Block8/PHPCI?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=body_badge) -##What it does: +**Support the development of PHPCI** + +We [now accept donations](https://www.phptesting.org/support) to directly support the ongoing development of PHPCI. There is of course no obligation to donate, nor any commitment if you do. + +[Donate](https://www.phptesting.org/support) + +## What it does: * Clones your project from Github, Bitbucket or a local path * Allows you to set up and tear down test databases. * Installs your project's Composer dependencies. @@ -19,17 +25,17 @@ We have a chat room for discussing PHPCI, you can access it here: [![Gitter](htt * You can mark directories for the plugins to ignore. * You can mark certain plugins as being allowed to fail (but still run.) -##What it doesn't do (yet): -* Virtualised testing. *(In progress)* -* Multiple PHP-version tests. *(In progress)* +### What it doesn't do (yet): +* Virtualised testing. +* Multiple PHP-version tests. * Install PEAR or PECL extensions. -* [Deployments](http://phpdeployment.org) +* Deployments - We strongly recommend using [Deployer](http://phpdeployment.org) ## Getting Started: We've got documentation on our website on [installing PHPCI](https://www.phptesting.org/install-phpci) and [adding support for PHPCI to your projects](https://www.phptesting.org/wiki/Adding-PHPCI-Support-to-Your-Projects). -##Contributing -Contributions from others would be very much appreciated! Please read our [guide to contributing](https://www.phptesting.org/wiki/Contributing-to-PHPCI) for more information on how to get involved. +## Contributing +Contributions from others would be very much appreciated! Please read our [guide to contributing](https://github.com/Block8/PHPCI/blob/master/.github/CONTRIBUTING.md) for more information on how to get involved. -##Questions? -Your best place to go is the [mailing list](https://groups.google.com/forum/#!forum/php-ci), if you're already a member of the mailing list, you can simply email php-ci@googlegroups.com. +## Questions? +Your best place to go is the [mailing list](https://groups.google.com/forum/#!forum/php-ci). If you're already a member of the mailing list, you can simply email php-ci@googlegroups.com. diff --git a/Tests/PHPCI/Command/InstallCommandTest.php b/Tests/PHPCI/Command/InstallCommandTest.php index 040a4803..5d70f31c 100644 --- a/Tests/PHPCI/Command/InstallCommandTest.php +++ b/Tests/PHPCI/Command/InstallCommandTest.php @@ -107,6 +107,7 @@ class InstallCommandTest extends \PHPUnit_Framework_TestCase '--admin-name' => 'phpci4', '--admin-pass' => 'phpci5', '--url' => 'http://test.phpci.org', + '--queue-disabled' => null, ); if (!is_null($exclude)) { diff --git a/composer.lock b/composer.lock index 18b8d3de..9714ff78 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,8 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "f6333ad0763856ed7556296617a7c190", - "content-hash": "6ad9542b5f5959b67d94baf77e2fc45a", + "hash": "de65276e03e231d7072c744a3c63662e", + "content-hash": "1d9f6f487e6d906bbed73e2667c276d6", "packages": [ { "name": "block8/b8framework", @@ -151,16 +151,16 @@ }, { "name": "guzzlehttp/guzzle", - "version": "6.1.0", + "version": "6.2.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "66fd14b4d0b8f2389eaf37c5458608c7cb793a81" + "reference": "d094e337976dff9d8e2424e8485872194e768662" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/66fd14b4d0b8f2389eaf37c5458608c7cb793a81", - "reference": "66fd14b4d0b8f2389eaf37c5458608c7cb793a81", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d094e337976dff9d8e2424e8485872194e768662", + "reference": "d094e337976dff9d8e2424e8485872194e768662", "shasum": "" }, "require": { @@ -176,7 +176,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "6.1-dev" + "dev-master": "6.2-dev" } }, "autoload": { @@ -209,20 +209,20 @@ "rest", "web service" ], - "time": "2015-09-08 17:36:26" + "time": "2016-03-21 20:02:09" }, { "name": "guzzlehttp/promises", - "version": "1.0.2", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "97fe7210def29451ec74923b27e552238defd75a" + "reference": "bb9024c526b22f3fe6ae55a561fd70653d470aa8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/97fe7210def29451ec74923b27e552238defd75a", - "reference": "97fe7210def29451ec74923b27e552238defd75a", + "url": "https://api.github.com/repos/guzzle/promises/zipball/bb9024c526b22f3fe6ae55a561fd70653d470aa8", + "reference": "bb9024c526b22f3fe6ae55a561fd70653d470aa8", "shasum": "" }, "require": { @@ -260,20 +260,20 @@ "keywords": [ "promise" ], - "time": "2015-08-15 19:37:21" + "time": "2016-03-08 01:15:46" }, { "name": "guzzlehttp/psr7", - "version": "1.2.0", + "version": "1.3.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "4ef919b0cf3b1989523138b60163bbcb7ba1ff7e" + "reference": "31382fef2889136415751badebbd1cb022a4ed72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/4ef919b0cf3b1989523138b60163bbcb7ba1ff7e", - "reference": "4ef919b0cf3b1989523138b60163bbcb7ba1ff7e", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/31382fef2889136415751badebbd1cb022a4ed72", + "reference": "31382fef2889136415751badebbd1cb022a4ed72", "shasum": "" }, "require": { @@ -318,7 +318,7 @@ "stream", "uri" ], - "time": "2015-08-15 19:32:36" + "time": "2016-04-13 19:56:01" }, { "name": "hipchat/hipchat-php", @@ -455,16 +455,16 @@ }, { "name": "monolog/monolog", - "version": "1.17.2", + "version": "1.19.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "bee7f0dc9c3e0b69a6039697533dca1e845c8c24" + "reference": "5f56ed5212dc509c8dc8caeba2715732abb32dbf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/bee7f0dc9c3e0b69a6039697533dca1e845c8c24", - "reference": "bee7f0dc9c3e0b69a6039697533dca1e845c8c24", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/5f56ed5212dc509c8dc8caeba2715732abb32dbf", + "reference": "5f56ed5212dc509c8dc8caeba2715732abb32dbf", "shasum": "" }, "require": { @@ -479,13 +479,13 @@ "doctrine/couchdb": "~1.0@dev", "graylog2/gelf-php": "~1.0", "jakub-onderka/php-parallel-lint": "0.9", + "php-amqplib/php-amqplib": "~2.4", "php-console/php-console": "^3.1.3", "phpunit/phpunit": "~4.5", "phpunit/phpunit-mock-objects": "2.3.0", "raven/raven": "^0.13", "ruflin/elastica": ">=0.90 <3.0", - "swiftmailer/swiftmailer": "~5.3", - "videlalvaro/php-amqplib": "~2.4" + "swiftmailer/swiftmailer": "~5.3" }, "suggest": { "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", @@ -493,16 +493,17 @@ "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", "ext-mongo": "Allow sending log messages to a MongoDB server", "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", "php-console/php-console": "Allow sending log messages to Google Chrome", "raven/raven": "Allow sending log messages to a Sentry server", "rollbar/rollbar": "Allow sending log messages to Rollbar", - "ruflin/elastica": "Allow sending log messages to an Elastic Search server", - "videlalvaro/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib" + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.16.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { @@ -528,7 +529,7 @@ "logging", "psr-3" ], - "time": "2015-10-14 12:51:02" + "time": "2016-04-12 18:29:35" }, { "name": "mremi/flowdock", @@ -662,7 +663,9 @@ "authors": [ { "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" } ], "description": "Pimple is a simple Dependency Injection Container for PHP 5.3", @@ -762,27 +765,26 @@ }, { "name": "robmorgan/phinx", - "version": "v0.4.6", + "version": "v0.5.3", "source": { "type": "git", "url": "https://github.com/robmorgan/phinx.git", - "reference": "1351ca36dd2419d7de02afd1aaa415929112d7f1" + "reference": "4e7fee7792f4bf3dbf55ee29001850ba26c86a88" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/robmorgan/phinx/zipball/1351ca36dd2419d7de02afd1aaa415929112d7f1", - "reference": "1351ca36dd2419d7de02afd1aaa415929112d7f1", + "url": "https://api.github.com/repos/robmorgan/phinx/zipball/4e7fee7792f4bf3dbf55ee29001850ba26c86a88", + "reference": "4e7fee7792f4bf3dbf55ee29001850ba26c86a88", "shasum": "" }, "require": { - "php": ">=5.3.2", - "symfony/config": "~2.7", - "symfony/console": "~2.7", - "symfony/yaml": "~2.7" + "php": ">=5.4", + "symfony/config": "~2.8|~3.0", + "symfony/console": "~2.8|~3.0", + "symfony/yaml": "~2.8|~3.0" }, "require-dev": { - "phpunit/phpunit": "3.7.*", - "squizlabs/php_codesniffer": "dev-phpcs-fixer" + "phpunit/phpunit": "^3.7|^4.0|^5.0" }, "bin": [ "bin/phinx" @@ -820,7 +822,7 @@ "migrations", "phinx" ], - "time": "2015-09-11 15:44:41" + "time": "2016-03-07 14:09:22" }, { "name": "sensiolabs/ansi-to-html", @@ -921,35 +923,38 @@ }, { "name": "symfony/config", - "version": "v2.7.5", + "version": "v3.0.4", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "9698fdf0a750d6887d5e7729d5cf099765b20e61" + "reference": "980ee40c28f00acff8906c11b778aab5f0db74c2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/9698fdf0a750d6887d5e7729d5cf099765b20e61", - "reference": "9698fdf0a750d6887d5e7729d5cf099765b20e61", + "url": "https://api.github.com/repos/symfony/config/zipball/980ee40c28f00acff8906c11b778aab5f0db74c2", + "reference": "980ee40c28f00acff8906c11b778aab5f0db74c2", "shasum": "" }, "require": { - "php": ">=5.3.9", - "symfony/filesystem": "~2.3" + "php": ">=5.5.9", + "symfony/filesystem": "~2.8|~3.0" }, - "require-dev": { - "symfony/phpunit-bridge": "~2.7" + "suggest": { + "symfony/yaml": "To use the yaml reference dumper" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.7-dev" + "dev-master": "3.0-dev" } }, "autoload": { "psr-4": { "Symfony\\Component\\Config\\": "" - } + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -967,30 +972,30 @@ ], "description": "Symfony Config Component", "homepage": "https://symfony.com", - "time": "2015-09-21 15:02:29" + "time": "2016-03-04 07:55:57" }, { "name": "symfony/console", - "version": "v2.7.5", + "version": "v2.8.4", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "06cb17c013a82f94a3d840682b49425cd00a2161" + "reference": "9a5aef5fc0d4eff86853d44202b02be8d5a20154" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/06cb17c013a82f94a3d840682b49425cd00a2161", - "reference": "06cb17c013a82f94a3d840682b49425cd00a2161", + "url": "https://api.github.com/repos/symfony/console/zipball/9a5aef5fc0d4eff86853d44202b02be8d5a20154", + "reference": "9a5aef5fc0d4eff86853d44202b02be8d5a20154", "shasum": "" }, "require": { - "php": ">=5.3.9" + "php": ">=5.3.9", + "symfony/polyfill-mbstring": "~1.0" }, "require-dev": { "psr/log": "~1.0", - "symfony/event-dispatcher": "~2.1", - "symfony/phpunit-bridge": "~2.7", - "symfony/process": "~2.1" + "symfony/event-dispatcher": "~2.1|~3.0.0", + "symfony/process": "~2.1|~3.0.0" }, "suggest": { "psr/log": "For using the console logger", @@ -1000,13 +1005,16 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.7-dev" + "dev-master": "2.8-dev" } }, "autoload": { "psr-4": { "Symfony\\Component\\Console\\": "" - } + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1024,20 +1032,20 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2015-09-25 08:32:23" + "time": "2016-03-17 09:19:04" }, { "name": "symfony/event-dispatcher", - "version": "v2.7.5", + "version": "v2.8.4", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "ae4dcc2a8d3de98bd794167a3ccda1311597c5d9" + "reference": "47d2d8cade9b1c3987573d2943bb9352536cdb87" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/ae4dcc2a8d3de98bd794167a3ccda1311597c5d9", - "reference": "ae4dcc2a8d3de98bd794167a3ccda1311597c5d9", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/47d2d8cade9b1c3987573d2943bb9352536cdb87", + "reference": "47d2d8cade9b1c3987573d2943bb9352536cdb87", "shasum": "" }, "require": { @@ -1045,11 +1053,10 @@ }, "require-dev": { "psr/log": "~1.0", - "symfony/config": "~2.0,>=2.0.5", - "symfony/dependency-injection": "~2.6", - "symfony/expression-language": "~2.6", - "symfony/phpunit-bridge": "~2.7", - "symfony/stopwatch": "~2.3" + "symfony/config": "~2.0,>=2.0.5|~3.0.0", + "symfony/dependency-injection": "~2.6|~3.0.0", + "symfony/expression-language": "~2.6|~3.0.0", + "symfony/stopwatch": "~2.3|~3.0.0" }, "suggest": { "symfony/dependency-injection": "", @@ -1058,13 +1065,16 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.7-dev" + "dev-master": "2.8-dev" } }, "autoload": { "psr-4": { "Symfony\\Component\\EventDispatcher\\": "" - } + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1082,38 +1092,38 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2015-09-22 13:49:29" + "time": "2016-03-07 14:04:32" }, { "name": "symfony/filesystem", - "version": "v2.7.5", + "version": "v3.0.4", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "a17f8a17c20e8614c15b8e116e2f4bcde102cfab" + "reference": "f82499a459dcade2ea56df94cc58b19c8bde3d20" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/a17f8a17c20e8614c15b8e116e2f4bcde102cfab", - "reference": "a17f8a17c20e8614c15b8e116e2f4bcde102cfab", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/f82499a459dcade2ea56df94cc58b19c8bde3d20", + "reference": "f82499a459dcade2ea56df94cc58b19c8bde3d20", "shasum": "" }, "require": { - "php": ">=5.3.9" - }, - "require-dev": { - "symfony/phpunit-bridge": "~2.7" + "php": ">=5.5.9" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.7-dev" + "dev-master": "3.0-dev" } }, "autoload": { "psr-4": { "Symfony\\Component\\Filesystem\\": "" - } + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1131,38 +1141,97 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2015-09-09 17:42:36" + "time": "2016-03-27 10:24:39" }, { - "name": "symfony/yaml", - "version": "v2.7.5", + "name": "symfony/polyfill-mbstring", + "version": "v1.1.1", "source": { "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "31cb2ad0155c95b88ee55fe12bc7ff92232c1770" + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "1289d16209491b584839022f29257ad859b8532d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/31cb2ad0155c95b88ee55fe12bc7ff92232c1770", - "reference": "31cb2ad0155c95b88ee55fe12bc7ff92232c1770", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/1289d16209491b584839022f29257ad859b8532d", + "reference": "1289d16209491b584839022f29257ad859b8532d", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "time": "2016-01-20 09:13:37" + }, + { + "name": "symfony/yaml", + "version": "v2.8.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "584e52cb8f788a887553ba82db6caacb1d6260bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/584e52cb8f788a887553ba82db6caacb1d6260bb", + "reference": "584e52cb8f788a887553ba82db6caacb1d6260bb", "shasum": "" }, "require": { "php": ">=5.3.9" }, - "require-dev": { - "symfony/phpunit-bridge": "~2.7" - }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.7-dev" + "dev-master": "2.8-dev" } }, "autoload": { "psr-4": { "Symfony\\Component\\Yaml\\": "" - } + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1180,7 +1249,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2015-09-14 14:14:09" + "time": "2016-03-04 07:54:35" } ], "packages-dev": [ @@ -1340,26 +1409,26 @@ }, { "name": "pdepend/pdepend", - "version": "2.2.1", + "version": "2.2.4", "source": { "type": "git", "url": "https://github.com/pdepend/pdepend.git", - "reference": "a77b6bede0afdd232155eb6f1de0b2826bcf2803" + "reference": "b086687f3a01dc6bb92d633aef071d2c5dd0db06" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pdepend/pdepend/zipball/a77b6bede0afdd232155eb6f1de0b2826bcf2803", - "reference": "a77b6bede0afdd232155eb6f1de0b2826bcf2803", + "url": "https://api.github.com/repos/pdepend/pdepend/zipball/b086687f3a01dc6bb92d633aef071d2c5dd0db06", + "reference": "b086687f3a01dc6bb92d633aef071d2c5dd0db06", "shasum": "" }, "require": { "php": ">=5.3.7", - "symfony/config": "^2.3.0", - "symfony/dependency-injection": "^2.3.0", - "symfony/filesystem": "^2.3.0" + "symfony/config": "^2.3.0|^3", + "symfony/dependency-injection": "^2.3.0|^3", + "symfony/filesystem": "^2.3.0|^3" }, "require-dev": { - "phpunit/phpunit": "^4.0.0", + "phpunit/phpunit": "^4.4.0,<4.8", "squizlabs/php_codesniffer": "^2.0.0" }, "bin": [ @@ -1367,8 +1436,8 @@ ], "type": "library", "autoload": { - "psr-0": { - "PDepend\\": "src/main/php/" + "psr-4": { + "PDepend\\": "src/main/php/PDepend" } }, "notification-url": "https://packagist.org/downloads/", @@ -1376,7 +1445,7 @@ "BSD-3-Clause" ], "description": "Official version of pdepend to be handled with Composer", - "time": "2015-09-24 14:17:05" + "time": "2016-03-10 15:15:04" }, { "name": "phpdocumentor/reflection-docblock", @@ -1429,16 +1498,16 @@ }, { "name": "phploc/phploc", - "version": "2.1.4", + "version": "2.1.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phploc.git", - "reference": "6cdf01336c06d20825831fe8cee70764fe373585" + "reference": "50e063abd41833b3a5d29a2e8fbef5859ac28bdc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phploc/zipball/6cdf01336c06d20825831fe8cee70764fe373585", - "reference": "6cdf01336c06d20825831fe8cee70764fe373585", + "url": "https://api.github.com/repos/sebastianbergmann/phploc/zipball/50e063abd41833b3a5d29a2e8fbef5859ac28bdc", + "reference": "50e063abd41833b3a5d29a2e8fbef5859ac28bdc", "shasum": "" }, "require": { @@ -1478,24 +1547,24 @@ ], "description": "A tool for quickly measuring the size of a PHP project.", "homepage": "https://github.com/sebastianbergmann/phploc", - "time": "2015-08-04 07:41:00" + "time": "2015-10-22 13:44:19" }, { "name": "phpmd/phpmd", - "version": "2.3.2", + "version": "2.4.3", "source": { "type": "git", "url": "https://github.com/phpmd/phpmd.git", - "reference": "08b5bcd454a7148579b68931fc500d824afd3bb5" + "reference": "2b9c2417a18696dfb578b38c116cd0ddc19b256e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpmd/phpmd/zipball/08b5bcd454a7148579b68931fc500d824afd3bb5", - "reference": "08b5bcd454a7148579b68931fc500d824afd3bb5", + "url": "https://api.github.com/repos/phpmd/phpmd/zipball/2b9c2417a18696dfb578b38c116cd0ddc19b256e", + "reference": "2b9c2417a18696dfb578b38c116cd0ddc19b256e", "shasum": "" }, "require": { - "pdepend/pdepend": "~2.0", + "pdepend/pdepend": "^2.0.4", "php": ">=5.3.0" }, "require-dev": { @@ -1543,26 +1612,28 @@ "phpmd", "pmd" ], - "time": "2015-09-24 14:37:49" + "time": "2016-04-04 11:52:04" }, { "name": "phpspec/prophecy", - "version": "v1.5.0", + "version": "v1.6.0", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "4745ded9307786b730d7a60df5cb5a6c43cf95f7" + "reference": "3c91bdf81797d725b14cb62906f9a4ce44235972" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4745ded9307786b730d7a60df5cb5a6c43cf95f7", - "reference": "4745ded9307786b730d7a60df5cb5a6c43cf95f7", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/3c91bdf81797d725b14cb62906f9a4ce44235972", + "reference": "3c91bdf81797d725b14cb62906f9a4ce44235972", "shasum": "" }, "require": { "doctrine/instantiator": "^1.0.2", + "php": "^5.3|^7.0", "phpdocumentor/reflection-docblock": "~2.0", - "sebastian/comparator": "~1.1" + "sebastian/comparator": "~1.1", + "sebastian/recursion-context": "~1.0" }, "require-dev": { "phpspec/phpspec": "~2.0" @@ -1570,7 +1641,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.4.x-dev" + "dev-master": "1.5.x-dev" } }, "autoload": { @@ -1603,7 +1674,7 @@ "spy", "stub" ], - "time": "2015-08-13 10:07:40" + "time": "2016-02-15 07:46:21" }, { "name": "phpunit/php-code-coverage", @@ -1847,16 +1918,16 @@ }, { "name": "phpunit/phpunit", - "version": "4.8.13", + "version": "4.8.24", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "be067d6105286b74272facefc2697038f8807b77" + "reference": "a1066c562c52900a142a0e2bbf0582994671385e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/be067d6105286b74272facefc2697038f8807b77", - "reference": "be067d6105286b74272facefc2697038f8807b77", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a1066c562c52900a142a0e2bbf0582994671385e", + "reference": "a1066c562c52900a142a0e2bbf0582994671385e", "shasum": "" }, "require": { @@ -1915,7 +1986,7 @@ "testing", "xunit" ], - "time": "2015-10-14 13:49:40" + "time": "2016-03-14 06:16:08" }, { "name": "phpunit/phpunit-mock-objects", @@ -2039,28 +2110,28 @@ }, { "name": "sebastian/diff", - "version": "1.3.0", + "version": "1.4.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3" + "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/863df9687835c62aa423a22412d26fa2ebde3fd3", - "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e", + "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e", "shasum": "" }, "require": { "php": ">=5.3.3" }, "require-dev": { - "phpunit/phpunit": "~4.2" + "phpunit/phpunit": "~4.8" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3-dev" + "dev-master": "1.4-dev" } }, "autoload": { @@ -2083,24 +2154,24 @@ } ], "description": "Diff implementation", - "homepage": "http://www.github.com/sebastianbergmann/diff", + "homepage": "https://github.com/sebastianbergmann/diff", "keywords": [ "diff" ], - "time": "2015-02-22 15:13:53" + "time": "2015-12-08 07:14:41" }, { "name": "sebastian/environment", - "version": "1.3.2", + "version": "1.3.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "6324c907ce7a52478eeeaede764f48733ef5ae44" + "reference": "dc7a29032cf72b54f36dac15a1ca5b3a1b6029bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6324c907ce7a52478eeeaede764f48733ef5ae44", - "reference": "6324c907ce7a52478eeeaede764f48733ef5ae44", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/dc7a29032cf72b54f36dac15a1ca5b3a1b6029bf", + "reference": "dc7a29032cf72b54f36dac15a1ca5b3a1b6029bf", "shasum": "" }, "require": { @@ -2137,7 +2208,7 @@ "environment", "hhvm" ], - "time": "2015-08-03 06:14:51" + "time": "2016-02-26 18:40:46" }, { "name": "sebastian/exporter", @@ -2207,20 +2278,20 @@ }, { "name": "sebastian/finder-facade", - "version": "1.2.0", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/finder-facade.git", - "reference": "a520dcc3dd39160eea480daa3426f4fd419a327b" + "reference": "2a6f7f57efc0aa2d23297d9fd9e2a03111a8c0b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/finder-facade/zipball/a520dcc3dd39160eea480daa3426f4fd419a327b", - "reference": "a520dcc3dd39160eea480daa3426f4fd419a327b", + "url": "https://api.github.com/repos/sebastianbergmann/finder-facade/zipball/2a6f7f57efc0aa2d23297d9fd9e2a03111a8c0b9", + "reference": "2a6f7f57efc0aa2d23297d9fd9e2a03111a8c0b9", "shasum": "" }, "require": { - "symfony/finder": "~2.3", + "symfony/finder": "~2.3|~3.0", "theseer/fdomdocument": "~1.3" }, "type": "library", @@ -2242,20 +2313,20 @@ ], "description": "FinderFacade is a convenience wrapper for Symfony's Finder component.", "homepage": "https://github.com/sebastianbergmann/finder-facade", - "time": "2015-06-04 08:11:58" + "time": "2016-02-17 07:02:23" }, { "name": "sebastian/git", - "version": "2.0.1", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/git.git", - "reference": "2d5c139d0eedcb9e67e0e9ca08023be6e9b7b47b" + "reference": "38638de3e94830a5cd7a5956135589b967609cd5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/git/zipball/2d5c139d0eedcb9e67e0e9ca08023be6e9b7b47b", - "reference": "2d5c139d0eedcb9e67e0e9ca08023be6e9b7b47b", + "url": "https://api.github.com/repos/sebastianbergmann/git/zipball/38638de3e94830a5cd7a5956135589b967609cd5", + "reference": "38638de3e94830a5cd7a5956135589b967609cd5", "shasum": "" }, "require": { @@ -2264,7 +2335,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "2.1-dev" } }, "autoload": { @@ -2287,7 +2358,7 @@ "keywords": [ "git" ], - "time": "2015-04-06 16:23:43" + "time": "2016-02-21 15:02:23" }, { "name": "sebastian/global-state", @@ -2342,16 +2413,16 @@ }, { "name": "sebastian/recursion-context", - "version": "1.0.1", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "994d4a811bafe801fb06dccbee797863ba2792ba" + "reference": "913401df809e99e4f47b27cdd781f4a258d58791" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/994d4a811bafe801fb06dccbee797863ba2792ba", - "reference": "994d4a811bafe801fb06dccbee797863ba2792ba", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/913401df809e99e4f47b27cdd781f4a258d58791", + "reference": "913401df809e99e4f47b27cdd781f4a258d58791", "shasum": "" }, "require": { @@ -2391,7 +2462,7 @@ ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2015-06-21 08:04:50" + "time": "2015-11-11 19:50:13" }, { "name": "sebastian/version", @@ -2430,23 +2501,27 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "2.3.4", + "version": "2.6.0", "source": { "type": "git", "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "11a2545c44a5915f883e2e5ec12e14ed345e3ab2" + "reference": "1bcdf03b068a530ac1962ce671dead356eeba43b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/11a2545c44a5915f883e2e5ec12e14ed345e3ab2", - "reference": "11a2545c44a5915f883e2e5ec12e14ed345e3ab2", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/1bcdf03b068a530ac1962ce671dead356eeba43b", + "reference": "1bcdf03b068a530ac1962ce671dead356eeba43b", "shasum": "" }, "require": { + "ext-simplexml": "*", "ext-tokenizer": "*", "ext-xmlwriter": "*", "php": ">=5.1.2" }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, "bin": [ "scripts/phpcs", "scripts/phpcbf" @@ -2454,7 +2529,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "2.x-dev" } }, "autoload": { @@ -2500,33 +2575,29 @@ "phpcs", "standards" ], - "time": "2015-09-09 00:18:50" + "time": "2016-04-03 22:58:34" }, { "name": "symfony/dependency-injection", - "version": "v2.7.5", + "version": "v3.0.4", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "422c3819b110f610d79c6f1dc38af23787dc790e" + "reference": "6a9058101b591edced21ca3c83c80a3978f5c6b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/422c3819b110f610d79c6f1dc38af23787dc790e", - "reference": "422c3819b110f610d79c6f1dc38af23787dc790e", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/6a9058101b591edced21ca3c83c80a3978f5c6b0", + "reference": "6a9058101b591edced21ca3c83c80a3978f5c6b0", "shasum": "" }, "require": { - "php": ">=5.3.9" - }, - "conflict": { - "symfony/expression-language": "<2.6" + "php": ">=5.5.9" }, "require-dev": { - "symfony/config": "~2.2", - "symfony/expression-language": "~2.6", - "symfony/phpunit-bridge": "~2.7", - "symfony/yaml": "~2.1" + "symfony/config": "~2.8|~3.0", + "symfony/expression-language": "~2.8|~3.0", + "symfony/yaml": "~2.8|~3.0" }, "suggest": { "symfony/config": "", @@ -2536,13 +2607,16 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.7-dev" + "dev-master": "3.0-dev" } }, "autoload": { "psr-4": { "Symfony\\Component\\DependencyInjection\\": "" - } + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2560,38 +2634,38 @@ ], "description": "Symfony DependencyInjection Component", "homepage": "https://symfony.com", - "time": "2015-09-15 08:30:42" + "time": "2016-03-30 10:41:14" }, { "name": "symfony/finder", - "version": "v2.7.5", + "version": "v3.0.4", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "8262ab605973afbb3ef74b945daabf086f58366f" + "reference": "c54e407b35bc098916704e9fd090da21da4c4f52" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/8262ab605973afbb3ef74b945daabf086f58366f", - "reference": "8262ab605973afbb3ef74b945daabf086f58366f", + "url": "https://api.github.com/repos/symfony/finder/zipball/c54e407b35bc098916704e9fd090da21da4c4f52", + "reference": "c54e407b35bc098916704e9fd090da21da4c4f52", "shasum": "" }, "require": { - "php": ">=5.3.9" - }, - "require-dev": { - "symfony/phpunit-bridge": "~2.7" + "php": ">=5.5.9" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.7-dev" + "dev-master": "3.0-dev" } }, "autoload": { "psr-4": { "Symfony\\Component\\Finder\\": "" - } + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2609,7 +2683,7 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2015-09-19 19:59:23" + "time": "2016-03-10 11:13:05" }, { "name": "theseer/fdomdocument", diff --git a/console b/console index 412dbbdb..992462e5 100755 --- a/console +++ b/console @@ -22,6 +22,7 @@ use PHPCI\Command\PollCommand; use PHPCI\Command\CreateAdminCommand; use PHPCI\Command\CreateBuildCommand; use PHPCI\Command\WorkerCommand; +use PHPCI\Command\RebuildQueueCommand; use PHPCI\Service\BuildService; use Symfony\Component\Console\Application; use b8\Store\Factory; @@ -38,5 +39,6 @@ $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')))); $application->add(new WorkerCommand($loggerConfig->getFor('WorkerCommand'))); +$application->add(new RebuildQueueCommand($loggerConfig->getFor('RebuildQueueCommand'))); $application->run(); diff --git a/public/assets/img/ajax-loader.gif b/public/assets/img/ajax-loader.gif index b8d06f66..e65dcffc 100755 Binary files a/public/assets/img/ajax-loader.gif and b/public/assets/img/ajax-loader.gif differ diff --git a/public/assets/img/ajax-loader1.gif b/public/assets/img/ajax-loader1.gif index cc70a7a8..ff412c92 100755 Binary files a/public/assets/img/ajax-loader1.gif and b/public/assets/img/ajax-loader1.gif differ diff --git a/public/assets/img/avatar.png b/public/assets/img/avatar.png index 0ef6233d..ae1cb7b5 100755 Binary files a/public/assets/img/avatar.png and b/public/assets/img/avatar.png differ diff --git a/public/assets/img/avatar04.png b/public/assets/img/avatar04.png index 63fa709b..10d44d44 100755 Binary files a/public/assets/img/avatar04.png and b/public/assets/img/avatar04.png differ diff --git a/public/assets/img/avatar2.png b/public/assets/img/avatar2.png index 5330c223..65fa3552 100755 Binary files a/public/assets/img/avatar2.png and b/public/assets/img/avatar2.png differ diff --git a/public/assets/img/avatar3.png b/public/assets/img/avatar3.png index b1afb21b..4d65e2c6 100755 Binary files a/public/assets/img/avatar3.png and b/public/assets/img/avatar3.png differ diff --git a/public/assets/img/avatar5.png b/public/assets/img/avatar5.png index 29ce6343..670e6d95 100755 Binary files a/public/assets/img/avatar5.png and b/public/assets/img/avatar5.png differ diff --git a/public/assets/img/blur-background04.jpg b/public/assets/img/blur-background04.jpg index c2ad9ea1..e208d771 100755 Binary files a/public/assets/img/blur-background04.jpg and b/public/assets/img/blur-background04.jpg differ diff --git a/public/assets/img/blur-background08.jpg b/public/assets/img/blur-background08.jpg index de91f6cc..3632e07d 100755 Binary files a/public/assets/img/blur-background08.jpg and b/public/assets/img/blur-background08.jpg differ diff --git a/public/assets/img/blur-background09.jpg b/public/assets/img/blur-background09.jpg index 0da84072..5ee3c17a 100755 Binary files a/public/assets/img/blur-background09.jpg and b/public/assets/img/blur-background09.jpg differ diff --git a/public/assets/img/bootstrap-colorpicker/alpha-horizontal.png b/public/assets/img/bootstrap-colorpicker/alpha-horizontal.png index d0a65c08..7789694f 100755 Binary files a/public/assets/img/bootstrap-colorpicker/alpha-horizontal.png and b/public/assets/img/bootstrap-colorpicker/alpha-horizontal.png differ diff --git a/public/assets/img/bootstrap-colorpicker/alpha.png b/public/assets/img/bootstrap-colorpicker/alpha.png index 38043f1c..a4129735 100755 Binary files a/public/assets/img/bootstrap-colorpicker/alpha.png and b/public/assets/img/bootstrap-colorpicker/alpha.png differ diff --git a/public/assets/img/bootstrap-colorpicker/hue-horizontal.png b/public/assets/img/bootstrap-colorpicker/hue-horizontal.png index a0d9add8..4ad05e78 100755 Binary files a/public/assets/img/bootstrap-colorpicker/hue-horizontal.png and b/public/assets/img/bootstrap-colorpicker/hue-horizontal.png differ diff --git a/public/assets/img/bootstrap-colorpicker/hue.png b/public/assets/img/bootstrap-colorpicker/hue.png index d89560e9..7f5f4749 100755 Binary files a/public/assets/img/bootstrap-colorpicker/hue.png and b/public/assets/img/bootstrap-colorpicker/hue.png differ diff --git a/public/assets/img/bootstrap-colorpicker/saturation.png b/public/assets/img/bootstrap-colorpicker/saturation.png index 594ae50e..a1598af6 100755 Binary files a/public/assets/img/bootstrap-colorpicker/saturation.png and b/public/assets/img/bootstrap-colorpicker/saturation.png differ diff --git a/public/assets/img/credit/american-express.png b/public/assets/img/credit/american-express.png index fbe9ce2c..bd7fcfbe 100755 Binary files a/public/assets/img/credit/american-express.png and b/public/assets/img/credit/american-express.png differ diff --git a/public/assets/img/credit/cirrus.png b/public/assets/img/credit/cirrus.png index 03d2bd6a..18236bef 100755 Binary files a/public/assets/img/credit/cirrus.png and b/public/assets/img/credit/cirrus.png differ diff --git a/public/assets/img/credit/mastercard.png b/public/assets/img/credit/mastercard.png index f709adba..2d7addcf 100755 Binary files a/public/assets/img/credit/mastercard.png and b/public/assets/img/credit/mastercard.png differ diff --git a/public/assets/img/credit/mestro.png b/public/assets/img/credit/mestro.png index c22ddeaf..9b5153a9 100755 Binary files a/public/assets/img/credit/mestro.png and b/public/assets/img/credit/mestro.png differ diff --git a/public/assets/img/credit/paypal.png b/public/assets/img/credit/paypal.png index a7e1458f..1d8e8a24 100755 Binary files a/public/assets/img/credit/paypal.png and b/public/assets/img/credit/paypal.png differ diff --git a/public/assets/img/credit/paypal2.png b/public/assets/img/credit/paypal2.png index b0ca241b..7c2fda42 100755 Binary files a/public/assets/img/credit/paypal2.png and b/public/assets/img/credit/paypal2.png differ diff --git a/public/assets/img/credit/visa.png b/public/assets/img/credit/visa.png index 7099cdf4..9a378542 100755 Binary files a/public/assets/img/credit/visa.png and b/public/assets/img/credit/visa.png differ diff --git a/public/assets/img/favicon.png b/public/assets/img/favicon.png index 1e33cffa..0b6f60ec 100644 Binary files a/public/assets/img/favicon.png and b/public/assets/img/favicon.png differ diff --git a/public/assets/img/glyphicons-halflings-white.png b/public/assets/img/glyphicons-halflings-white.png index 3bf6484a..c1ab5815 100644 Binary files a/public/assets/img/glyphicons-halflings-white.png and b/public/assets/img/glyphicons-halflings-white.png differ diff --git a/public/assets/img/glyphicons-halflings.png b/public/assets/img/glyphicons-halflings.png index a9969993..f241c76f 100644 Binary files a/public/assets/img/glyphicons-halflings.png and b/public/assets/img/glyphicons-halflings.png differ diff --git a/public/assets/img/icon-build-failed.png b/public/assets/img/icon-build-failed.png index 9dde31bd..8ddd4b14 100644 Binary files a/public/assets/img/icon-build-failed.png and b/public/assets/img/icon-build-failed.png differ diff --git a/public/assets/img/icon-build-ok.png b/public/assets/img/icon-build-ok.png index 650e5f1f..90e5f35e 100644 Binary files a/public/assets/img/icon-build-ok.png and b/public/assets/img/icon-build-ok.png differ diff --git a/public/assets/img/icon-build-pending.png b/public/assets/img/icon-build-pending.png index f23051c7..2c8d1196 100644 Binary files a/public/assets/img/icon-build-pending.png and b/public/assets/img/icon-build-pending.png differ diff --git a/public/assets/img/icon-build-running.png b/public/assets/img/icon-build-running.png index 593f00b5..3e9b4f71 100644 Binary files a/public/assets/img/icon-build-running.png and b/public/assets/img/icon-build-running.png differ diff --git a/public/assets/img/icons.png b/public/assets/img/icons.png index 1663a0bd..96c1afd3 100755 Binary files a/public/assets/img/icons.png and b/public/assets/img/icons.png differ diff --git a/public/assets/img/logo-icon.png b/public/assets/img/logo-icon.png index eb377672..c3cb1143 100644 Binary files a/public/assets/img/logo-icon.png and b/public/assets/img/logo-icon.png differ diff --git a/public/assets/img/logo-large.png b/public/assets/img/logo-large.png index dd3e1d34..08bb5604 100644 Binary files a/public/assets/img/logo-large.png and b/public/assets/img/logo-large.png differ diff --git a/public/assets/img/logo.png b/public/assets/img/logo.png index 4c56e4a7..61fbbebd 100644 Binary files a/public/assets/img/logo.png and b/public/assets/img/logo.png differ diff --git a/public/assets/img/sprite-skin-flat.png b/public/assets/img/sprite-skin-flat.png index 3055db77..84a36653 100755 Binary files a/public/assets/img/sprite-skin-flat.png and b/public/assets/img/sprite-skin-flat.png differ diff --git a/public/assets/img/sprite-skin-nice.png b/public/assets/img/sprite-skin-nice.png index d62f8188..25e4d509 100755 Binary files a/public/assets/img/sprite-skin-nice.png and b/public/assets/img/sprite-skin-nice.png differ diff --git a/public/assets/img/user-bg.png b/public/assets/img/user-bg.png index 75e1b46c..a491bc0d 100755 Binary files a/public/assets/img/user-bg.png and b/public/assets/img/user-bg.png differ diff --git a/public/assets/img/user.jpg b/public/assets/img/user.jpg index b4f104f2..6eab19ae 100755 Binary files a/public/assets/img/user.jpg and b/public/assets/img/user.jpg differ diff --git a/public/assets/img/user2.jpg b/public/assets/img/user2.jpg index cb2d3639..ce9e457a 100755 Binary files a/public/assets/img/user2.jpg and b/public/assets/img/user2.jpg differ diff --git a/public/assets/js/build-plugins/loc.js b/public/assets/js/build-plugins/loc.js index 2a64f29f..89e703b8 100644 --- a/public/assets/js/build-plugins/loc.js +++ b/public/assets/js/build-plugins/loc.js @@ -89,7 +89,7 @@ var locPlugin = ActiveBuild.UiPlugin.extend({ drawChart: function () { var self = this; - if ($('#information').hasClass('active') && self.chartData) { + if ($('#information').hasClass('active') && self.chartData && self.lastData) { $('#build-lines-chart').show(); var ctx = $("#phploc-lines-chart").get(0).getContext("2d"); diff --git a/public/assets/js/build-plugins/warnings.js b/public/assets/js/build-plugins/warnings.js index 79b7a960..046fb9c6 100644 --- a/public/assets/js/build-plugins/warnings.js +++ b/public/assets/js/build-plugins/warnings.js @@ -101,13 +101,12 @@ var warningsPlugin = ActiveBuild.UiPlugin.extend({ var i = 0; for (var key in self.keys) { - self.chartData[i].data.push(parseInt(self.data[build][key])); + + self.chartData.datasets[i].data.push(parseInt(self.data[build][key])); i++; } } - console.log(self.chartData); - self.drawChart(); }, diff --git a/public/assets/js/build.js b/public/assets/js/build.js index f783d8f7..4b9c10a1 100644 --- a/public/assets/js/build.js +++ b/public/assets/js/build.js @@ -73,14 +73,16 @@ var Build = Class.extend({ var uri = 'build/meta/' + self.buildId; var query = query || {}; - if (name == 'build-updated') { - uri = 'build/data/' + self.buildId + '?since=' + self.buildData.since; - } - var cb = function() { + var fullUri = window.PHPCI_URL + uri; + + if (name == 'build-updated') { + fullUri = window.PHPCI_URL + 'build/data/' + self.buildId + '?since=' + self.buildData.since; + } + $.ajax({ dataType: "json", - url: window.PHPCI_URL + uri, + url: fullUri, data: query, success: function(data) { $(window).trigger({type: name, queryData: data});