/** * @todo the policy check and Payload->isBuildable() could be implemented * as a voting system */ private function scheduleBranchPush(PayloadInterface $payload, Project $project) { $logger = $this->get('logger'); $em = $this->get('doctrine')->getManager(); if (!$payload->hasRef()) { return new JsonResponse(json_encode(null), 400); } $ref = $payload->getRef(); $hash = $payload->getHash(); # then, check if ref is configured to be automatically built $doBuild = false; switch ($project->getSettings()->getPolicy()) { case ProjectSettings::POLICY_ALL: $doBuild = true; break; case ProjectSettings::POLICY_NONE: case ProjectSettings::POLICY_PR: $doBuild = false; break; case ProjectSettings::POLICY_PATTERNS: $patterns = explode(PHP_EOL, $project->getSettings()->getBranchPatterns()); foreach ($patterns as $pattern) { $regex = strtr($pattern, ['*' => '.*', '?' => '.']); if (preg_match('/' . $regex . '/i', $ref)) { $doBuild = true; } } break; default: $logger->error('could not find a build policy', ['project' => $project->getId(), 'ref' => $ref]); return new JsonResponse(['class' => 'danger', 'message' => 'Could not find a build policy'], 400); } if (!$doBuild) { $logger->info('build declined by project policy', ['project' => $project->getId(), 'ref' => $ref]); return new JsonResponse(['class' => 'info', 'message' => 'Build declined by project policy (' . $project->getSettings()->getPolicy() . ')'], 200); } /** @todo this should be in the PayloadInterface as ->isDelete() or something */ if ($hash === '0000000000000000000000000000000000000000') { $branch = $em->getRepository('Model:Branch')->findOneByProjectAndName($project, $ref); $branch->setDeleted(true); $em->persist($branch); $em->flush(); return new JsonResponse(json_encode(null), 200); } $sameHashBuilds = $em->getRepository('Model:Build')->findByHash($hash); if (count($sameHashBuilds) > 0) { $logger->warn('found builds with same hash', ['count' => count($sameHashBuilds)]); $allowRebuild = array_reduce($sameHashBuilds, function ($result, $b) { return $result || $b->getAllowRebuild(); }, false); } if (isset($allowRebuild) && !$allowRebuild) { $logger->warn('build already scheduled for hash', ['hash' => $hash]); return new JsonResponse(['class' => 'danger', 'message' => 'Build already scheduled for hash'], 400); } else { $logger->info('scheduling build for hash', ['hash' => $hash]); } return [$ref, $hash]; }