Compare commits

..

4 commits

79 changed files with 513 additions and 691 deletions

View file

@ -1,41 +0,0 @@
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: <Your Feature>". 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.

View file

@ -1,28 +0,0 @@
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).

View file

@ -1,23 +0,0 @@
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:

View file

@ -13,6 +13,7 @@ build_settings:
setup: setup:
composer: composer:
action: "install" action: "install"
prefer_dist: false
test: test:
php_parallel_lint: php_parallel_lint:

View file

@ -213,6 +213,8 @@ class Builder implements LoggerAwareInterface
$this->build->setStatus(Build::STATUS_FAILED); $this->build->setStatus(Build::STATUS_FAILED);
} }
// Complete stage plugins are always run
$this->pluginExecutor->executePlugins($this->config, 'complete');
if ($success) { if ($success) {
$this->pluginExecutor->executePlugins($this->config, 'success'); $this->pluginExecutor->executePlugins($this->config, 'success');
@ -234,9 +236,6 @@ class Builder implements LoggerAwareInterface
} catch (\Exception $ex) { } catch (\Exception $ex) {
$this->build->setStatus(Build::STATUS_FAILED); $this->build->setStatus(Build::STATUS_FAILED);
$this->buildLogger->logFailure(Lang::get('exception') . $ex->getMessage()); $this->buildLogger->logFailure(Lang::get('exception') . $ex->getMessage());
}finally{
// Complete stage plugins are always run
$this->pluginExecutor->executePlugins($this->config, 'complete');
} }

View file

