From 31e48efd550e7e72975442fadb228941581c8559 Mon Sep 17 00:00:00 2001 From: Denis Denisov Date: Mon, 6 Feb 2017 19:38:09 +0700 Subject: [PATCH] Gogs webhook that is based github * https://gogs.io/docs/features/webhook.html --- .../Controller/WebhookController.php | 63 ++++++++++++++++++- 1 file changed, 61 insertions(+), 2 deletions(-) diff --git a/src/PHPCensor/Controller/WebhookController.php b/src/PHPCensor/Controller/WebhookController.php index 8621d93e..ce813e62 100644 --- a/src/PHPCensor/Controller/WebhookController.php +++ b/src/PHPCensor/Controller/WebhookController.php @@ -24,7 +24,7 @@ use b8\HttpClient; use b8\Exception\HttpException\NotFoundException; /** - * Webhook Controller - Processes webhook pings from BitBucket, Github, Gitlab, etc. + * Webhook Controller - Processes webhook pings from BitBucket, Github, Gitlab, Gogs, etc. * * @author Dan Cryer * @author Sami Tikka @@ -92,7 +92,7 @@ class WebhookController extends Controller public function bitbucket($projectId) { $project = $this->fetchProject($projectId, 'bitbucket'); - + // Support both old services and new webhooks if ($payload = $this->getParam('payload')) { return $this->bitbucketService(json_decode($payload, true), $project); @@ -424,6 +424,65 @@ class WebhookController extends Controller return $this->createBuild($project, $commit, $branch, $committer, $commitMessage); } + /** + * Called by Gogs Webhooks: + */ + public function gogs($projectId) + { + $project = $this->fetchProject($projectId, 'gogs'); + switch ($_SERVER['CONTENT_TYPE']) { + case 'application/json': + $payload = json_decode(file_get_contents('php://input'), true); + break; + case 'application/x-www-form-urlencoded': + $payload = json_decode($this->getParam('payload'), true); + break; + default: + return array('status' => 'failed', 'error' => 'Content type not supported.', 'responseCode' => 401); + } + // Handle Push web hooks: + if (array_key_exists('commits', $payload)) { + return $this->gogsCommitRequest($project, $payload); + } + return array('status' => 'ignored', 'message' => 'Unusable payload.'); + } + + /** + * Handle the payload when Gogs sends a commit webhook. + * + * @param Project $project + * @param array $payload + * @param b8\Http\Response\JsonResponse $response + * + * @return b8\Http\Response\JsonResponse + */ + protected function gogsCommitRequest(Project $project, array $payload) + { + if (isset($payload['commits']) && is_array($payload['commits'])) { + // If we have a list of commits, then add them all as builds to be tested: + $results = array(); + $status = 'failed'; + foreach ($payload['commits'] as $commit) { + try { + $branch = str_replace('refs/heads/', '', $payload['ref']); + $committer = $commit['author']['email']; + $results[$commit['id']] = $this->createBuild( + $project, + $commit['id'], + $branch, + $committer, + $commit['message'] + ); + $status = 'ok'; + } catch (Exception $ex) { + $results[$commit['id']] = array('status' => 'failed', 'error' => $ex->getMessage()); + } + } + return array('status' => $status, 'commits' => $results); + } + return array('status' => 'ignored', 'message' => 'Unusable payload.'); + } + /** * Wrapper for creating a new build. *