Refactored build type 'Pull request' logic.

This commit is contained in:
Dmitry Khomutov 2018-02-23 17:40:56 +07:00
parent 1623e05593
commit 429405809e
No known key found for this signature in database
GPG key ID: EC19426474B37AAC
12 changed files with 143 additions and 80 deletions

View file

@ -207,7 +207,6 @@ class WebhookController extends Controller
$message = $commit['message']; $message = $commit['message'];
$extra = [ $extra = [
'build_type' => 'pull_request',
'pull_request_number' => $payload['pullrequest']['id'], 'pull_request_number' => $payload['pullrequest']['id'],
'remote_branch' => $payload['pullrequest']['source']['branch']['name'], 'remote_branch' => $payload['pullrequest']['source']['branch']['name'],
'remote_reference' => $payload['pullrequest']['source']['repository']['full_name'], 'remote_reference' => $payload['pullrequest']['source']['repository']['full_name'],
@ -437,7 +436,7 @@ class WebhookController extends Controller
foreach ($commits as $commit) { foreach ($commits as $commit) {
// Skip all but the current HEAD commit ID: // Skip all but the current HEAD commit ID:
$id = $commit['sha']; $id = $commit['sha'];
if ($id != $payload['pull_request']['head']['sha']) { if ($id !== $payload['pull_request']['head']['sha']) {
$results[$id] = ['status' => 'ignored', 'message' => 'not branch head']; $results[$id] = ['status' => 'ignored', 'message' => 'not branch head'];
continue; continue;
} }
@ -447,14 +446,10 @@ class WebhookController extends Controller
$committer = $commit['commit']['author']['email']; $committer = $commit['commit']['author']['email'];
$message = $commit['commit']['message']; $message = $commit['commit']['message'];
$remoteUrlKey = $payload['pull_request']['head']['repo']['private'] ? 'ssh_url' : 'clone_url';
$extra = [ $extra = [
'build_type' => 'pull_request',
'pull_request_id' => $payload['pull_request']['id'],
'pull_request_number' => $payload['number'], 'pull_request_number' => $payload['number'],
'remote_branch' => $payload['pull_request']['head']['ref'], 'remote_branch' => $payload['pull_request']['head']['ref'],
'remote_url' => $payload['pull_request']['head']['repo'][$remoteUrlKey], 'remote_reference' => $payload['pull_request']['head']['repo']['full_name'],
]; ];
$results[$id] = $this->createBuild( $results[$id] = $this->createBuild(

View file

@ -50,6 +50,5 @@ class FixDatabaseColumns extends AbstractMigration
public function down() public function down()
{ {
} }
} }

View file

@ -6,27 +6,27 @@ class UniqueEmailAndNameUserFields extends AbstractMigration
{ {
public function up() public function up()
{ {
$user_table = $this->table('user'); $table = $this->table('user');
if (!$user_table->hasIndex('email', ['unique' => true])) { if (!$table->hasIndex('email')) {
$user_table->addIndex('email', ['unique' => true])->save(); $table->addIndex('email', ['unique' => true])->save();
} }
if (!$user_table->hasIndex('name', ['unique' => true])) { if (!$table->hasIndex('name')) {
$user_table->addIndex('name', ['unique' => true])->save(); $table->addIndex('name', ['unique' => true])->save();
} }
} }
public function down() public function down()
{ {
$user_table = $this->table('user'); $table = $this->table('user');
if ($user_table->hasIndex('email', ['unique' => true])) { if ($table->hasIndex('email')) {
$user_table->removeIndex(['email'], ['unique' => true])->save(); $table->removeIndex(['email'])->save();
} }
if ($user_table->hasIndex('name', ['unique' => true])) { if ($table->hasIndex('name')) {
$user_table->removeIndex(['name'], ['unique' => true])->save(); $table->removeIndex(['name'])->save();
} }
} }
} }

View file

@ -8,11 +8,11 @@ class RemoveUniqueNameIndex extends AbstractMigration
{ {
$user = $this->table('user'); $user = $this->table('user');
if ($user->hasIndex('name', ['unique' => true])) { if ($user->hasIndex('name')) {
$user->removeIndex(['name'], ['unique' => true])->save(); $user->removeIndex(['name'])->save();
} }
if (!$user->hasIndex('name', ['unique' => true])) { if (!$user->hasIndex('name')) {
$user->addIndex(['name'], ['unique' => false])->save(); $user->addIndex(['name'], ['unique' => false])->save();
} }
} }

View file

@ -24,8 +24,8 @@ class ConvertErrors extends AbstractMigration
$this->metaStore = Factory::getStore('BuildMeta'); $this->metaStore = Factory::getStore('BuildMeta');
$this->errorStore = Factory::getStore('BuildError'); $this->errorStore = Factory::getStore('BuildError');
while ($count === 100) { while ($count >= 100) {
$data = $this->metaStore->getErrorsForUpgrade(100); $data = $this->metaStore->getErrorsForUpgrade(100);
$count = count($data); $count = count($data);
/** @var \PHPCensor\Model\BuildMeta $meta */ /** @var \PHPCensor\Model\BuildMeta $meta */

View file

@ -0,0 +1,56 @@
<?php
use Phinx\Migration\AbstractMigration;
use b8\Store\Factory;
use PHPCensor\Store\BuildStore;
use PHPCensor\Model\Build;
class AddedRequestBranchToBuild extends AbstractMigration
{
public function up()
{
/** @var BuildStore $buildStore */
$buildStore = Factory::getStore('Build');
$count = 100;
$offset = 0;
while ($count >= 100) {
$builds = $buildStore->getBuilds(100, $offset);
$offset =+ 100;
$count = count($builds);
/** @var Build $build */
foreach ($builds as &$build) {
$extra = $build->getExtra();
if (isset($extra['build_type']) && 'pull_request' === $extra['build_type']) {
unset($extra['build_type']);
$build->setSource(Build::SOURCE_WEBHOOK_PULL_REQUEST);
}
if (!empty($extra['remote_url'])) {
preg_match(
'/[\/:]([a-zA-Z0-9_\-]+\/[a-zA-Z0-9_\-]+)/',
$extra['remote_url'],
$matches
);
$remoteReference = $matches[1];
if ($remoteReference && empty($extra['remote_reference'])) {
$extra['remote_reference'] = $remoteReference;
}
unset($extra['remote_url']);
}
$build->setExtra($extra);
$buildStore->save($build);
}
unset($build);
}
}
public function down()
{
}
}

View file

@ -849,13 +849,14 @@ class Build extends Model
/** /**
* Allows specific build types (e.g. Github) to report violations back to their respective services. * Allows specific build types (e.g. Github) to report violations back to their respective services.
*
* @param Builder $builder * @param Builder $builder
* @param $plugin * @param string $plugin
* @param $message * @param string $message
* @param int $severity * @param integer $severity
* @param null $file * @param string $file
* @param null $lineStart * @param integer $lineStart
* @param null $lineEnd * @param integer $lineEnd
*/ */
public function reportError( public function reportError(
Builder $builder, Builder $builder,

View file

@ -19,6 +19,8 @@ class BitbucketBuild extends RemoteGitBuild
{ {
/** /**
* Get link to commit from another source (i.e. BitBucket) * Get link to commit from another source (i.e. BitBucket)
*
* @return string
*/ */
public function getCommitLink() public function getCommitLink()
{ {
@ -27,6 +29,8 @@ class BitbucketBuild extends RemoteGitBuild
/** /**
* Get link to branch from another source (i.e. BitBucket) * Get link to branch from another source (i.e. BitBucket)
*
* @return string
*/ */
public function getBranchLink() public function getBranchLink()
{ {
@ -35,6 +39,8 @@ class BitbucketBuild extends RemoteGitBuild
/** /**
* Get link to tag from another source (i.e. BitBucket) * Get link to tag from another source (i.e. BitBucket)
*
* @return string
*/ */
public function getTagLink() public function getTagLink()
{ {
@ -97,7 +103,7 @@ class BitbucketBuild extends RemoteGitBuild
$url = sprintf( $url = sprintf(
'/2.0/repositories/%s/commit/%s/statuses/build', '/2.0/repositories/%s/commit/%s/statuses/build',
$this->getExtra('build_type') == 'pull_request' Build::SOURCE_WEBHOOK_PULL_REQUEST === $this->getSource()
? $this->getExtra('remote_reference') ? $this->getExtra('remote_reference')
: $project->getReference(), : $project->getReference(),
$this->getCommitId() $this->getCommitId()
@ -128,6 +134,8 @@ class BitbucketBuild extends RemoteGitBuild
/** /**
* Get the URL to be used to clone this remote repository. * Get the URL to be used to clone this remote repository.
*
* @return string
*/ */
protected function getCloneUrl() protected function getCloneUrl()
{ {
@ -149,7 +157,7 @@ class BitbucketBuild extends RemoteGitBuild
{ {
$reference = $this->getProject()->getReference(); $reference = $this->getProject()->getReference();
if ($this->getExtra('build_type') == 'pull_request') { if (Build::SOURCE_WEBHOOK_PULL_REQUEST === $this->getSource()) {
$reference = $this->getExtra('remote_reference'); $reference = $this->getExtra('remote_reference');
} }
@ -162,21 +170,15 @@ class BitbucketBuild extends RemoteGitBuild
} }
/** /**
* Handle any post-clone tasks, like applying a pull request patch on top of the branch. * @inheritdoc
* @param Builder $builder
* @param $cloneTo
* @param array $extra
* @return bool
*/ */
protected function postCloneSetup(Builder $builder, $cloneTo, array $extra = null) protected function postCloneSetup(Builder $builder, $cloneTo, array $extra = null)
{ {
$buildType = $this->getExtra('build_type'); $success = true;
$success = true;
$skipGitFinalization = false; $skipGitFinalization = false;
try { try {
if (!empty($buildType) && $buildType == 'pull_request') { if (Build::SOURCE_WEBHOOK_PULL_REQUEST === $this->getSource()) {
$helper = new Bitbucket(); $helper = new Bitbucket();
$diff = $helper->getPullRequestDiff( $diff = $helper->getPullRequestDiff(
$this->getProject()->getReference(), $this->getProject()->getReference(),
@ -206,7 +208,8 @@ class BitbucketBuild extends RemoteGitBuild
/** /**
* Create an diff file on disk for this build. * Create an diff file on disk for this build.
* *
* @param string $cloneTo * @param string $cloneTo
* @param string $diff
* *
* @return string * @return string
*/ */
@ -271,10 +274,12 @@ class BitbucketBuild extends RemoteGitBuild
/** /**
* Uses git diff to figure out what the diff line position is, based on the error line number. * Uses git diff to figure out what the diff line position is, based on the error line number.
*
* @param Builder $builder * @param Builder $builder
* @param $file * @param string $file
* @param $line * @param integer $line
* @return int|null *
* @return integer|null
*/ */
protected function getDiffLineNumber(Builder $builder, $file, $line) protected function getDiffLineNumber(Builder $builder, $file, $line)
{ {

View file

@ -2,15 +2,19 @@
namespace PHPCensor\Model\Build; namespace PHPCensor\Model\Build;
use PHPCensor\Model\Build;
/** /**
* BitBucket Build Model * BitbucketHgBuild Build Model
* *
* @author Artem Bochkov <artem.v.bochkov@gmail.com> * @author Artem Bochkov <artem.v.bochkov@gmail.com>
*/ */
class BitbucketHgBuild extends MercurialBuild class BitbucketHgBuild extends MercurialBuild
{ {
/** /**
* Get link to commit from another source (i.e. BitBucket) * Get link to commit from another source (i.e. BitBucket)
*
* @return string
*/ */
public function getCommitLink() public function getCommitLink()
{ {
@ -19,6 +23,8 @@ class BitbucketHgBuild extends MercurialBuild
/** /**
* Get link to branch from another source (i.e. BitBucket) * Get link to branch from another source (i.e. BitBucket)
*
* @return string
*/ */
public function getBranchLink() public function getBranchLink()
{ {
@ -27,6 +33,8 @@ class BitbucketHgBuild extends MercurialBuild
/** /**
* Get the URL to be used to clone this remote repository. * Get the URL to be used to clone this remote repository.
*
* @return string
*/ */
protected function getCloneUrl() protected function getCloneUrl()
{ {
@ -48,11 +56,8 @@ class BitbucketHgBuild extends MercurialBuild
{ {
$reference = $this->getProject()->getReference(); $reference = $this->getProject()->getReference();
if ($this->getExtra('build_type') == 'pull_request') { if (Build::SOURCE_WEBHOOK_PULL_REQUEST === $this->getSource()) {
$matches = []; $reference = $this->getExtra('remote_reference');
preg_match('/[\/:]([a-zA-Z0-9_\-]+\/[a-zA-Z0-9_\-]+)/', $this->getExtra('remote_url'), $matches);
$reference = $matches[1];
} }
$link = 'https://bitbucket.org/' . $reference . '/'; $link = 'https://bitbucket.org/' . $reference . '/';

View file

@ -18,16 +18,20 @@ use PHPCensor\Model\BuildError;
class GithubBuild extends RemoteGitBuild class GithubBuild extends RemoteGitBuild
{ {
/** /**
* Get link to commit from another source (i.e. Github) * Get link to commit from another source (i.e. Github)
*/ *
* @return string
*/
public function getCommitLink() public function getCommitLink()
{ {
return 'https://github.com/' . $this->getProject()->getReference() . '/commit/' . $this->getCommitId(); return 'https://github.com/' . $this->getProject()->getReference() . '/commit/' . $this->getCommitId();
} }
/** /**
* Get link to branch from another source (i.e. Github) * Get link to branch from another source (i.e. Github)
*/ *
* @return string
*/
public function getBranchLink() public function getBranchLink()
{ {
return 'https://github.com/' . $this->getProject()->getReference() . '/tree/' . $this->getBranch(); return 'https://github.com/' . $this->getProject()->getReference() . '/tree/' . $this->getBranch();
@ -35,6 +39,8 @@ class GithubBuild extends RemoteGitBuild
/** /**
* Get link to tag from another source (i.e. Github) * Get link to tag from another source (i.e. Github)
*
* @return string
*/ */
public function getTagLink() public function getTagLink()
{ {
@ -117,8 +123,10 @@ class GithubBuild extends RemoteGitBuild
} }
/** /**
* Get the URL to be used to clone this remote repository. * Get the URL to be used to clone this remote repository.
*/ *
* @return string
*/
protected function getCloneUrl() protected function getCloneUrl()
{ {
$key = trim($this->getProject()->getSshPrivateKey()); $key = trim($this->getProject()->getSshPrivateKey());
@ -160,11 +168,8 @@ class GithubBuild extends RemoteGitBuild
{ {
$reference = $this->getProject()->getReference(); $reference = $this->getProject()->getReference();
if ($this->getExtra('build_type') == 'pull_request') { if (Build::SOURCE_WEBHOOK_PULL_REQUEST === $this->getSource()) {
$matches = []; $reference = $this->getExtra('remote_reference');
preg_match('/[\/:]([a-zA-Z0-9_\-]+\/[a-zA-Z0-9_\-]+)/', $this->getExtra('remote_url'), $matches);
$reference = $matches[1];
} }
$link = 'https://github.com/' . $reference . '/'; $link = 'https://github.com/' . $reference . '/';
@ -176,20 +181,14 @@ class GithubBuild extends RemoteGitBuild
} }
/** /**
* Handle any post-clone tasks, like applying a pull request patch on top of the branch. * @inheritdoc
* @param Builder $builder
* @param $cloneTo
* @param array $extra
* @return bool
*/ */
protected function postCloneSetup(Builder $builder, $cloneTo, array $extra = null) protected function postCloneSetup(Builder $builder, $cloneTo, array $extra = null)
{ {
$buildType = $this->getExtra('build_type');
$success = true; $success = true;
try { try {
if (!empty($buildType) && $buildType == 'pull_request') { if (Build::SOURCE_WEBHOOK_PULL_REQUEST === $this->getSource()) {
$pullRequestId = $this->getExtra('pull_request_number'); $pullRequestId = $this->getExtra('pull_request_number');
$cmd = 'cd "%s" && git checkout -b php-censor/' . $this->getId() $cmd = 'cd "%s" && git checkout -b php-censor/' . $this->getId()
@ -211,7 +210,7 @@ class GithubBuild extends RemoteGitBuild
} }
/** /**
* @inheritDoc * @inheritdoc
*/ */
public function reportError( public function reportError(
Builder $builder, Builder $builder,
@ -259,10 +258,12 @@ class GithubBuild extends RemoteGitBuild
/** /**
* Uses git diff to figure out what the diff line position is, based on the error line number. * Uses git diff to figure out what the diff line position is, based on the error line number.
*
* @param Builder $builder * @param Builder $builder
* @param $file * @param string $file
* @param $line * @param integer $line
* @return int|null *
* @return integer|null
*/ */
protected function getDiffLineNumber(Builder $builder, $file, $line) protected function getDiffLineNumber(Builder $builder, $file, $line)
{ {

View file

@ -135,7 +135,7 @@ class RemoteGitBuild extends Build
* @param string $cloneTo * @param string $cloneTo
* @param array $extra * @param array $extra
* *
* @return bool * @return boolean
*/ */
protected function postCloneSetup(Builder $builder, $cloneTo, array $extra = null) protected function postCloneSetup(Builder $builder, $cloneTo, array $extra = null)
{ {

View file

@ -3,7 +3,6 @@
namespace Tests\PHPCensor\Service; namespace Tests\PHPCensor\Service;
use PHPCensor\Model\Build; use PHPCensor\Model\Build;
use PHPCensor\Model\Project;
use PHPCensor\Service\BuildService; use PHPCensor\Service\BuildService;
/** /**
@ -32,12 +31,14 @@ class BuildServiceTest extends \PHPUnit\Framework\TestCase
public function setUp() public function setUp()
{ {
$this->mockBuildStore = $this->getMockBuilder('PHPCensor\Store\BuildStore')->getMock(); $this->mockBuildStore = $this->getMockBuilder('PHPCensor\Store\BuildStore')->getMock();
$this->mockBuildStore->expects($this->any()) $this->mockBuildStore
->method('save') ->expects($this->any())
->will($this->returnArgument(0)); ->method('save')
->will($this->returnArgument(0));
$this->mockEnvironmentStore = $this->getMockBuilder('PHPCensor\Store\EnvironmentStore')->getMock(); $this->mockEnvironmentStore = $this->getMockBuilder('PHPCensor\Store\EnvironmentStore')->getMock();
$this->mockEnvironmentStore->expects($this->any()) $this->mockEnvironmentStore
->expects($this->any())
->method('getByProjectId') ->method('getByProjectId')
->will($this->returnValue(['items' => [], 'count' => 0])); ->will($this->returnValue(['items' => [], 'count' => 0]));