@ -21,7 +21,6 @@ use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Output\OutputInterface;
use PHPCI\Service\UserService; use PHPCI\Service\UserService;
use Symfony\Component\Console\Question\ConfirmationQuestion;
/** /**
* Install console command - Installs PHPCI. * Install console command - Installs PHPCI.
@ -254,14 +253,6 @@ class InstallCommand extends Command
$rtn = []; $rtn = [];
$helper = $this->getHelper('question');
$question = new ConfirmationQuestion('Use beanstalkd to manage build queue? ', true);
if (!$helper->ask($input, $output, $question)) {
$output->writeln('<error>Skipping beanstalkd configuration.</error>');
return null;
}
if (!$rtn['host'] = $input->getOption('queue-server')) { if (!$rtn['host'] = $input->getOption('queue-server')) {
$rtn['host'] = $dialog->ask($output, 'Enter your beanstalkd hostname [localhost]: ', 'localhost'); $rtn['host'] = $dialog->ask($output, 'Enter your beanstalkd hostname [localhost]: ', 'localhost');
} }

View file

@ -50,8 +50,7 @@ class WorkerCommand extends Command
{ {
$this $this
->setName('phpci:worker') ->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) protected function execute(InputInterface $input, OutputInterface $output)
@ -66,12 +65,6 @@ class WorkerCommand extends Command
); );
} }
// Allow PHPCI to run in "debug mode"
if ($input->hasOption('debug') && $input->getOption('debug')) {
$output->writeln('<comment>Debug mode enabled.</comment>');
define('PHPCI_DEBUG_MODE', true);
}
$config = Config::getInstance()->get('phpci.worker', []); $config = Config::getInstance()->get('phpci.worker', []);
if (empty($config['host']) || empty($config['queue'])) { if (empty($config['host']) || empty($config['queue'])) {

View file

@ -180,7 +180,7 @@ class BuildController extends \PHPCI\Controller
$errorView->build = $build; $errorView->build = $build;
$errorView->errors = $errors; $errorView->errors = $errors;
$data['errors'] = $errorStore->getErrorTotalForBuild($build->getId()); $data['errors'] = count($errors);
$data['error_html'] = $errorView->render(); $data['error_html'] = $errorView->render();
$data['since'] = (new \DateTime())->format('Y-m-d H:i:s'); $data['since'] = (new \DateTime())->format('Y-m-d H:i:s');
@ -200,10 +200,6 @@ class BuildController extends \PHPCI\Controller
$build = $this->buildService->createDuplicateBuild($copy); $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 = new b8\Http\Response\RedirectResponse();
$response->setHeader('Location', PHPCI_URL.'build/view/' . $build->getId()); $response->setHeader('Location', PHPCI_URL.'build/view/' . $build->getId());
return $response; return $response;

View file

@ -104,6 +104,7 @@ class BuildStatusController extends \PHPCI\Controller
} }
} }
} }
} catch (\Exception $e) { } catch (\Exception $e) {
$xml = new \SimpleXMLElement('<projects/>'); $xml = new \SimpleXMLElement('<projects/>');
} }

View file

@ -116,10 +116,6 @@ class ProjectController extends PHPCI\Controller
$email = $_SESSION['phpci_user']->getEmail(); $email = $_SESSION['phpci_user']->getEmail();
$build = $this->buildService->createBuild($project, null, urldecode($branch), $email); $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 = new b8\Http\Response\RedirectResponse();
$response->setHeader('Location', PHPCI_URL.'build/view/' . $build->getId()); $response->setHeader('Location', PHPCI_URL.'build/view/' . $build->getId());
return $response; return $response;

View file

@ -444,7 +444,7 @@ class SettingsController extends Controller
$field->setClass('form-control'); $field->setClass('form-control');
$field->setContainerClass('form-group'); $field->setContainerClass('form-group');
$field->setOptions(Lang::getLanguageOptions()); $field->setOptions(Lang::getLanguageOptions());
$field->setValue(Lang::getLanguage()); $field->setValue('en');
$form->addField($field); $form->addField($field);

View file

@ -27,8 +27,6 @@ use PHPCI\Store\ProjectStore;
* @author Guillaume Perréal <adirelle@gmail.com> * @author Guillaume Perréal <adirelle@gmail.com>
* @package PHPCI * @package PHPCI
* @subpackage Web * @subpackage Web
*
* @SuppressWarnings(PHPMD.ExcessiveClassComplexity)
*/ */
class WebhookController extends \b8\Controller class WebhookController extends \b8\Controller
{ {
@ -82,64 +80,11 @@ class WebhookController extends \b8\Controller
} }
/** /**
* Called by Bitbucket. * Called by Bitbucket POST service.
*/ */
public function bitbucket($projectId) public function bitbucket($projectId)
{ {
$project = $this->fetchProject($projectId, 'bitbucket'); $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); $payload = json_decode($this->getParam('payload'), true);
$results = array(); $results = array();

View file

@ -76,7 +76,6 @@ abstract class BaseCommandExecutor implements CommandExecutor
$this->lastOutput = array(); $this->lastOutput = array();
$command = call_user_func_array('sprintf', $args); $command = call_user_func_array('sprintf', $args);
$this->logger->logDebug($command);
if ($this->quiet) { if ($this->quiet) {
$this->logger->log('Executing: ' . $command); $this->logger->log('Executing: ' . $command);
@ -90,6 +89,7 @@ abstract class BaseCommandExecutor implements CommandExecutor
); );
$pipes = array(); $pipes = array();
$process = proc_open($command, $descriptorSpec, $pipes, $this->buildPath, null); $process = proc_open($command, $descriptorSpec, $pipes, $this->buildPath, null);
if (is_resource($process)) { if (is_resource($process)) {

View file

@ -39,7 +39,7 @@ PHPCI',
'reset_email_title' => 'PHPCI Passwort zurücksetzen für %s', 'reset_email_title' => 'PHPCI Passwort zurücksetzen für %s',
'reset_invalid' => 'Fehlerhafte Anfrage für das Zurücksetzen eines Passwortes', 'reset_invalid' => 'Fehlerhafte Anfrage für das Zurücksetzen eines Passwortes',
'email_address' => 'Emailadresse', 'email_address' => 'Emailadresse',
'login' => 'Login / Emailadresse', 'login' => 'Login / Email Address',
'password' => 'Passwort', 'password' => 'Passwort',
'log_in' => 'Einloggen', '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', 'local' => 'Lokaler Pfad',
'hg' => 'Mercurial', 'hg' => 'Mercurial',
'svn' => 'Subversion', 'svn' => 'Subversion',
'where_hosted' => 'Wo wird Ihr Projekt gehostet?', 'where_hosted' => 'Wo wird Ihr Projekt gehostet?',
'choose_github' => 'Wählen Sie ein GitHub Repository:', '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)', (falls Sie Ihrem Projektrepository kein phpci.yml hinzufügen können)',
'default_branch' => 'Name des Standardbranches', 'default_branch' => 'Name des Standardbranches',
'allow_public_status' => 'Öffentliche Statusseite und -bild für dieses Projekt einschalten?', 'allow_public_status' => 'Öffentliche Statusseite und -bild für dieses Projekt einschalten?',
'archived' => 'Archiviert', 'archived' => 'Archived',
'archived_menu' => 'Archiviert', 'archived_menu' => 'Archived',
'save_project' => 'Projekt speichern', 'save_project' => 'Projekt speichern',
'error_mercurial' => 'Mercurial Repository-URL muss mit http://, oder https:// beginnen', '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', 'all_branches' => 'Alle Branches',
'builds' => 'Builds', 'builds' => 'Builds',
'id' => 'ID', 'id' => 'ID',
'date' => 'Datum', 'date' => 'Date',
'project' => 'Projekt', 'project' => 'Projekt',
'commit' => 'Commit', 'commit' => 'Commit',
'branch' => 'Branch', 'branch' => 'Branch',
@ -151,9 +151,6 @@ 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 <a href="https://bitbucket.org/%s/admin/services">Services</a>-Sektion Ihres Bitbucket Repositories hinzu.', '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 <a href="https://bitbucket.org/%s/admin/services">Services</a>-Sektion Ihres Bitbucket Repositories hinzu.',
// View Build // View Build
'errors' => 'Fehler',
'information' => 'Information',
'build_x_not_found' => 'Build mit ID %d existiert nicht.', 'build_x_not_found' => 'Build mit ID %d existiert nicht.',
'build_n' => 'Build %d', 'build_n' => 'Build %d',
'rebuild_now' => 'Build neu starten', 'rebuild_now' => 'Build neu starten',
@ -195,8 +192,8 @@ generiert. Um es zu verwenden, fügen Sie einfach den folgenden Public Key im Ab
'codeception_suite' => 'Suite', 'codeception_suite' => 'Suite',
'codeception_time' => 'Zeit', 'codeception_time' => 'Zeit',
'codeception_synopsis' => '<strong>%1$d</strong> Tests in <strong>%2$f</strong> Sekunden ausgeführt. 'codeception_synopsis' => '<strong>%1$d</strong> Tests in <strong>%2$f</strong> Sekunden ausgeführt.
<strong>%3$d</strong> Fehler.', <strong>%3$d</strong> Fehler.',
'file' => 'Datei', 'file' => 'Datei',
'line' => 'Zeile', 'line' => 'Zeile',
'class' => 'Klasse', 'class' => 'Klasse',
@ -212,14 +209,14 @@ generiert. Um es zu verwenden, fügen Sie einfach den folgenden Public Key im Ab
'build_created' => 'Build erstellt', 'build_created' => 'Build erstellt',
'build_started' => 'Build gestartet', 'build_started' => 'Build gestartet',
'build_finished' => 'Build abgeschlossen', 'build_finished' => 'Build abgeschlossen',
'test_message' => 'Nachricht', 'test_message' => 'Message',
'test_no_message' => 'Keine Nachricht', 'test_no_message' => 'No message',
'test_success' => 'Erfolgreich: %d', 'test_success' => 'Successful: %d',
'test_fail' => 'Fehlschläge: %d', 'test_fail' => 'Failures: %d',
'test_skipped' => 'Übersprungen: %d', 'test_skipped' => 'Skipped: %d',
'test_error' => 'Fehler: %d', 'test_error' => 'Errors: %d',
'test_todo' => 'Todos: %d', 'test_todo' => 'Todos: %d',
'test_total' => '%d Test(s)', 'test_total' => '%d test(s)',
// Users // Users
'name' => 'Name', 'name' => 'Name',
@ -295,19 +292,6 @@ 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_packagist_for_more' => 'Packagist nach mehr Packages durchsuchen',
'search' => 'Suchen &raquo;', 'search' => 'Suchen &raquo;',
// 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 // Installer
'installation_url' => 'PHPCI Installations-URL', 'installation_url' => 'PHPCI Installations-URL',
'db_host' => 'Datenbankserver', 'db_host' => 'Datenbankserver',
@ -416,18 +400,5 @@ generiert. Um es zu verwenden, fügen Sie einfach den folgenden Public Key im Ab
'build_file_missing' => 'Angegebene Builddatei existiert nicht.', 'build_file_missing' => 'Angegebene Builddatei existiert nicht.',
'property_file_missing' => 'Angegebene Eigenschaftsdatei existiert nicht.', 'property_file_missing' => 'Angegebene Eigenschaftsdatei existiert nicht.',
'could_not_process_report' => 'Konnte den von diesem Tool erstellten Bericht nicht verarbeiten.', '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',
); );

View file

@ -372,9 +372,6 @@ PHPCI',
'project_id_argument' => 'A project ID', 'project_id_argument' => 'A project ID',
'commit_id_option' => 'Commit ID to build', 'commit_id_option' => 'Commit ID to build',
'branch_name_option' => 'Branch 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 Command
'run_all_pending' => 'Run all pending PHPCI builds.', 'run_all_pending' => 'Run all pending PHPCI builds.',

View file

@ -130,7 +130,7 @@ od wybranego kodu źródłowego platformy hostingowej.',
'all_branches' => 'Wszystkie Gałęzie', 'all_branches' => 'Wszystkie Gałęzie',
'builds' => 'Budowania', 'builds' => 'Budowania',
'id' => 'ID', 'id' => 'ID',
'date' => 'Data', 'date' => 'Date',
'project' => 'Projekt', 'project' => 'Projekt',
'commit' => 'Commit', 'commit' => 'Commit',
'branch' => 'Gałąź', 'branch' => 'Gałąź',
@ -206,14 +206,14 @@ Services</a> repozytoria Bitbucket.',
'build_created' => 'Budowanie Stworzone', 'build_created' => 'Budowanie Stworzone',
'build_started' => 'Budowanie Rozpoczęte', 'build_started' => 'Budowanie Rozpoczęte',
'build_finished' => 'Budowanie Zakończone', 'build_finished' => 'Budowanie Zakończone',
'test_message' => 'Wiadomość', 'test_message' => 'Message',
'test_no_message' => 'Brak wiadomości', 'test_no_message' => 'No message',
'test_success' => 'Powodzenie: %d', 'test_success' => 'Successful: %d',
'test_fail' => 'Niepowodzenia: %d', 'test_fail' => 'Failures: %d',
'test_skipped' => 'Pominęte: %d', 'test_skipped' => 'Skipped: %d',
'test_error' => 'Błędy: %d', 'test_error' => 'Errors: %d',
'test_todo' => 'Do zrobienia: %d', 'test_todo' => 'Todos: %d',
'test_total' => '%d test(ów)', 'test_total' => '%d test(s)',
// Users // Users
'name' => 'Nazwa', 'name' => 'Nazwa',
@ -344,10 +344,10 @@ Przejrzyj powyższą listę błędów przed kontynuowaniem.',
'incorrect_format' => 'Niepoprawny format', 'incorrect_format' => 'Niepoprawny format',
// Create Build Command // Create Build Command
'create_build_project' => 'Utwórz budowanie dla projektu', 'create_build_project' => 'Create a build for a project',
'project_id_argument' => 'ID projektu', 'project_id_argument' => 'A project ID',
'commit_id_option' => 'ID Commita do budowania', 'commit_id_option' => 'Commit ID to build',
'branch_name_option' => 'Gałąź do budowania', 'branch_name_option' => 'Branch to build',
// Run Command // Run Command
'run_all_pending' => 'Uruchom wszystkie oczekujące budowy w PHPCI', 'run_all_pending' => 'Uruchom wszystkie oczekujące budowy w PHPCI',

View file

@ -67,7 +67,7 @@ class BuildLogger implements LoggerAwareInterface
} }
} }
/** /**
* Add a success-coloured message to the log. * Add a success-coloured message to the log.
* @param string * @param string
*/ */
@ -98,17 +98,6 @@ 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 * Sets a logger instance on the object
* *

