/** * Place a comment using the configured comment plus * a dump of payload data from the Payload. Set the * comment for a pull request or commit as determined * by the OPTION_PULL_REQUEST and OPTION_COMMIT flags * (both of which are booleans). * * Both options can be set to TRUE, but if pull request * commenting is enabled, it takes priority. To comment * on the HEAD commit of a pull request, run this plugin * with only the OPTION_COMMIT flag. * * @param Payload $payload * @return void */ public function process(Payload $payload) { $commentSetting = $this->getSetting(self::OPTION_COMMENT); if (FALSE === empty($commentSetting)) { $commentSetting .= PHP_EOL; } $errors = $payload->getResponse()->getErrors(); $output = $payload->getResponse()->getOutput(); $commentString = $commentSetting . $this->renderErrorsAsMarkupList($errors) . $this->renderPayloadDataAsMarkupList($output); $commentString = trim($commentString); if (TRUE === (bool) $this->getSettingValue(self::OPTION_PULL_REQUEST, FALSE)) { $payload->storePullRequestComment($payload->getPullRequest(), $commentString); } elseif (TRUE === (bool) $this->getSettingValue(self::OPTION_COMMIT, FALSE)) { $payload->storeCommitComment($payload->getHead(), $commentString); } }
/** * @param Payload $payload * @param Commit $commit * @param string $url * @return boolean */ protected function validateCodeStyleOfPhpFile(Payload $payload, Commit $commit, $url, $path) { $contents = file_get_contents($url); $syntaxCommand = 'php -l'; list($result, $errors) = $this->passStdinToCommand($syntaxCommand, $contents); if (FALSE === empty($errors)) { $errors = trim($errors); $errors = str_replace('parse error in - on line', 'parse error in ' . $path . ' on line', $errors); $payload->storeCommitValidation($payload->getPullRequest(), $commit, $errors, $path, substr($errors, 0, strrpos($errors, ' '))); $this->markCommit($payload, $commit, 'PHP syntax check failed! ' . $errors); return FALSE; } $codeStyleCommand = 'vendor/bin/phpcs --standard=' . $this->getSettingValue(self::OPTION_CODE_STYLE_RULES) . ' --report=json'; list($result, $errors) = $this->passStdinToCommand($codeStyleCommand, $contents); if (FALSE === empty($errors)) { $payload->getResponse()->addOutputFromPlugin($this, array('Error running PHPCS: ' . $errors)); return FALSE; } $validation = json_decode($result, JSON_OBJECT_AS_ARRAY); $errorsAndWarnings = (int) $validation['totals']['errors'] + (int) $validation['totals']['warnings']; if (0 === $errorsAndWarnings) { $this->markCommit($payload, $commit, 'No parsing errors and coding style is valid', 'success'); return TRUE; } else { $messages = $validation['files']['STDIN']['messages']; foreach ($messages as $messageData) { $payload->storeCommitValidation($payload->getPullRequest(), $commit, $messageData['message'], $path, $messageData['line']); $this->markCommit($payload, $commit, 'Commit has one or more coding standards violations'); } return FALSE; } }
/** * @param Payload $payload * @return boolean */ protected function validateCodeStyleOfPhpFilesInCommits(Payload $payload) { $url = $payload->getPullRequest()->getUrlCommits(); $urlPath = $this->getUrlPathFromUrl($url); $response = $payload->getApi()->get($urlPath); $commits = json_decode($response->getContent(), JSON_OBJECT_AS_ARRAY); $hasErrors = FALSE; foreach ($commits as $commitData) { $commitUrl = $commitData['url']; $commitUrlPath = $this->getUrlPathFromUrl($commitUrl); $commitResponse = $payload->getApi()->get($commitUrlPath); $commitData = json_decode($commitResponse->getContent(), JSON_OBJECT_AS_ARRAY); $commit = new Commit($commitData); $commit->setId($commitData['sha']); foreach ($commitData['files'] as $fileData) { $extension = pathinfo($fileData['filename'], PATHINFO_EXTENSION); if (self::PHP_EXTENSION === $extension) { $result = $this->validateCodeStyleOfPhpFile($payload, $commit, $fileData['raw_url'], $fileData['filename']); $hasErrors = TRUE !== $result || TRUE === $hasErrors; } } } return FALSE === $hasErrors; }