/** * @todo the policy check and Payload->isBuildable() could be implemented * as a voting system */ private function schedulePullRequest(PayloadInterface $payload, Project $project) { $logger = $this->get('logger'); switch ($project->getSettings()->getPolicy()) { case ProjectSettings::POLICY_ALL: case ProjectSettings::POLICY_PR: $doBuild = true; break; case ProjectSettings::POLICY_PATTERNS: case ProjectSettings::POLICY_NONE: $doBuild = false; break; default: $logger->error('could not find a build policy', ['project' => $project->getFullName(), 'pull_request_number' => $payload->getPullRequestNumber()]); return new JsonResponse(['project' => $project->getFullName(), 'class' => 'danger', 'policy' => $project->getSettings()->getPolicy(), 'message' => 'Could not find a valid build policy'], 400); } if (!$doBuild) { $logger->info('build declined by project policy', ['project' => $project->getId(), 'number' => $payload->getPullRequestNumber()]); return new JsonResponse(['class' => 'info', 'message' => 'Build declined by project policy (' . $project->getSettings()->getPolicy() . ')'], 200); } if (!$payload->isBuildable()) { return new JsonResponse(json_encode(['class' => 'danger', 'message' => 'pull request is not buildable']), 200); } $ref = sprintf('pull/%d/head', $payload->getPullRequestNumber()); $provider = $this->get('app_core.provider.factory')->getProvider($project); return [$ref, $provider->getHashFromRef($project, $ref)]; }