View file

@ -20,7 +20,7 @@ class FixDatabaseColumns extends AbstractMigration
$build->changeColumn('project_id', 'integer', array('null' => false)); $build->changeColumn('project_id', 'integer', array('null' => false));
$build->changeColumn('commit_id', 'string', array('limit' => 50, 'null' => false)); $build->changeColumn('commit_id', 'string', array('limit' => 50, 'null' => false));
$build->changeColumn('status', 'integer', array('null' => false)); $build->changeColumn('status', 'integer', array('null' => false));
$build->changeColumn('log', 'text', array('null' => true)); $build->changeColumn('log', 'text', array('null' => true, 'default' => ''));
$build->changeColumn('branch', 'string', array('limit' => 50, 'null' => false, 'default' => 'master')); $build->changeColumn('branch', 'string', array('limit' => 50, 'null' => false, 'default' => 'master'));
$build->changeColumn('created', 'datetime', array('null' => true)); $build->changeColumn('created', 'datetime', array('null' => true));
$build->changeColumn('started', 'datetime', array('null' => true)); $build->changeColumn('started', 'datetime', array('null' => true));

View file

@ -14,6 +14,7 @@ class FixColumnTypes extends AbstractMigration
$build = $this->table('build'); $build = $this->table('build');
$build->changeColumn('log', 'text', array( $build->changeColumn('log', 'text', array(
'null' => true, 'null' => true,
'default' => '',
'limit' => MysqlAdapter::TEXT_MEDIUM, 'limit' => MysqlAdapter::TEXT_MEDIUM,
)); ));

View file

@ -1,18 +0,0 @@
<?php
use Phinx\Migration\AbstractMigration;
use Phinx\Db\Adapter\MysqlAdapter;
class ProjectTableDefaults extends AbstractMigration
{
public function change()
{
$this->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();
}
}

View file

