diff --git a/PHPCI/Controller/WebhookController.php b/PHPCI/Controller/WebhookController.php index f9a764ca..c448f163 100644 --- a/PHPCI/Controller/WebhookController.php +++ b/PHPCI/Controller/WebhookController.php @@ -170,7 +170,7 @@ class WebhookController extends \b8\Controller protected function githubCommitRequest(Project $project, array $payload) { // Github sends a payload when you close a pull request with a - // non-existant commit. We don't want this. + // non-existent commit. We don't want this. if (array_key_exists('after', $payload) && $payload['after'] === '0000000000000000000000000000000000000000') { return array('status' => 'ignored'); } diff --git a/PHPCI/Helper/AnsiConverter.php b/PHPCI/Helper/AnsiConverter.php index a5e42269..7df6663c 100644 --- a/PHPCI/Helper/AnsiConverter.php +++ b/PHPCI/Helper/AnsiConverter.php @@ -21,7 +21,7 @@ final class AnsiConverter static private $converter = null; /** - * Initialize the singletion. + * Initialize the singleton. * * @return AnsiToHtmlConverter */ @@ -35,7 +35,7 @@ final class AnsiConverter } /** - * Convert a text containing ANSI colr sequences into HTML code. + * Convert a text containing ANSI color sequences into HTML code. * * @param string $text The text to convert * @@ -47,7 +47,7 @@ final class AnsiConverter } /** - * Do not instanciate this class. + * Do not instantiate this class. */ private function __construct() { diff --git a/PHPCI/Helper/LoginIsDisabled.php b/PHPCI/Helper/LoginIsDisabled.php index 437b95cd..ec23858c 100644 --- a/PHPCI/Helper/LoginIsDisabled.php +++ b/PHPCI/Helper/LoginIsDisabled.php @@ -12,7 +12,7 @@ namespace PHPCI\Helper; use b8\Config; /** -* Login Is Disabled Helper - Checks if login is disalbed in the view +* Login Is Disabled Helper - Checks if login is disabled in the view * @author Stephen Ball * @package PHPCI * @subpackage Web diff --git a/PHPCI/Languages/lang.da.php b/PHPCI/Languages/lang.da.php index 20e403e1..d7a0df59 100644 --- a/PHPCI/Languages/lang.da.php +++ b/PHPCI/Languages/lang.da.php @@ -114,6 +114,7 @@ i din foretrukne hosting-platform.', 'default_branch' => 'Default branch navn', 'allow_public_status' => 'Tillad offentlig status-side og -billede for dette projekt?', 'archived' => 'Archived', + 'archived_menu' => 'Archived', 'save_project' => 'Gem Projekt', 'error_mercurial' => 'Mercurial repository-URL skal starte med http:// eller https://', @@ -203,7 +204,7 @@ Services sektionen under dit Bitbucket-repository.', 'build_finished' => 'Build Afsluttet', 'test_message' => 'Message', 'test_no_message' => 'No message', - 'test_success' => 'Succesfull: %d', + 'test_success' => 'Successful: %d', 'test_fail' => 'Failures: %d', 'test_skipped' => 'Skipped: %d', 'test_error' => 'Errors: %d', diff --git a/PHPCI/Languages/lang.de.php b/PHPCI/Languages/lang.de.php index f866a4de..cb7e3336 100644 --- a/PHPCI/Languages/lang.de.php +++ b/PHPCI/Languages/lang.de.php @@ -116,6 +116,7 @@ generiert. Um es zu verwenden, fügen Sie einfach den folgenden Public Key im Ab 'default_branch' => 'Name des Standardbranches', 'allow_public_status' => 'Öffentliche Statusseite und -bild für dieses Projekt einschalten?', 'archived' => 'Archived', + 'archived_menu' => 'Archived', 'save_project' => 'Projekt speichern', 'error_mercurial' => 'Mercurial Repository-URL muss mit http://, oder https:// beginnen', @@ -210,7 +211,7 @@ generiert. Um es zu verwenden, fügen Sie einfach den folgenden Public Key im Ab 'build_finished' => 'Build abgeschlossen', 'test_message' => 'Message', 'test_no_message' => 'No message', - 'test_success' => 'Succesfull: %d', + 'test_success' => 'Successful: %d', 'test_fail' => 'Failures: %d', 'test_skipped' => 'Skipped: %d', 'test_error' => 'Errors: %d', diff --git a/PHPCI/Languages/lang.el.php b/PHPCI/Languages/lang.el.php index cb7d169f..45ee4bee 100644 --- a/PHPCI/Languages/lang.el.php +++ b/PHPCI/Languages/lang.el.php @@ -115,6 +115,7 @@ PHPCI', 'default_branch' => 'Προκαθορισμένο όνομα διακλάδωσης', 'allow_public_status' => 'Ενεργοποίηση της σελίδας δημόσιας κατάστασης και την εικόνα για το έργο αυτό;', 'archived' => 'Archived', + 'archived_menu' => 'Archived', 'save_project' => 'Αποθήκευση έργου', 'error_mercurial' => 'Ο σύνδεσμος URL του ευμετάβλητου αποθετηρίου πρέπει να ξεκινάει με http:// ή https://', @@ -204,7 +205,7 @@ Services του Bitbucket αποθετηρίου σας.', 'build_finished' => 'Η κατασκευή ολοκληρώθηκε', 'test_message' => 'Message', 'test_no_message' => 'No message', - 'test_success' => 'Succesfull: %d', + 'test_success' => 'Successful: %d', 'test_fail' => 'Failures: %d', 'test_skipped' => 'Skipped: %d', 'test_error' => 'Errors: %d', diff --git a/PHPCI/Languages/lang.en.php b/PHPCI/Languages/lang.en.php index 9729d746..68ebd997 100644 --- a/PHPCI/Languages/lang.en.php +++ b/PHPCI/Languages/lang.en.php @@ -116,6 +116,7 @@ PHPCI', 'default_branch' => 'Default branch name', 'allow_public_status' => 'Enable public status page and image for this project?', 'archived' => 'Archived', + 'archived_menu' => 'Archived', 'save_project' => 'Save Project', 'error_mercurial' => 'Mercurial repository URL must be start with http:// or https://', @@ -213,7 +214,7 @@ PHPCI', 'build_finished' => 'Build Finished', 'test_message' => 'Message', 'test_no_message' => 'No message', - 'test_success' => 'Succesfull: %d', + 'test_success' => 'Successful: %d', 'test_fail' => 'Failures: %d', 'test_skipped' => 'Skipped: %d', 'test_error' => 'Errors: %d', diff --git a/PHPCI/Languages/lang.es.php b/PHPCI/Languages/lang.es.php index 95a6eb73..1b7b33f7 100644 --- a/PHPCI/Languages/lang.es.php +++ b/PHPCI/Languages/lang.es.php @@ -115,6 +115,7 @@ PHPCI', 'default_branch' => 'Nombre de la rama por defecto', 'allow_public_status' => '¿Activar página pública con el estado del proyecto?', 'archived' => 'Archivado', + 'archived_menu' => 'Archivado', 'save_project' => 'Guardar Proyecto', 'error_mercurial' => 'La URL del repositorio de Mercurial debe comenzar con http:// or https://', diff --git a/PHPCI/Languages/lang.fr.php b/PHPCI/Languages/lang.fr.php index dcde8424..a0f2cab8 100644 --- a/PHPCI/Languages/lang.fr.php +++ b/PHPCI/Languages/lang.fr.php @@ -115,6 +115,7 @@ PHPCI', 'default_branch' => 'Nom de la branche par défaut', 'allow_public_status' => 'Activer la page de statut publique et l\'image pour ce projet ?', 'archived' => 'Archived', + 'archived_menu' => 'Archived', 'save_project' => 'Enregistrer le projet', 'error_mercurial' => 'Les URLs de dépôt Mercurial doivent commencer par http:// ou https://', diff --git a/PHPCI/Languages/lang.it.php b/PHPCI/Languages/lang.it.php index ff326d14..d254fbcd 100644 --- a/PHPCI/Languages/lang.it.php +++ b/PHPCI/Languages/lang.it.php @@ -113,8 +113,9 @@ PHPCI', (se non puoi aggiungere il file phpci.yml nel repository di questo progetto)', 'default_branch' => 'Nome del branch di default', 'allow_public_status' => 'Vuoi rendere pubblica la pagina dello stato e l\'immagine per questo progetto?', - 'save_project' => 'Salva il Progetto', 'archived' => 'Archived', + 'archived_menu' => 'Archived', + 'save_project' => 'Salva il Progetto', 'error_mercurial' => 'L\'URL del repository Mercurial URL deve iniziare con http:// o https://', 'error_remote' => 'L\'URL del repository deve iniziare con git://, http:// o https://', @@ -206,7 +207,7 @@ PHPCI', 'build_finished' => 'Build Terminata', 'test_message' => 'Message', 'test_no_message' => 'No message', - 'test_success' => 'Succesfull: %d', + 'test_success' => 'Successful: %d', 'test_fail' => 'Failures: %d', 'test_skipped' => 'Skipped: %d', 'test_error' => 'Errors: %d', diff --git a/PHPCI/Languages/lang.nl.php b/PHPCI/Languages/lang.nl.php index e0638aaf..96d9f5d5 100644 --- a/PHPCI/Languages/lang.nl.php +++ b/PHPCI/Languages/lang.nl.php @@ -115,6 +115,7 @@ van je gekozen source code hosting platform', 'default_branch' => 'Standaard branch naam', 'allow_public_status' => 'Publieke statuspagina en afbeelding beschikbaar maken voor dit project?', 'archived' => 'Archived', + 'archived_menu' => 'Archived', 'save_project' => 'Project opslaan', 'error_mercurial' => 'Mercurial repository URL dient te starten met http:// of https://', @@ -204,7 +205,7 @@ Services sectie van je Bitbucket repository toegevoegd worden.', 'build_finished' => 'Build beëindigd', 'test_message' => 'Message', 'test_no_message' => 'No message', - 'test_success' => 'Succesfull: %d', + 'test_success' => 'Successful: %d', 'test_fail' => 'Failures: %d', 'test_skipped' => 'Skipped: %d', 'test_error' => 'Errors: %d', diff --git a/PHPCI/Languages/lang.pl.php b/PHPCI/Languages/lang.pl.php index d6f95ad6..837fea6e 100644 --- a/PHPCI/Languages/lang.pl.php +++ b/PHPCI/Languages/lang.pl.php @@ -116,6 +116,7 @@ od wybranego kodu źródłowego platformy hostingowej.', 'default_branch' => 'Domyślna nazwa gałęzi', 'allow_public_status' => 'Włączyć status publiczny dla tego projektu?', 'archived' => 'W archiwum', + 'archived_menu' => 'W archiwum', 'save_project' => 'Zachowaj Projekt', 'error_mercurial' => 'URL repozytorium Mercurialnego powinno zaczynać się od http:// and https://', @@ -207,7 +208,7 @@ Services repozytoria Bitbucket.', 'build_finished' => 'Budowanie Zakończone', 'test_message' => 'Message', 'test_no_message' => 'No message', - 'test_success' => 'Succesfull: %d', + 'test_success' => 'Successful: %d', 'test_fail' => 'Failures: %d', 'test_skipped' => 'Skipped: %d', 'test_error' => 'Errors: %d', diff --git a/PHPCI/Languages/lang.ru.php b/PHPCI/Languages/lang.ru.php index 3d6aa5b6..9d837fc0 100644 --- a/PHPCI/Languages/lang.ru.php +++ b/PHPCI/Languages/lang.ru.php @@ -112,7 +112,8 @@ PHPCI', (если вы не добавили файл phpci.yml в репозиторий вашего проекта)', 'default_branch' => 'Ветка по умолчанию', 'allow_public_status' => 'Разрешить публичный статус и изображение (статуса) для проекта', - 'archived' => 'Запакован', + 'archived' => 'Архивный', + 'archived_menu' => 'Архив', 'save_project' => 'Сохранить проект', 'error_mercurial' => 'URL репозитория Mercurial должен начинаться с http:// или https://', diff --git a/PHPCI/Languages/lang.uk.php b/PHPCI/Languages/lang.uk.php index a3ca1b37..54ced220 100644 --- a/PHPCI/Languages/lang.uk.php +++ b/PHPCI/Languages/lang.uk.php @@ -113,7 +113,8 @@ PHPCI', (якщо ви не додали файл phpci.yml до репозиторію вашого проекту)', 'default_branch' => 'Назва гілки за замовчуванням', 'allow_public_status' => 'Увімкнути публічну сторінку статусу та зображення для цього проекта?', - 'archived' => 'Archived', + 'archived' => 'Архівний', + 'archived_menu' => 'Архів', 'save_project' => 'Зберегти проект', 'error_mercurial' => 'URL репозиторію Mercurial повинен починатись із http:// або https://', @@ -204,7 +205,7 @@ PHPCI', 'build_finished' => 'Збірка завершена', 'test_message' => 'Message', 'test_no_message' => 'No message', - 'test_success' => 'Succesfull: %d', + 'test_success' => 'Successful: %d', 'test_fail' => 'Failures: %d', 'test_skipped' => 'Skipped: %d', 'test_error' => 'Errors: %d', diff --git a/PHPCI/Model/Build/GithubBuild.php b/PHPCI/Model/Build/GithubBuild.php index 130d7acb..214268ec 100644 --- a/PHPCI/Model/Build/GithubBuild.php +++ b/PHPCI/Model/Build/GithubBuild.php @@ -218,6 +218,8 @@ class GithubBuild extends RemoteGitBuild */ protected function getDiffLineNumber(Builder $builder, $file, $line) { + $line = (integer)$line; + $builder->logExecOutput(false); $prNumber = $this->getExtra('pull_request_number'); diff --git a/PHPCI/Plugin/Codeception.php b/PHPCI/Plugin/Codeception.php index 6d020210..79f05cdf 100644 --- a/PHPCI/Plugin/Codeception.php +++ b/PHPCI/Plugin/Codeception.php @@ -99,7 +99,7 @@ class Codeception implements \PHPCI\Plugin, \PHPCI\ZeroConfigPlugin } /** - * Runs Codeception tests, optionally using specified config file(s). + * Runs Codeception tests */ public function execute() { diff --git a/PHPCI/Plugin/Email.php b/PHPCI/Plugin/Email.php index c2638860..8faa5bb7 100644 --- a/PHPCI/Plugin/Email.php +++ b/PHPCI/Plugin/Email.php @@ -134,7 +134,7 @@ class Email implements \PHPCI\Plugin * Send an email to a list of specified subjects. * * @param array $toAddresses - * List of destinatary of message. + * List of destination addresses for message. * @param string $subject * Mail subject * @param string $body diff --git a/PHPCI/Plugin/Mysql.php b/PHPCI/Plugin/Mysql.php index 5c36a09f..fdb521ef 100644 --- a/PHPCI/Plugin/Mysql.php +++ b/PHPCI/Plugin/Mysql.php @@ -166,10 +166,11 @@ class Mysql implements \PHPCI\Plugin $args = array( ':import_file' => escapeshellarg($import_file), ':decomp_cmd' => $decomp_cmd, + ':host' => escapeshellarg($this->host), ':user' => escapeshellarg($this->user), ':pass' => escapeshellarg($this->pass), ':database' => ($database === null)? '': escapeshellarg($database), ); - return strtr('cat :import_file :decomp_cmd | mysql -u:user -p:pass :database', $args); + return strtr('cat :import_file :decomp_cmd | mysql -h:host -u:user -p:pass :database', $args); } } diff --git a/PHPCI/Plugin/Pdepend.php b/PHPCI/Plugin/Pdepend.php index 73b669c1..faef406d 100644 --- a/PHPCI/Plugin/Pdepend.php +++ b/PHPCI/Plugin/Pdepend.php @@ -73,8 +73,11 @@ class Pdepend implements \PHPCI\Plugin */ public function execute() { + if (!file_exists($this->location)) { + mkdir($this->location); + } if (!is_writable($this->location)) { - throw new \Exception(sprintf('The location %s is not writable.', $this->location)); + throw new \Exception(sprintf('The location %s is not writable or does not exist.', $this->location)); } $pdepend = $this->phpci->findBinary('pdepend'); diff --git a/PHPCI/Plugin/PhpCpd.php b/PHPCI/Plugin/PhpCpd.php index 6433308f..953c3ea7 100644 --- a/PHPCI/Plugin/PhpCpd.php +++ b/PHPCI/Plugin/PhpCpd.php @@ -28,7 +28,7 @@ class PhpCpd implements \PHPCI\Plugin /** * @var string, based on the assumption the root may not hold the code to be - * tested, exteds the base path + * tested, extends the base path */ protected $path; diff --git a/PHPCI/Plugin/PhpCsFixer.php b/PHPCI/Plugin/PhpCsFixer.php index 9ab187cc..817f3efc 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=all'; + protected $level = ' --level=psr2'; protected $verbose = ''; protected $diff = ''; - protected $levels = array('psr0', 'psr1', 'psr2', 'all'); + protected $levels = array('psr0', 'psr1', 'psr2', 'symfony'); /** * Standard Constructor diff --git a/PHPCI/Plugin/PhpMessDetector.php b/PHPCI/Plugin/PhpMessDetector.php index b02f5f09..4d075fda 100644 --- a/PHPCI/Plugin/PhpMessDetector.php +++ b/PHPCI/Plugin/PhpMessDetector.php @@ -38,7 +38,7 @@ class PhpMessDetector implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin /** * @var string, based on the assumption the root may not hold the code to be - * tested, exteds the base path only if the provided path is relative. Absolute + * tested, extends the base path only if the provided path is relative. Absolute * paths are used verbatim */ protected $path; @@ -50,7 +50,7 @@ class PhpMessDetector implements PHPCI\Plugin, PHPCI\ZeroConfigPlugin /** * Array of PHPMD rules. Can be one of the builtins (codesize, unusedcode, naming, design, controversial) - * or a filenname (detected by checking for a / in it), either absolute or relative to the project root. + * or a filename (detected by checking for a / in it), either absolute or relative to the project root. * @var array */ protected $rules; diff --git a/PHPCI/Plugin/Util/TapParser.php b/PHPCI/Plugin/Util/TapParser.php index 18772a6a..b48f6f00 100644 --- a/PHPCI/Plugin/Util/TapParser.php +++ b/PHPCI/Plugin/Util/TapParser.php @@ -13,9 +13,10 @@ use Symfony\Component\Yaml\Yaml; class TapParser { const TEST_COUNTS_PATTERN = '/^\d+\.\.(\d+)/'; - const TEST_LINE_PATTERN = '/^(ok|not ok)(?:\s+\d+)?(?:\s+\-)?\s*(.*?)(?:\s*#\s*(skip|todo)\s*(.*))?\s*$/i'; - const TEST_YAML_START = '/^(\s*)---/'; - const TEST_DIAGNOSTIC = '/^#/'; + const TEST_LINE_PATTERN = '/^(ok|not ok)(?:\s+\d+)?(?:\s+\-)?\s*(.*?)(?:\s*#\s*(skip|todo)\s*(.*))?\s*$/i'; + const TEST_YAML_START = '/^(\s*)---/'; + const TEST_DIAGNOSTIC = '/^#/'; + const TEST_COVERAGE = '/^Generating/'; /** * @var string @@ -73,7 +74,7 @@ class TapParser $line = $this->nextLine(); if ($line === $header) { - throw new Exception("Duplicated TAP log, please check the configration."); + throw new Exception("Duplicated TAP log, please check the configuration."); } while ($line !== false && ($this->testCount === false || count($this->results) < $this->testCount)) { @@ -81,7 +82,7 @@ class TapParser $line = $this->nextLine(); } - if (count($this->results) !== $this->testCount) { + if (false !== $this->testCount && count($this->results) !== $this->testCount) { throw new Exception(Lang::get('tap_error')); } @@ -96,7 +97,7 @@ class TapParser */ protected function findTapLog() { - // Look for the beggning of the TAP output + // Look for the beginning of the TAP output do { $header = $this->nextLine(); } while ($header !== false && substr($header, 0, 12) !== 'TAP version '); @@ -123,19 +124,14 @@ class TapParser return false; } - /** Parse a single line. - * + /** * @param string $line + * + * @return boolean */ - protected function parseLine($line) + protected function testLine($line) { - if (preg_match(self::TEST_COUNTS_PATTERN, $line, $matches)) { - $this->testCount = intval($matches[1]); - - } elseif (preg_match(self::TEST_DIAGNOSTIC, $line)) { - return; - - } elseif (preg_match(self::TEST_LINE_PATTERN, $line, $matches)) { + if (preg_match(self::TEST_LINE_PATTERN, $line, $matches)) { $this->results[] = $this->processTestLine( $matches[1], isset($matches[2]) ? $matches[2] : '', @@ -143,18 +139,61 @@ class TapParser isset($matches[4]) ? $matches[4] : null ); - } elseif (preg_match(self::TEST_YAML_START, $line, $matches)) { + return true; + } + + return false; + } + + /** + * @param string $line + * + * @return boolean + */ + protected function yamlLine($line) + { + if (preg_match(self::TEST_YAML_START, $line, $matches)) { $diagnostic = $this->processYamlBlock($matches[1]); - $test = array_pop($this->results); + $test = array_pop($this->results); if (isset($test['message'], $diagnostic['message'])) { $test['message'] .= PHP_EOL . $diagnostic['message']; unset($diagnostic['message']); } $this->results[] = array_replace($test, $diagnostic); - } else { - throw new Exception(sprintf('Incorrect TAP data, line %d: %s', $this->lineNumber, $line)); + return true; } + + return false; + } + + /** Parse a single line. + * + * @param string $line + * + * @throws Exception + */ + protected function parseLine($line) + { + if (preg_match(self::TEST_DIAGNOSTIC, $line) || preg_match(self::TEST_COVERAGE, $line) || !$line) { + return; + } + + if (preg_match(self::TEST_COUNTS_PATTERN, $line, $matches)) { + $this->testCount = intval($matches[1]); + + return; + } + + if ($this->testLine($line)) { + return; + } + + if ($this->yamlLine($line)) { + return; + } + + throw new Exception(sprintf('Incorrect TAP data, line %d: %s', $this->lineNumber, $line)); } /** diff --git a/PHPCI/ProcessControl/PosixProcessControl.php b/PHPCI/ProcessControl/PosixProcessControl.php index 710ba9f1..bac55ee2 100644 --- a/PHPCI/ProcessControl/PosixProcessControl.php +++ b/PHPCI/ProcessControl/PosixProcessControl.php @@ -31,7 +31,7 @@ class PosixProcessControl implements ProcessControlInterface * Sends a TERMINATE or KILL signal to the process using posix_kill. * * @param int $pid - * @param bool $forcefully Whetehr to send TERMINATE (false) or KILL (true). + * @param bool $forcefully Whether to send TERMINATE (false) or KILL (true). */ public function kill($pid, $forcefully = false) { diff --git a/PHPCI/View/Session.phtml b/PHPCI/View/Session.phtml index 9975d697..c28d9bfc 100644 --- a/PHPCI/View/Session.phtml +++ b/PHPCI/View/Session.phtml @@ -67,6 +67,14 @@ bottom: 50px; right: 50px; } + + @media(max-width:767px) { + #logo { + position: inherit; + margin: 0 auto; + margin-top: 50px; + } + } #logo:hover { background-image: url('https://www.block8.co.uk/assets/images/b8-phpci-logo.png'); diff --git a/PHPCI/View/layout.phtml b/PHPCI/View/layout.phtml index cbd98161..c5f85ee0 100644 --- a/PHPCI/View/layout.phtml +++ b/PHPCI/View/layout.phtml @@ -143,7 +143,7 @@ - + User()->getIsAdmin()): ?>
  • @@ -262,7 +262,7 @@
  • - +
  • @@ -299,7 +299,9 @@ + + diff --git a/Tests/PHPCI/Command/CreateBuildCommandTest.php b/Tests/PHPCI/Command/CreateBuildCommandTest.php index 59395de5..e82ae517 100644 --- a/Tests/PHPCI/Command/CreateBuildCommandTest.php +++ b/Tests/PHPCI/Command/CreateBuildCommandTest.php @@ -78,7 +78,7 @@ class CreateBuildCommandTest extends \PHPUnit_Framework_TestCase /** * @expectedException \InvalidArgumentException */ - public function testExecuteWithUnknowProjectId() + public function testExecuteWithUnknownProjectId() { $commandTester = $this->getCommandTester(); $commandTester->execute(array('projectId' => 2)); diff --git a/Tests/PHPCI/Command/InstallCommandTest.php b/Tests/PHPCI/Command/InstallCommandTest.php index 73b83462..040a4803 100644 --- a/Tests/PHPCI/Command/InstallCommandTest.php +++ b/Tests/PHPCI/Command/InstallCommandTest.php @@ -175,7 +175,7 @@ class InstallCommandTest extends \PHPUnit_Framework_TestCase $this->assertEquals('testedvalue', $this->config['b8']['database']['name']); } - public function testDatabaseUserameConfig() + public function testDatabaseUserConfig() { $dialog = $this->getDialogHelperMock(); @@ -243,7 +243,7 @@ class InstallCommandTest extends \PHPUnit_Framework_TestCase $this->assertEquals('test@phpci.com', $this->admin['mail']); } - public function testAdminUserameConfig() + public function testAdminNameConfig() { $dialog = $this->getDialogHelperMock(); diff --git a/Tests/PHPCI/Plugin/EmailTest.php b/Tests/PHPCI/Plugin/EmailTest.php index bb039ca4..0787d41d 100644 --- a/Tests/PHPCI/Plugin/EmailTest.php +++ b/Tests/PHPCI/Plugin/EmailTest.php @@ -236,11 +236,11 @@ class EmailTest extends \PHPUnit_Framework_TestCase /** * @covers PHPUnit::execute */ - public function testExecute_UniqueRecipientsWithCommiter() + public function testExecute_UniqueRecipientsWithCommitter() { $this->loadEmailPluginWithOptions( array( - 'commiter' => true, + 'committer' => true, 'addresses' => array('test-receiver@example.com', 'committer@test.com') ) ); diff --git a/Tests/PHPCI/Plugin/Util/FilesPluginInformationTest.php b/Tests/PHPCI/Plugin/Util/FilesPluginInformationTest.php index 1b674e9c..4af2d7a6 100644 --- a/Tests/PHPCI/Plugin/Util/FilesPluginInformationTest.php +++ b/Tests/PHPCI/Plugin/Util/FilesPluginInformationTest.php @@ -15,7 +15,7 @@ use PHPCI\Plugin\Util\FilesPluginInformation; class FilesPluginInformationTest extends \PHPUnit_Framework_TestCase { - public function testGetInstalledPlugins_returnsObjectes() + public function testGetInstalledPlugins_returnsObjects() { $pluginDirPath = realpath(__DIR__ . "/../../../../PHPCI/Plugin/"); $test = FilesPluginInformation::newFromDir($pluginDirPath); diff --git a/Tests/PHPCI/Plugin/Util/TapParserTest.php b/Tests/PHPCI/Plugin/Util/TapParserTest.php index 732a44a6..8d31d7c9 100644 --- a/Tests/PHPCI/Plugin/Util/TapParserTest.php +++ b/Tests/PHPCI/Plugin/Util/TapParserTest.php @@ -23,6 +23,28 @@ ok 1 - SomeTest::testAnother not ok 1..2 Trailing garbage ! +TAP; + $parser = new TapParser($content); + $result = $parser->parse(); + + $this->assertEquals(array( + array('pass' => true, 'severity' => 'success', 'message' => 'SomeTest::testAnother'), + array('pass' => false, 'severity' => 'fail', 'message' => ''), + ), $result); + + $this->assertEquals(1, $parser->getTotalFailures()); + } + + public function testSimple2() + { + $content = <<parse(); @@ -48,6 +70,20 @@ TAP; $parser->parse(); } + public function testTapCoverage() + { + $content = <<parse(); + + $this->assertEquals(array(), $result); + } + /** * @expectedException \Exception * @expectedExceptionMessageRegExp /Duplicated TAP/ diff --git a/bootstrap.php b/bootstrap.php index ef1fe197..ebecad81 100644 --- a/bootstrap.php +++ b/bootstrap.php @@ -65,7 +65,7 @@ if (file_exists($configFile)) { /** * Allow to modify PHPCI configuration without modify versioned code. - * Dameons should be killed to apply changes in the file. + * Daemons should be killed to apply changes in the file. * * @ticket 781 */ diff --git a/composer.json b/composer.json index fad44cd9..277e1b55 100644 --- a/composer.json +++ b/composer.json @@ -48,7 +48,8 @@ "pimple/pimple": "~1.1", "robmorgan/phinx": "~0.4", "sensiolabs/ansi-to-html": "~1.1", - "pda/pheanstalk": "~3.1" + "pda/pheanstalk": "~3.1", + "maknz/slack": "~1.7" }, "require-dev": { diff --git a/composer.lock b/composer.lock index b399ce10..ab679aee 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": "22ff64c3aa3c951901e6332784ab617e", - "content-hash": "177ce296bc661eb8bff467cbd10a88e4", + "hash": "2acdd123806a7eda47a4a16614e560bb", + "content-hash": "9288b6bc9e7061c6338b039b70d29ea1", "packages": [ { "name": "block8/b8framework", @@ -54,6 +54,177 @@ ], "time": "2015-10-05 10:50:20" }, + { + "name": "guzzlehttp/guzzle", + "version": "6.1.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "66fd14b4d0b8f2389eaf37c5458608c7cb793a81" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/66fd14b4d0b8f2389eaf37c5458608c7cb793a81", + "reference": "66fd14b4d0b8f2389eaf37c5458608c7cb793a81", + "shasum": "" + }, + "require": { + "guzzlehttp/promises": "~1.0", + "guzzlehttp/psr7": "~1.1", + "php": ">=5.5.0" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "~4.0", + "psr/log": "~1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.1-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ], + "time": "2015-09-08 17:36:26" + }, + { + "name": "guzzlehttp/promises", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "97fe7210def29451ec74923b27e552238defd75a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/97fe7210def29451ec74923b27e552238defd75a", + "reference": "97fe7210def29451ec74923b27e552238defd75a", + "shasum": "" + }, + "require": { + "php": ">=5.5.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "time": "2015-08-15 19:37:21" + }, + { + "name": "guzzlehttp/psr7", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "4ef919b0cf3b1989523138b60163bbcb7ba1ff7e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/4ef919b0cf3b1989523138b60163bbcb7ba1ff7e", + "reference": "4ef919b0cf3b1989523138b60163bbcb7ba1ff7e", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "psr/http-message": "~1.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "PSR-7 message implementation", + "keywords": [ + "http", + "message", + "stream", + "uri" + ], + "time": "2015-08-15 19:32:36" + }, { "name": "ircmaxell/password-compat", "version": "v1.0.4", @@ -96,6 +267,55 @@ ], "time": "2014-11-20 16:49:30" }, + { + "name": "maknz/slack", + "version": "1.7.0", + "source": { + "type": "git", + "url": "https://github.com/maknz/slack.git", + "reference": "7f21fefc70c76b304adc1b3a780c8740dfcfb595" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maknz/slack/zipball/7f21fefc70c76b304adc1b3a780c8740dfcfb595", + "reference": "7f21fefc70c76b304adc1b3a780c8740dfcfb595", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "guzzlehttp/guzzle": "~6.0|~5.0|~4.0", + "php": ">=5.4.0" + }, + "require-dev": { + "mockery/mockery": "0.9.*", + "phpunit/phpunit": "4.2.*" + }, + "suggest": { + "illuminate/support": "Required for Laravel support" + }, + "type": "library", + "autoload": { + "psr-4": { + "Maknz\\Slack\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "maknz", + "email": "github@mak.geek.nz" + } + ], + "description": "A simple PHP package for sending messages to Slack, with a focus on ease of use and elegant syntax. Includes Laravel support out of the box.", + "keywords": [ + "laravel", + "slack" + ], + "time": "2015-06-03 03:35:16" + }, { "name": "monolog/monolog", "version": "1.17.1", @@ -270,6 +490,55 @@ ], "time": "2013-11-22 08:30:29" }, + { + "name": "psr/http-message", + "version": "1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "85d63699f0dbedb190bbd4b0d2b9dc707ea4c298" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/85d63699f0dbedb190bbd4b0d2b9dc707ea4c298", + "reference": "85d63699f0dbedb190bbd4b0d2b9dc707ea4c298", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "time": "2015-05-04 20:22:00" + }, { "name": "psr/log", "version": "1.0.0", @@ -1337,16 +1606,16 @@ }, { "name": "phpunit/phpunit", - "version": "4.8.11", + "version": "4.8.12", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "bdd199472410fd7e32751f9c814c7e06f2c21bd5" + "reference": "00194eb95989190a73198390ceca081ad3441a7f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/bdd199472410fd7e32751f9c814c7e06f2c21bd5", - "reference": "bdd199472410fd7e32751f9c814c7e06f2c21bd5", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/00194eb95989190a73198390ceca081ad3441a7f", + "reference": "00194eb95989190a73198390ceca081ad3441a7f", "shasum": "" }, "require": { @@ -1405,7 +1674,7 @@ "testing", "xunit" ], - "time": "2015-10-07 10:39:46" + "time": "2015-10-12 03:36:47" }, { "name": "phpunit/phpunit-mock-objects", @@ -1781,16 +2050,16 @@ }, { "name": "sebastian/global-state", - "version": "1.1.0", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "23af31f402993cfd94e99cbc4b782e9a78eb0e97" + "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/23af31f402993cfd94e99cbc4b782e9a78eb0e97", - "reference": "23af31f402993cfd94e99cbc4b782e9a78eb0e97", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", + "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", "shasum": "" }, "require": { @@ -1828,7 +2097,7 @@ "keywords": [ "global state" ], - "time": "2015-06-21 15:11:22" + "time": "2015-10-12 03:26:01" }, { "name": "sebastian/recursion-context", diff --git a/console.bat b/console.bat new file mode 100644 index 00000000..391a2617 --- /dev/null +++ b/console.bat @@ -0,0 +1 @@ +@php console %* \ No newline at end of file diff --git a/public/assets/img/logo-icon.png b/public/assets/img/logo-icon.png new file mode 100644 index 00000000..eb377672 Binary files /dev/null and b/public/assets/img/logo-icon.png differ diff --git a/public/assets/img/logo-icon.svg b/public/assets/img/logo-icon.svg new file mode 100644 index 00000000..1c44f696 --- /dev/null +++ b/public/assets/img/logo-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/js/build.js b/public/assets/js/build.js index 0b1d95dc..c8bf588a 100644 --- a/public/assets/js/build.js +++ b/public/assets/js/build.js @@ -108,8 +108,8 @@ var Build = Class.extend({ output = $('
    ').append(output); } - var container = $('
    ').addClass('ui-plugin ' + plugin.css); - var content = $('
    ').attr('id', plugin.id).append(output); + var container = $('
    ').addClass('ui-plugin ' + plugin.css).attr('id', plugin.id); + var content = $('
    ').append(output); content.addClass('box box-default'); if (plugin.title) { @@ -145,4 +145,4 @@ var Build = Class.extend({ } }) -}); \ No newline at end of file +}); diff --git a/public/assets/js/sprintf.min.map b/public/assets/js/sprintf.min.map new file mode 100644 index 00000000..bced4235 --- /dev/null +++ b/public/assets/js/sprintf.min.map @@ -0,0 +1 @@ +{"version":3,"file":"sprintf.min.js","sources":["../src/sprintf.js"],"names":["window","sprintf","key","arguments","cache","hasOwnProperty","parse","format","call","get_type","variable","Object","prototype","toString","slice","toLowerCase","str_repeat","input","multiplier","Array","join","re","not_string","number","json","not_json","text","modulo","placeholder","key_access","index_access","sign","parse_tree","argv","arg","i","k","match","pad","pad_character","pad_length","cursor","tree_length","length","node_type","output","is_positive","Error","test","isNaN","TypeError","String","fromCharCode","parseInt","JSON","stringify","toExponential","parseFloat","toFixed","toPrecision","substring","toUpperCase","replace","charAt","fmt","_fmt","arg_names","exec","SyntaxError","field_list","replacement_field","field_match","vsprintf","_argv","splice","apply","exports","define","amd","this"],"mappings":"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"}