Example #1
0
 /**
  * @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];
 }