@ -168,7 +168,7 @@ class Build extends BuildBase
} }
foreach (array('setup', 'test', 'complete', 'success', 'failure') as $stage) { foreach (array('setup', 'test', 'complete', 'success', 'failure') as $stage) {
if ($className::canExecute($stage, $builder, $this)) { if ($className::canRunZeroConfig($stage, $builder, $this)) {
$config[$stage][$className] = array( $config[$stage][$className] = array(
'zero_config' => true 'zero_config' => true
); );

View file

@ -96,7 +96,7 @@ class Project extends ProjectBase
$info = $this->data['access_information']; $info = $this->data['access_information'];
// Handle old-format (serialized) access information first: // Handle old-format (serialized) access information first:
if (!empty($info) && !in_array(substr($info, 0, 1), array('{', '['))) { if (!empty($info) && substr($info, 0, 1) != '{') {
$data = unserialize($info); $data = unserialize($info);
} else { } else {
$data = json_decode($info, true); $data = json_decode($info, true);

View file

@ -9,11 +9,16 @@
namespace PHPCI; namespace PHPCI;
use PHPCI\Builder;
use PHPCI\Model\Build;
/** /**
* PHPCI Plugin Interface - Used by all build plugins. * PHPCI Plugin Interface - Used by all build plugins.
* @author Dan Cryer <dan@block8.co.uk> * @author Dan Cryer <dan@block8.co.uk>
*/ */
interface Plugin interface Plugin
{ {
public static function canRunZeroConfig($stage, Builder $builder, Build $build);
public function isAllowedInStage($stage);
public function execute(); public function execute();
} }

View file

@ -0,0 +1,50 @@
<?php
namespace PHPCI\Plugin;
use PHPCI\Builder;
use PHPCI\Model\Build;
use PHPCI\Plugin;
/**
* Base for all of the standard PHPCI plugins. Provides the isAllowedInStage() functionality.
* @package PHPCI\Plugin
*/
abstract class AbstractPlugin implements Plugin
{
/**
* Define the stages that this plugin is allowed to run in.
* @see AbstractPlugin::isAllowedInStage()
* @var array
*/
protected $allowedStages = array('setup', 'test', 'complete', 'success', 'failure', 'fixed', 'broken');
/**
* Verify whether or not this plugin is allowed to execute in a given stage.
* @param string $stage
* @return bool
*/
public function isAllowedInStage($stage)
{
return in_array($stage, $this->allowedStages);
}
/**
* Check whether or not this plugin can execute in zero config mode.
* Many plugins will check if their required config files can be found here.
* @param string $stage
* @param Builder $builder
* @param Build $build
* @return bool
*/
public static function canRunZeroConfig($stage, Builder $builder, Build $build)
{
return false;
}
/**
* Execute the plugin and return its success or failure.
* @return bool
*/
abstract public function execute();
}

View file

@ -17,8 +17,13 @@ use PHPCI\Model\Build;
* Atoum plugin, runs Atoum tests within a project. * Atoum plugin, runs Atoum tests within a project.
* @package PHPCI\Plugin * @package PHPCI\Plugin
*/ */
class Atoum implements \PHPCI\Plugin class Atoum extends AbstractPlugin
{ {
/**
* @inheritdoc
*/
protected $allowedStages = array('test');
private $args; private $args;
private $config; private $config;
private $directory; private $directory;

View file

@ -20,8 +20,13 @@ use PHPCI\Model\BuildError;
* @package PHPCI * @package PHPCI
* @subpackage Plugins * @subpackage Plugins
*/ */
class Behat implements \PHPCI\Plugin class Behat extends AbstractPlugin
{ {
/**
* @inheritdoc
*/
protected $allowedStages = array('test');
protected $phpci; protected $phpci;
protected $build; protected $build;
protected $features; protected $features;

View file

@ -20,8 +20,13 @@ use PHPCI\Model\Build;
* @package PHPCI * @package PHPCI
* @subpackage Plugins * @subpackage Plugins
*/ */
class Campfire implements \PHPCI\Plugin class Campfire extends AbstractPlugin
{ {
/**
* @inheritdoc
*/
protected $allowedStages = array('complete', 'success', 'failure', 'fixed', 'broken');
private $url; private $url;
private $authToken; private $authToken;
private $userAgent; private $userAgent;

View file

@ -19,7 +19,7 @@ use PHPCI\Model\Build;
* @package PHPCI * @package PHPCI
* @subpackage Plugins * @subpackage Plugins
*/ */
class CleanBuild implements \PHPCI\Plugin class CleanBuild extends AbstractPlugin
{ {
protected $remove; protected $remove;
protected $phpci; protected $phpci;

View file

@ -14,6 +14,7 @@ use PHPCI\Helper\Lang;
use PHPCI\Model\Build; use PHPCI\Model\Build;
use PHPCI\Plugin\Util\TestResultParsers\Codeception as Parser; use PHPCI\Plugin\Util\TestResultParsers\Codeception as Parser;
use Psr\Log\LogLevel; use Psr\Log\LogLevel;
use PHPCI\ZeroConfigPlugin;
/** /**
* Codeception Plugin - Enables full acceptance, unit, and functional testing. * Codeception Plugin - Enables full acceptance, unit, and functional testing.
@ -23,8 +24,13 @@ use Psr\Log\LogLevel;
* @package PHPCI * @package PHPCI
* @subpackage Plugins * @subpackage Plugins
*/ */
class Codeception implements \PHPCI\Plugin, \PHPCI\ZeroConfigPlugin class Codeception extends AbstractPlugin implements ZeroConfigPlugin
{ {
/**
* @inheritdoc
*/
protected $allowedStages = array('test');
/** @var string */ /** @var string */
protected $args = ''; protected $args = '';
@ -50,7 +56,7 @@ class Codeception implements \PHPCI\Plugin, \PHPCI\ZeroConfigPlugin
* @param Build $build * @param Build $build
* @return bool * @return bool
*/ */
public static function canExecute($stage, Builder $builder, Build $build) public static function canRunZeroConfig($stage, Builder $builder, Build $build)
{ {
return $stage == 'test' && !is_null(self::findConfigFile($builder->buildPath)); return $stage == 'test' && !is_null(self::findConfigFile($builder->buildPath));
} }

View file

@ -13,6 +13,7 @@ use PHPCI;
use PHPCI\Builder; use PHPCI\Builder;
use PHPCI\Model\Build; use PHPCI\Model\Build;
use PHPCI\Helper\Lang; use PHPCI\Helper\Lang;
use PHPCI\ZeroConfigPlugin;
/** /**
* Composer Plugin - Provides access to Composer functionality. * Composer Plugin - Provides access to Composer functionality.
@ -20,7 +21,7 @@ use PHPCI\Helper\Lang;
* @package PHPCI * @package PHPCI
* @subpackage Plugins * @subpackage Plugins
*/ */
class Composer implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin class Composer extends AbstractPlugin implements ZeroConfigPlugin
{ {
protected $directory; protected $directory;
protected $action; protected $action;
@ -36,7 +37,7 @@ class Composer implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin
* @param Build $build * @param Build $build
* @return bool * @return bool
*/ */
public static function canExecute($stage, Builder $builder, Build $build) public static function canRunZeroConfig($stage, Builder $builder, Build $build)
{ {
$path = $builder->buildPath . DIRECTORY_SEPARATOR . 'composer.json'; $path = $builder->buildPath . DIRECTORY_SEPARATOR . 'composer.json';
@ -61,7 +62,6 @@ class Composer implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin
$this->directory = $path; $this->directory = $path;
$this->action = 'install'; $this->action = 'install';
$this->preferDist = false; $this->preferDist = false;
$this->preferSource = false;
$this->nodev = false; $this->nodev = false;
if (array_key_exists('directory', $options)) { if (array_key_exists('directory', $options)) {
@ -76,11 +76,6 @@ class Composer implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin
$this->preferDist = (bool)$options['prefer_dist']; $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)) { if (array_key_exists('no_dev', $options)) {
$this->nodev = (bool)$options['no_dev']; $this->nodev = (bool)$options['no_dev'];
} }
@ -103,12 +98,10 @@ class Composer implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin
if ($this->preferDist) { if ($this->preferDist) {
$this->phpci->log('Using --prefer-dist flag'); $this->phpci->log('Using --prefer-dist flag');
$cmd .= ' --prefer-dist'; $cmd .= '--prefer-dist';
} } else {
if ($this->preferSource) {
$this->phpci->log('Using --prefer-source flag'); $this->phpci->log('Using --prefer-source flag');
$cmd .= ' --prefer-source'; $cmd .= '--prefer-source';
} }
if ($this->nodev) { if ($this->nodev) {

View file

@ -19,7 +19,7 @@ use PHPCI\Helper\Lang;
* @package PHPCI * @package PHPCI
* @subpackage Plugins * @subpackage Plugins
*/ */
class CopyBuild implements \PHPCI\Plugin class CopyBuild extends AbstractPlugin
{ {
protected $directory; protected $directory;
protected $ignore; protected $ignore;

View file

@ -19,11 +19,15 @@ use PHPCI\Model\Build;
* @package PHPCI * @package PHPCI
* @subpackage Plugins * @subpackage Plugins
*/ */
class Deployer implements \PHPCI\Plugin class Deployer extends AbstractPlugin
{ {
/**
* @inheritdoc
*/
protected $allowedStages = array('complete', 'success', 'failure', 'fixed', 'broken');
protected $webhookUrl; protected $webhookUrl;
protected $reason; protected $reason;
protected $updateOnly;
/** /**
* Set up the plugin, configure options, etc. * Set up the plugin, configure options, etc.
@ -44,8 +48,6 @@ class Deployer implements \PHPCI\Plugin
if (isset($options['reason'])) { if (isset($options['reason'])) {
$this->reason = $options['reason']; $this->reason = $options['reason'];
} }
$this->updateOnly = isset($options['update_only']) ? (bool) $options['update_only'] : true;
} }
/** /**
@ -64,8 +66,6 @@ class Deployer implements \PHPCI\Plugin
'reason' => $this->phpci->interpolate($this->reason), 'reason' => $this->phpci->interpolate($this->reason),
'source' => 'PHPCI', 'source' => 'PHPCI',
'url' => $this->phpci->interpolate('%BUILD_URI%'), 'url' => $this->phpci->interpolate('%BUILD_URI%'),
'branch' => $this->phpci->interpolate('%BRANCH%'),
'update_only' => $this->updateOnly
)); ));
return $response['success']; return $response['success'];

View file

@ -23,8 +23,13 @@ use Psr\Log\LogLevel;
* @package PHPCI * @package PHPCI
* @subpackage Plugins * @subpackage Plugins
*/ */
class Email implements \PHPCI\Plugin class Email extends AbstractPlugin
{ {
/**
* @inheritdoc
*/
protected $allowedStages = array('complete', 'success', 'failure', 'fixed', 'broken');
/** /**
* @var \PHPCI\Builder * @var \PHPCI\Builder
*/ */

View file

@ -19,7 +19,7 @@ use PHPCI\Model\Build;
* @package PHPCI * @package PHPCI
* @subpackage Plugins * @subpackage Plugins
*/ */
class Env implements \PHPCI\Plugin class Env extends AbstractPlugin
{ {
protected $phpci; protected $phpci;
protected $build; protected $build;

View file

@ -19,8 +19,13 @@ use Mremi\Flowdock\Api\Push\TeamInboxMessage;
* @package PHPCI * @package PHPCI
* @subpackage Plugins * @subpackage Plugins
*/ */
class FlowdockNotify implements \PHPCI\Plugin class FlowdockNotify extends AbstractPlugin
{ {
/**
* @inheritdoc
*/
protected $allowedStages = array('complete', 'success', 'failure', 'fixed', 'broken');
private $api_key; private $api_key;
private $email; private $email;
const MESSAGE_DEFAULT = 'Build %BUILD% has finished for commit <a href="%COMMIT_URI%">%SHORT_COMMIT%</a> const MESSAGE_DEFAULT = 'Build %BUILD% has finished for commit <a href="%COMMIT_URI%">%SHORT_COMMIT%</a>

View file

@ -19,7 +19,7 @@ use PHPCI\Model\Build;
* @package PHPCI * @package PHPCI
* @subpackage Plugins * @subpackage Plugins
*/ */
class Git implements \PHPCI\Plugin class Git extends AbstractPlugin
{ {
protected $phpci; protected $phpci;
protected $build; protected $build;

View file

@ -18,7 +18,7 @@ use PHPCI\Model\Build;
* @package PHPCI * @package PHPCI
* @subpackage Plugins * @subpackage Plugins
*/ */
class Grunt implements \PHPCI\Plugin class Grunt extends AbstractPlugin
{ {
protected $directory; protected $directory;
protected $task; protected $task;

View file

@ -18,7 +18,7 @@ use PHPCI\Model\Build;
* @package PHPCI * @package PHPCI
* @subpackage Plugins * @subpackage Plugins
*/ */
class Gulp implements \PHPCI\Plugin class Gulp extends AbstractPlugin
{ {
protected $directory; protected $directory;
protected $task; protected $task;

View file

@ -19,8 +19,13 @@ use PHPCI\Model\Build;
* @package PHPCI * @package PHPCI
* @subpackage Plugins * @subpackage Plugins
*/ */
class HipchatNotify implements \PHPCI\Plugin class HipchatNotify extends AbstractPlugin
{ {
/**
* @inheritdoc
*/
protected $allowedStages = array('complete', 'success', 'failure', 'fixed', 'broken');
protected $authToken; protected $authToken;
protected $color; protected $color;
protected $notify; protected $notify;

View file

@ -19,8 +19,13 @@ use PHPCI\Model\Build;
* @package PHPCI * @package PHPCI
* @subpackage Plugins * @subpackage Plugins
*/ */
class Irc implements \PHPCI\Plugin class Irc extends AbstractPlugin
{ {
/**
* @inheritdoc
*/
protected $allowedStages = array('complete', 'success', 'failure', 'fixed', 'broken');
protected $phpci; protected $phpci;
protected $build; protected $build;
protected $message; protected $message;

View file

@ -19,8 +19,13 @@ use PHPCI\Model\Build;
* @package PHPCI * @package PHPCI
* @subpackage Plugins * @subpackage Plugins
*/ */
class Lint implements PHPCI\Plugin class Lint extends AbstractPlugin
{ {
/**
* @inheritdoc
*/
protected $allowedStages = array('test');
protected $directories; protected $directories;
protected $recursive = true; protected $recursive = true;
protected $ignore; protected $ignore;
@ -116,7 +121,8 @@ class Lint implements PHPCI\Plugin
continue; continue;
} }
$itemPath = $path . $item->getFilename(); $itemPath = rtrim($path, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
$itemPath .= ltrim($item->getFilename(), DIRECTORY_SEPARATOR);
if (in_array($itemPath, $this->ignore)) { if (in_array($itemPath, $this->ignore)) {
continue; continue;

View file

@ -21,7 +21,7 @@ use PHPCI\Model\Build;
* @package PHPCI * @package PHPCI
* @subpackage Plugins * @subpackage Plugins
*/ */
class Mysql implements \PHPCI\Plugin class Mysql extends AbstractPlugin
{ {
/** /**
* @var \PHPCI\Builder * @var \PHPCI\Builder

View file

@ -18,7 +18,7 @@ use PHPCI\Model\Build;
* @package PHPCI * @package PHPCI
* @subpackage Plugins * @subpackage Plugins
*/ */
class PackageBuild implements \PHPCI\Plugin class PackageBuild extends AbstractPlugin
{ {
protected $directory; protected $directory;
protected $filename; protected $filename;

View file

@ -19,8 +19,13 @@ use PHPCI\Model\Build;
* @package PHPCI * @package PHPCI
* @subpackage Plugins * @subpackage Plugins
*/ */
class Pdepend implements \PHPCI\Plugin class Pdepend extends AbstractPlugin
{ {
/**
* @inheritdoc
*/
protected $allowedStages = array('test');
protected $args; protected $args;
/** /**
* @var \PHPCI\Builder * @var \PHPCI\Builder

View file

@ -19,7 +19,7 @@ use PHPCI\Model\Build;
* @package PHPCI * @package PHPCI
* @subpackage Plugins * @subpackage Plugins
*/ */
class Pgsql implements \PHPCI\Plugin class Pgsql extends AbstractPlugin
{ {
/** /**
* @var \PHPCI\Builder * @var \PHPCI\Builder

View file

@ -10,7 +10,7 @@ use Phar as PHPPhar;
/** /**
* Phar Plugin * Phar Plugin
*/ */
class Phar implements \PHPCI\Plugin class Phar extends AbstractPlugin
{ {
/** /**
* PHPCI * PHPCI

View file

@ -20,7 +20,7 @@ use PHPCI\Model\Build;
* @package PHPCI * @package PHPCI
* @subpackage Plugins * @subpackage Plugins
*/ */
class Phing implements \PHPCI\Plugin class Phing extends AbstractPlugin
{ {
private $directory; private $directory;

View file

@ -13,6 +13,7 @@ use PHPCI;
use PHPCI\Builder; use PHPCI\Builder;
use PHPCI\Model\Build; use PHPCI\Model\Build;
use PHPCI\Model\BuildError; use PHPCI\Model\BuildError;
use PHPCI\ZeroConfigPlugin;
/** /**
* PHP Code Sniffer Plugin - Allows PHP Code Sniffer testing. * PHP Code Sniffer Plugin - Allows PHP Code Sniffer testing.
@ -20,8 +21,13 @@ use PHPCI\Model\BuildError;
* @package PHPCI * @package PHPCI
* @subpackage Plugins * @subpackage Plugins
*/ */
class PhpCodeSniffer implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin class PhpCodeSniffer extends AbstractPlugin implements ZeroConfigPlugin
{ {
/**
* @inheritdoc
*/
protected $allowedStages = array('test');
/** /**
* @var \PHPCI\Builder * @var \PHPCI\Builder
*/ */
@ -80,7 +86,7 @@ class PhpCodeSniffer implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin
* @param Build $build * @param Build $build
* @return bool * @return bool
*/ */
public static function canExecute($stage, Builder $builder, Build $build) public static function canRunZeroConfig($stage, Builder $builder, Build $build)
{ {
if ($stage == 'test') { if ($stage == 'test') {
return true; return true;

12
PHPCI/Plugin/PhpCpd.php Executable file → Normal file
View file

@ -20,8 +20,13 @@ use PHPCI\Model\BuildError;
* @package PHPCI * @package PHPCI
* @subpackage Plugins * @subpackage Plugins
*/ */
class PhpCpd implements \PHPCI\Plugin class PhpCpd extends AbstractPlugin
{ {
/**
* @inheritdoc
*/
protected $allowedStages = array('test');
protected $directory; protected $directory;
protected $args; protected $args;
protected $phpci; protected $phpci;
@ -50,12 +55,17 @@ class PhpCpd implements \PHPCI\Plugin
$this->build = $build; $this->build = $build;
$this->path = $phpci->buildPath; $this->path = $phpci->buildPath;
$this->standard = 'PSR1';
$this->ignore = $phpci->ignore; $this->ignore = $phpci->ignore;
if (!empty($options['path'])) { if (!empty($options['path'])) {
$this->path = $phpci->buildPath . $options['path']; $this->path = $phpci->buildPath . $options['path'];
} }
if (!empty($options['standard'])) {
$this->standard = $options['standard'];
}
if (!empty($options['ignore'])) { if (!empty($options['ignore'])) {
$this->ignore = $options['ignore']; $this->ignore = $options['ignore'];
} }

View file

@ -19,7 +19,7 @@ use PHPCI\Model\Build;
* @package PHPCI * @package PHPCI
* @subpackage Plugins * @subpackage Plugins
*/ */
class PhpCsFixer implements \PHPCI\Plugin class PhpCsFixer extends AbstractPlugin
{ {
/** /**
* @var \PHPCI\Builder * @var \PHPCI\Builder

View file

@ -12,6 +12,7 @@ namespace PHPCI\Plugin;
use PHPCI; use PHPCI;
use PHPCI\Builder; use PHPCI\Builder;
use PHPCI\Model\Build; use PHPCI\Model\Build;
use PHPCI\ZeroConfigPlugin;
/** /**
* PHP Docblock Checker Plugin - Checks your PHP files for appropriate uses of Docblocks * PHP Docblock Checker Plugin - Checks your PHP files for appropriate uses of Docblocks
@ -19,8 +20,13 @@ use PHPCI\Model\Build;
* @package PHPCI * @package PHPCI
* @subpackage Plugins * @subpackage Plugins
*/ */
class PhpDocblockChecker implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin class PhpDocblockChecker extends AbstractPlugin implements ZeroConfigPlugin
{ {
/**
* @inheritdoc
*/
protected $allowedStages = array('test');
/** /**
* @var \PHPCI\Builder * @var \PHPCI\Builder
*/ */
@ -52,7 +58,7 @@ class PhpDocblockChecker implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin
* @param Build $build * @param Build $build
* @return bool * @return bool
*/ */
public static function canExecute($stage, Builder $builder, Build $build) public static function canRunZeroConfig($stage, Builder $builder, Build $build)
{ {
if ($stage == 'test') { if ($stage == 'test') {
return true; return true;

View file

@ -12,6 +12,7 @@ namespace PHPCI\Plugin;
use PHPCI; use PHPCI;
use PHPCI\Builder; use PHPCI\Builder;
use PHPCI\Model\Build; use PHPCI\Model\Build;
use PHPCI\ZeroConfigPlugin;
/** /**
* PHP Loc - Allows PHP Copy / Lines of Code testing. * PHP Loc - Allows PHP Copy / Lines of Code testing.
@ -19,7 +20,7 @@ use PHPCI\Model\Build;
* @package PHPCI * @package PHPCI
* @subpackage Plugins * @subpackage Plugins
*/ */
class PhpLoc implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin class PhpLoc extends AbstractPlugin implements ZeroConfigPlugin
{ {
/** /**
* @var string * @var string
@ -37,7 +38,7 @@ class PhpLoc implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin
* @param Build $build * @param Build $build
* @return bool * @return bool
*/ */
public static function canExecute($stage, Builder $builder, Build $build) public static function canRunZeroConfig($stage, Builder $builder, Build $build)
{ {
if ($stage == 'test') { if ($stage == 'test') {
return true; return true;

View file

@ -12,6 +12,7 @@ namespace PHPCI\Plugin;
use PHPCI; use PHPCI;
use PHPCI\Builder; use PHPCI\Builder;
use PHPCI\Model\Build; use PHPCI\Model\Build;
use PHPCI\ZeroConfigPlugin;
/** /**
* PHP Mess Detector Plugin - Allows PHP Mess Detector testing. * PHP Mess Detector Plugin - Allows PHP Mess Detector testing.
@ -19,8 +20,13 @@ use PHPCI\Model\Build;
* @package PHPCI * @package PHPCI
* @subpackage Plugins * @subpackage Plugins
*/ */
class PhpMessDetector implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin class PhpMessDetector extends AbstractPlugin implements ZeroConfigPlugin
{ {
/**
* @inheritdoc
*/
protected $allowedStages = array('test');
/** /**
* @var \PHPCI\Builder * @var \PHPCI\Builder
*/ */
@ -62,7 +68,7 @@ class PhpMessDetector implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin
* @param Build $build * @param Build $build
* @return bool * @return bool
*/ */
public static function canExecute($stage, Builder $builder, Build $build) public static function canRunZeroConfig($stage, Builder $builder, Build $build)
{ {
if ($stage == 'test') { if ($stage == 'test') {
return true; return true;

View file

@ -19,8 +19,13 @@ use PHPCI\Model\Build;
* @package PHPCI * @package PHPCI
* @subpackage Plugins * @subpackage Plugins
*/ */
class PhpParallelLint implements \PHPCI\Plugin class PhpParallelLint extends AbstractPlugin
{ {
/**
* @inheritdoc
*/
protected $allowedStages = array('test');
/** /**
* @var \PHPCI\Builder * @var \PHPCI\Builder
*/ */

View file

@ -19,8 +19,13 @@ use PHPCI\Model\Build;
* @package PHPCI * @package PHPCI
* @subpackage Plugins * @subpackage Plugins
*/ */
class PhpSpec implements PHPCI\Plugin class PhpSpec extends AbstractPlugin
{ {
/**
* @inheritdoc
*/
protected $allowedStages = array('test');
/** /**
* @var \PHPCI\Builder * @var \PHPCI\Builder
*/ */

View file

@ -19,8 +19,13 @@ use PHPCI\Model\Build;
* @package PHPCI * @package PHPCI
* @subpackage Plugins * @subpackage Plugins
*/ */
class PhpTalLint implements PHPCI\Plugin class PhpTalLint extends AbstractPlugin
{ {
/**
* @inheritdoc
*/
protected $allowedStages = array('test');
protected $directories; protected $directories;
protected $recursive = true; protected $recursive = true;
protected $suffixes; protected $suffixes;

View file

@ -13,6 +13,7 @@ use PHPCI;
use PHPCI\Builder; use PHPCI\Builder;
use PHPCI\Model\Build; use PHPCI\Model\Build;
use PHPCI\Plugin\Util\TapParser; use PHPCI\Plugin\Util\TapParser;
use PHPCI\ZeroConfigPlugin;
/** /**
* PHP Unit Plugin - Allows PHP Unit testing. * PHP Unit Plugin - Allows PHP Unit testing.
@ -20,8 +21,13 @@ use PHPCI\Plugin\Util\TapParser;
* @package PHPCI * @package PHPCI
* @subpackage Plugins * @subpackage Plugins
*/ */
class PhpUnit implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin class PhpUnit extends AbstractPlugin implements ZeroConfigPlugin
{ {
/**
* @inheritdoc
*/
protected $allowedStages = array('test');
protected $args; protected $args;
protected $phpci; protected $phpci;
protected $build; protected $build;
@ -56,7 +62,7 @@ class PhpUnit implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin
* @param Build $build * @param Build $build
* @return bool * @return bool
*/ */
public static function canExecute($stage, Builder $builder, Build $build) public static function canRunZeroConfig($stage, Builder $builder, Build $build)
{ {
if ($stage == 'test' && !is_null(self::findConfigFile($builder->buildPath))) { if ($stage == 'test' && !is_null(self::findConfigFile($builder->buildPath))) {
return true; return true;

View file

@ -19,7 +19,7 @@ use PHPCI\Model\Build;
* @package PHPCI * @package PHPCI
* @subpackage Plugins * @subpackage Plugins
*/ */
class Shell implements \PHPCI\Plugin class Shell extends AbstractPlugin
{ {
/** /**
* @var \PHPCI\Builder * @var \PHPCI\Builder

View file

@ -17,8 +17,13 @@ use PHPCI\Model\Build;
* @package PHPCI * @package PHPCI
* @subpackage Plugins * @subpackage Plugins
*/ */
class SlackNotify implements \PHPCI\Plugin class SlackNotify extends AbstractPlugin
{ {
/**
* @inheritdoc
*/
protected $allowedStages = array('complete', 'success', 'failure', 'fixed', 'broken');
private $webHook; private $webHook;
private $room; private $room;
private $username; private $username;

View file

@ -19,7 +19,7 @@ use PHPCI\Model\Build;
* @package PHPCI * @package PHPCI
* @subpackage Plugins * @subpackage Plugins
*/ */
class Sqlite implements \PHPCI\Plugin class Sqlite extends AbstractPlugin
{ {
/** /**
* @var \PHPCI\Builder * @var \PHPCI\Builder

View file

@ -12,6 +12,7 @@ namespace PHPCI\Plugin;
use PHPCI; use PHPCI;
use PHPCI\Builder; use PHPCI\Builder;
use PHPCI\Model\Build; use PHPCI\Model\Build;
use PHPCI\ZeroConfigPlugin;
/** /**
* Technical Debt Plugin - Checks for existence of "TODO", "FIXME", etc. * Technical Debt Plugin - Checks for existence of "TODO", "FIXME", etc.
@ -20,8 +21,13 @@ use PHPCI\Model\Build;
* @package PHPCI * @package PHPCI
* @subpackage Plugins * @subpackage Plugins
*/ */
class TechnicalDebt implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin class TechnicalDebt extends AbstractPlugin implements ZeroConfigPlugin
{ {
/**
* @inheritdoc
*/
protected $allowedStages = array('test');
/** /**
* @var \PHPCI\Builder * @var \PHPCI\Builder
*/ */
@ -67,7 +73,7 @@ class TechnicalDebt implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin
* @param Build $build * @param Build $build
* @return bool * @return bool
*/ */
public static function canExecute($stage, Builder $builder, Build $build) public static function canRunZeroConfig($stage, Builder $builder, Build $build)
{ {
if ($stage == 'test') { if ($stage == 'test') {
return true; return true;

View file

@ -138,7 +138,7 @@ class Executor
$this->setPluginStatus($stage, $plugin, Build::STATUS_RUNNING); $this->setPluginStatus($stage, $plugin, Build::STATUS_RUNNING);
// Try and execute it // Try and execute it
if ($this->executePlugin($plugin, $options)) { if ($this->executePlugin($plugin, $options, $stage)) {
// Execution was successful // Execution was successful
$this->logger->logSuccess(Lang::get('plugin_success')); $this->logger->logSuccess(Lang::get('plugin_success'));
$this->setPluginStatus($stage, $plugin, Build::STATUS_SUCCESS); $this->setPluginStatus($stage, $plugin, Build::STATUS_SUCCESS);
@ -166,8 +166,12 @@ class Executor
/** /**
* Executes a given plugin, with options and returns the result. * Executes a given plugin, with options and returns the result.
* @param string $plugin Plugin name
* @param array $options Plugin options (from phpci.yml)
* @param string $stage Stage name
* @return bool
*/ */
public function executePlugin($plugin, $options) public function executePlugin($plugin, $options, $stage)
{ {
// Any plugin name without a namespace separator is a PHPCI built in plugin // Any plugin name without a namespace separator is a PHPCI built in plugin
// if not we assume it's a fully name-spaced class name that implements the plugin interface. // if not we assume it's a fully name-spaced class name that implements the plugin interface.
@ -188,6 +192,12 @@ class Executor
try { try {
// Build and run it // Build and run it
$obj = $this->pluginFactory->buildPlugin($class, $options); $obj = $this->pluginFactory->buildPlugin($class, $options);
if (!$obj->isAllowedInStage($stage)) {
$this->logger->logFailure('Plugin "' . $plugin . '" cannot be run in stage: ' . $stage);
return false;
}
return $obj->execute(); return $obj->execute();
} catch (\Exception $ex) { } catch (\Exception $ex) {
$this->logger->logFailure(Lang::get('exception') . $ex->getMessage(), $ex); $this->logger->logFailure(Lang::get('exception') . $ex->getMessage(), $ex);

View file

@ -20,7 +20,6 @@ class Codeception implements ParserInterface
protected $totalTests; protected $totalTests;
protected $totalTimeTaken; protected $totalTimeTaken;
protected $totalFailures; protected $totalFailures;
protected $totalErrors;
/** /**
* @param Builder $phpci * @param Builder $phpci
@ -30,6 +29,7 @@ class Codeception implements ParserInterface
{ {
$this->phpci = $phpci; $this->phpci = $phpci;
$this->resultsXml = $resultsXml; $this->resultsXml = $resultsXml;
$this->totalTests = 0; $this->totalTests = 0;
} }
@ -47,7 +47,6 @@ class Codeception implements ParserInterface
$this->totalTests += (int) $testsuite['tests']; $this->totalTests += (int) $testsuite['tests'];
$this->totalTimeTaken += (float) $testsuite['time']; $this->totalTimeTaken += (float) $testsuite['time'];
$this->totalFailures += (int) $testsuite['failures']; $this->totalFailures += (int) $testsuite['failures'];
$this->totalErrors += (int) $testsuite['errors'];
foreach ($testsuite->testcase as $testcase) { foreach ($testsuite->testcase as $testcase) {
$testresult = array( $testresult = array(
@ -68,9 +67,9 @@ class Codeception implements ParserInterface
$testresult['feature'] = sprintf('%s::%s', $testresult['class'], $testresult['name']); $testresult['feature'] = sprintf('%s::%s', $testresult['class'], $testresult['name']);
} }
if (isset($testcase->failure) || isset($testcase->error)) { if (isset($testcase->failure)) {
$testresult['pass'] = false; $testresult['pass'] = false;
$testresult['message'] = (string)$testcase->failure . (string)$testcase->error; $testresult['message'] = (string) $testcase->failure;
} else { } else {
$testresult['pass'] = true; $testresult['pass'] = true;
} }
@ -109,6 +108,6 @@ class Codeception implements ParserInterface
*/ */
public function getTotalFailures() public function getTotalFailures()
{ {
return $this->totalFailures + $this->totalErrors; return $this->totalFailures;
} }
} }

View file

@ -18,7 +18,7 @@ use PHPCI\Model\Build;
* @package PHPCI * @package PHPCI
* @subpackage Plugins * @subpackage Plugins
*/ */
class Wipe implements \PHPCI\Plugin class Wipe extends AbstractPlugin
{ {
/** /**
* @var \PHPCI\Builder * @var \PHPCI\Builder

View file

@ -18,7 +18,7 @@ use PHPCI\Model\Build;
* @package PHPCI * @package PHPCI
* @subpackage Plugins * @subpackage Plugins
*/ */
class XMPP implements \PHPCI\Plugin class XMPP extends AbstractPlugin
{ {
protected $directory; protected $directory;
protected $phpci; protected $phpci;

View file

@ -30,11 +30,6 @@ class BuildService
*/ */
protected $buildStore; protected $buildStore;
/**
* @var bool
*/
public $queueError = false;
/** /**
* @param BuildStore $buildStore * @param BuildStore $buildStore
*/ */
@ -160,30 +155,27 @@ class BuildService
} }
$config = Config::getInstance(); $config = Config::getInstance();
$settings = $config->get('phpci.worker', []); $settings = $config->get('phpci.worker', []);
if (!empty($settings['host']) && !empty($settings['queue'])) { if (!empty($settings['host']) && !empty($settings['queue'])) {
try { $jobData = array(
$jobData = array( 'type' => 'phpci.build',
'type' => 'phpci.build', 'build_id' => $build->getId(),
'build_id' => $build->getId(), );
);
if ($config->get('using_custom_file')) { if ($config->get('using_custom_file')) {
$jobData['config'] = $config->getArray(); $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)
);
} }
} }
} }

View file

@ -54,27 +54,4 @@ class BuildErrorStore extends BuildErrorStoreBase
return array(); 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();
}
}
} }

View file

@ -165,7 +165,6 @@ class BuildStore extends BuildStoreBase
$stmt->bindValue(':projectId', (int)$projectId, \PDO::PARAM_INT); $stmt->bindValue(':projectId', (int)$projectId, \PDO::PARAM_INT);
$stmt->bindValue(':buildId', (int)$buildId, \PDO::PARAM_INT); $stmt->bindValue(':buildId', (int)$buildId, \PDO::PARAM_INT);
$stmt->bindValue(':numResults', (int)$numResults, \PDO::PARAM_INT); $stmt->bindValue(':numResults', (int)$numResults, \PDO::PARAM_INT);
if (!is_null($branch)) { if (!is_null($branch)) {
$stmt->bindValue(':branch', $branch, \PDO::PARAM_STR); $stmt->bindValue(':branch', $branch, \PDO::PARAM_STR);
} }
@ -184,6 +183,7 @@ class BuildStore extends BuildStoreBase
} else { } else {
return $rtn; return $rtn;
} }
} else { } else {
return null; return null;
} }

View file

@ -149,6 +149,7 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<?php print $data['error_html']; ?>
</tbody> </tbody>
</table> </table>
</div> </div>

View file

@ -292,14 +292,6 @@
<!-- Main content --> <!-- Main content -->
<section class="content"> <section class="content">
<?php
if (!empty($_SESSION['global_error'])) {
$message = $_SESSION['global_error'];
unset($_SESSION['global_error']);
print '<div class="alert alert-danger">' . $message . '</div>';
}
?>
<?php print $content; ?> <?php print $content; ?>
</section><!-- /.content --> </section><!-- /.content -->
</aside><!-- /.content-wrapper --> </aside><!-- /.content-wrapper -->

View file

@ -17,5 +17,5 @@ use PHPCI\Model\Build;
*/ */
interface ZeroConfigPlugin interface ZeroConfigPlugin
{ {
public static function canExecute($stage, Builder $builder, Build $build); public static function canRunZeroConfig($stage, Builder $builder, Build $build);
} }

View file

@ -11,13 +11,7 @@ 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) 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)
**Support the development of PHPCI** ##What it does:
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 * Clones your project from Github, Bitbucket or a local path
* Allows you to set up and tear down test databases. * Allows you to set up and tear down test databases.
* Installs your project's Composer dependencies. * Installs your project's Composer dependencies.
@ -25,17 +19,17 @@ We [now accept donations](https://www.phptesting.org/support) to directly suppor
* You can mark directories for the plugins to ignore. * You can mark directories for the plugins to ignore.
* You can mark certain plugins as being allowed to fail (but still run.) * You can mark certain plugins as being allowed to fail (but still run.)
### What it doesn't do (yet): ##What it doesn't do (yet):
* Virtualised testing. * Virtualised testing. *(In progress)*
* Multiple PHP-version tests. * Multiple PHP-version tests. *(In progress)*
* Install PEAR or PECL extensions. * Install PEAR or PECL extensions.
* Deployments - We strongly recommend using [Deployer](http://phpdeployment.org) * [Deployments](http://phpdeployment.org)
## Getting Started: ## 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). 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 ##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. 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.
## Questions? ##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. 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.

View file

@ -49,7 +49,7 @@ class ExecutorTest extends \PHPUnit_Framework_TestCase
->shouldBeCalledTimes(1) ->shouldBeCalledTimes(1)
->willReturn($this->prophesize('PHPCI\Plugin')->reveal()); ->willReturn($this->prophesize('PHPCI\Plugin')->reveal());
$this->testedExecutor->executePlugin($pluginName, $options); $this->testedExecutor->executePlugin($pluginName, $options, 'test');
} }
public function testExecutePlugin_KeepsCalledNameSpace() public function testExecutePlugin_KeepsCalledNameSpace()
@ -61,7 +61,7 @@ class ExecutorTest extends \PHPUnit_Framework_TestCase
->shouldBeCalledTimes(1) ->shouldBeCalledTimes(1)
->willReturn($this->prophesize('PHPCI\Plugin')->reveal()); ->willReturn($this->prophesize('PHPCI\Plugin')->reveal());
$this->testedExecutor->executePlugin($pluginClass, $options); $this->testedExecutor->executePlugin($pluginClass, $options, 'test');
} }
public function testExecutePlugin_CallsExecuteOnFactoryBuildPlugin() public function testExecutePlugin_CallsExecuteOnFactoryBuildPlugin()
@ -76,7 +76,7 @@ class ExecutorTest extends \PHPUnit_Framework_TestCase
$this->mockFactory->buildPlugin(Argument::any(), Argument::any())->willReturn($mockPlugin->reveal()); $this->mockFactory->buildPlugin(Argument::any(), Argument::any())->willReturn($mockPlugin->reveal());
$this->mockFactory->getResourceFor('PHPCI\Model\Build')->willReturn($build); $this->mockFactory->getResourceFor('PHPCI\Model\Build')->willReturn($build);
$this->testedExecutor->executePlugin($pluginName, $options); $this->testedExecutor->executePlugin($pluginName, $options, 'test');
} }
public function testExecutePlugin_ReturnsPluginSuccess() public function testExecutePlugin_ReturnsPluginSuccess()
@ -91,7 +91,7 @@ class ExecutorTest extends \PHPUnit_Framework_TestCase
$this->mockFactory->buildPlugin(Argument::any(), Argument::any())->willReturn($mockPlugin->reveal()); $this->mockFactory->buildPlugin(Argument::any(), Argument::any())->willReturn($mockPlugin->reveal());
$returnValue = $this->testedExecutor->executePlugin($pluginName, $options); $returnValue = $this->testedExecutor->executePlugin($pluginName, $options, 'test');
$this->assertEquals($expectedReturnValue, $returnValue); $this->assertEquals($expectedReturnValue, $returnValue);
} }
@ -103,7 +103,7 @@ class ExecutorTest extends \PHPUnit_Framework_TestCase
$this->mockBuildLogger->logFailure('Plugin does not exist: ' . $pluginName)->shouldBeCalledTimes(1); $this->mockBuildLogger->logFailure('Plugin does not exist: ' . $pluginName)->shouldBeCalledTimes(1);
$this->testedExecutor->executePlugin($pluginName, $options); $this->testedExecutor->executePlugin($pluginName, $options, 'test');
} }
public function testExecutePlugin_LogsFailureWhenExceptionsAreThrownByPlugin() public function testExecutePlugin_LogsFailureWhenExceptionsAreThrownByPlugin()
@ -121,7 +121,7 @@ class ExecutorTest extends \PHPUnit_Framework_TestCase
$this->mockBuildLogger->logFailure('Exception: ' . $expectedException->getMessage(), $expectedException) $this->mockBuildLogger->logFailure('Exception: ' . $expectedException->getMessage(), $expectedException)
->shouldBeCalledTimes(1); ->shouldBeCalledTimes(1);
$this->testedExecutor->executePlugin($pluginName, $options); $this->testedExecutor->executePlugin($pluginName, $options, 'test');
} }
public function testExecutePlugins_CallsEachPluginForStage() public function testExecutePlugins_CallsEachPluginForStage()

View file

@ -14,7 +14,7 @@ use PHPCI\Builder;
use PHPCI\Model\Build; use PHPCI\Model\Build;
use PHPCI\Plugin; use PHPCI\Plugin;
class ExamplePluginFull implements Plugin { class ExamplePluginFull extends Plugin\AbstractPlugin {
/** /**
* @var array * @var array
*/ */

View file

@ -12,7 +12,7 @@ namespace Tests\PHPCI\Plugin\Util\Fake;
use PHPCI\Plugin; use PHPCI\Plugin;
class ExamplePluginWithNoConstructorArgs implements Plugin class ExamplePluginWithNoConstructorArgs extends Plugin\AbstractPlugin
{ {
public function execute() public function execute()
{ {

View file

@ -12,7 +12,7 @@ namespace Tests\PHPCI\Plugin\Util\Fake;
use PHPCI\Plugin; use PHPCI\Plugin;
class ExamplePluginWithSingleOptionalArg implements Plugin class ExamplePluginWithSingleOptionalArg extends Plugin\AbstractPlugin
{ {
function __construct($optional = null) function __construct($optional = null)
{ {

View file

@ -12,7 +12,7 @@ namespace Tests\PHPCI\Plugin\Util\Fake;
use PHPCI\Plugin; use PHPCI\Plugin;
class ExamplePluginWithSingleRequiredArg implements Plugin class ExamplePluginWithSingleRequiredArg extends Plugin\AbstractPlugin
{ {
public $RequiredArgument; public $RequiredArgument;

View file

@ -12,7 +12,7 @@ namespace Tests\PHPCI\Plugin\Util\Fake;
use PHPCI\Plugin; use PHPCI\Plugin;
class ExamplePluginWithSingleTypedRequiredArg implements Plugin class ExamplePluginWithSingleTypedRequiredArg extends Plugin\AbstractPlugin
{ {
public $RequiredArgument; public $RequiredArgument;

456
composer.lock generated

File diff suppressed because it is too large Load diff