/** * Register NB commits * @param Project $project * @param array $gitBranches * @return Project */ private function registerNbCommits(Project $project, array $gitBranches) { // Initialize datas $totalNbCommits = 0; // Loop on each branches for ($i = 0; $i < count($gitBranches); $i++) { // Increment total commits $totalNbCommits += $gitBranches[$i]["nb_commits"]; } // Update project if ($project->getGitNbCommits() != $totalNbCommits) { // Setting nb commits $project->setGitNbCommits($totalNbCommits); // Setting last commit date $project->setGitCommitLastUpdate(new \DateTime()); $this->getDoctrine()->getEntityManager()->flush(); } // Return return $project; }
/** * Process Entity arranges * @param Project $project * @param bool $remove * @return mixed */ protected function processProjectDeletionFinalize(Project $project, $remove = true) { $returnValues['slot_name'] = 'proc'; try { // Finalizing process if (!$remove) { // Unset Local DB VCS related datas $project->setGitLabProjectId(null); $project->setGitLabHttpUrlToRepo(null); $project->setGitLabSshUrlToRepo(null); $project->setGitLabWebUrl(null); $project->setGitLabNamespace(null); $project->setGitNbCommits(null); $project->setGitCommitLastUpdate(null); // Unset Local DB PM related datas $project->setRedmineProjectId(null); $project->setRedmineProjectIdentifier(null); $project->setRedmineWebUrl(null); // Unser local DB QA related datas $project->setSonarProjectId(null); $project->setSonarProjectKey(null); $project->setSonarProjectUrl(null); // Other $project->setActive(false); // Remove project CIs $cis = $this->em->getRepository('SpiritDevDBoxPortalBundle:ContinuousIntegration')->findBy(array('project' => $project)); foreach ($cis as $ci) { $this->em->remove($ci); } } else { // Removing project $this->em->remove($project); } // Updating datas $this->em->flush(); $returnValues['data'][] = $this->setRetVal('Entity updated', 'bool', true); // Send user mail + team mail ? $this->mailer->processProjectDeletionSendMail($project); $returnValues['data'][] = $this->setRetVal('Mail sent', 'bool', true); $this->session->getFlashBag()->set('success', 'flashbag.demand.processing_deletion_project.success'); } catch (\Exception $e) { $returnValues['data'][] = $this->setRetVal('Entity updated', 'bool', false); // $returnValues['data'][] = $this->setRetVal('Mail sent', 'bool', false); $this->session->getFlashBag()->set('error', 'flashbag.demand.processing_deletion_project.error'); } return $returnValues; }
/** * Send mail to project memebers to apply a project deletion * To project team * @param Project $project * @return mixed */ public function processProjectDeletionSendMail(Project $project) { // Define necessary vars $template = "SpiritDevDBoxPortalBundle:Mailer/Project:projectDeletion.html.twig"; // Template $subject = $this->getSubject('Project deletion - ' . $project->getName()); // Subject $renderingDatas = array('project' => $project); // Template rendering datas // Send mail(s) effectively foreach ($project->getTeamMembers() as $user) { $renderingDatas['firstname'] = $user->getFirstname(); $renderingDatas['lastname'] = $user->getLastname(); $rendered = $this->templating->render($template, $renderingDatas); // Template rendering $this->sendEmailMessage($rendered, $subject, $user->getEmail()); } }
/** * @param InputInterface $input * @param OutputInterface $output * @return null */ protected function execute(InputInterface $input, OutputInterface $output) { // Get inputs $from = $input->getArgument('from'); $pjtname = $input->getArgument('pjtname'); // Important vars $container = $this->getContainer(); $router = $container->get('router'); $selfBaseUrl = $container->getParameter('spirit_dev_d_box_portal.app.self_base_url'); $em = $container->get('doctrine')->getManager(); $io = new SymfonyStyle($input, $output); // // API's $apiPM = $container->get('spirit_dev_dbox_portal_bundle.api.redmine'); $apiVCS = $container->get('spirit_dev_dbox_portal_bundle.api.gitlab'); $io->title(sprintf('Import project -- %s -- from -- %s --', $pjtname, $from)); $pmProject = null; $vcsProject = null; $dbProject = null; // Import values from PM if requested if ($from == 'pm' || $from == 'both') { $io->section('PM Check'); $pmProjectId = $apiPM->getProjectIdByName($pjtname); if (intval($pmProjectId)) { $tmpPjt = new Project(); $tmpPjt->setRedmineProjectId($pmProjectId); $pmProject = $apiPM->showProject($tmpPjt); $io->success('Project -- ' . $pjtname . ' -- found in PM'); $io->table(array('Name', 'Id', 'Identifier', 'description'), array(array($pmProject['project']['name'], $pmProject['project']['id'], $pmProject['project']['identifier'], empty($pmProject['project']['description']) ? "none" : $pmProject['project']['description']))); } else { $io->error('This project does not exists in PM, check value case'); if ($from != "both") { exit(0); } } } // Import values from VCS if requested if ($from == 'vcs' || $from == 'both') { $io->section('VCS Check'); $vcsProjectId = $apiVCS->getProjectIdByName($pjtname); if (intval($vcsProjectId)) { $vcsProject = $apiVCS->getProject($vcsProjectId); $io->success('Project -- ' . $pjtname . ' -- found in VCS'); $io->table(array('Name', 'Id', 'description', 'SSH Url', 'HTTP Url', 'WEB Url', 'Namespace', 'Issues', 'Wiki', 'Snippets'), array(array($vcsProject['name'], $vcsProject['id'], $vcsProject['description'], $vcsProject['ssh_url_to_repo'], $vcsProject['http_url_to_repo'], $vcsProject['web_url'], $vcsProject['path_with_namespace'], $vcsProject['issues_enabled'], $vcsProject['wiki_enabled'], $vcsProject['snippets_enabled']))); } else { $io->error('This project does not exists in VCS, check value case'); exit(0); } } // Check if project exists in db $io->section('DB Check'); $dbProject = $em->getRepository('SpiritDevDBoxPortalBundle:Project')->findOneBy(array('canonicalName' => strtolower($pjtname))); if ($dbProject) { $io->note('Project -- ' . $pjtname . ' -- already exists in database!'); $io->caution('Local DB Project will be update'); } else { $io->note('Project -- ' . $pjtname . ' -- does not exists in database!'); $io->note('A local DB Project will be created'); } // Starting import $io->section('Starting Importation'); if ($dbProject) { // Updating entity if ($input->getOption('force-update') && $io->confirm('Do you want to continue ?', true)) { // Import PM Values if ($from == "pm" || $from == "both") { $io->writeln('Importing from PM'); $dbProject->setRedmineProjectId($pmProject['project']['id']); $dbProject->setRedmineProjectIdentifier($pmProject['project']['identifier']); $dbProject->setRedmineWebUrl($apiPM->getProjectWebUrl($dbProject)); $io->writeln('Updating PM remote project'); $dbProject->setName($pjtname); $update = $apiPM->updateProject($dbProject); } // Import VCS Values if ($from == "vcs" || $from == "both") { $io->writeln('Importing from VCS'); $dbProject->setGitLabIssueEnabled($vcsProject['issues_enabled']); $dbProject->setGitLabWikiEnabled($vcsProject['wiki_enabled']); $dbProject->setGitLabSnippetsEnabled($vcsProject['snippets_enabled']); $dbProject->setGitLabProjectId($vcsProject['id']); $dbProject->setGitLabSshUrlToRepo($vcsProject['ssh_url_to_repo']); $dbProject->setGitLabHttpUrlToRepo($vcsProject['http_url_to_repo']); $dbProject->setGitLabWebUrl($vcsProject['web_url']); $dbProject->setGitLabNamespace($vcsProject['path_with_namespace']); $io->writeln('Updating VCS remote project'); // Create hooks $nbCommitHookUrl = $selfBaseUrl != 'none' ? $selfBaseUrl . "web_hook/update/nb_commit/" . $dbProject->getId() : $router->generate('spirit_dev_dbox_portal_bundle_webhook_pjt_update_nbcommits', array('pjt_id' => $dbProject->getId()), true); // var_dump($nbCommitHookUrl); $apiVCS->setProjectWebHook($dbProject, $nbCommitHookUrl); // Push hook to ci server $processor = $container->get('spirit_dev_dbox_admin_bundle.admin.processor'); $jenkinsUrl = $processor->defineJenkinsProjectUrl($dbProject); $apiVCS->setProjectWebHook($dbProject, $jenkinsUrl); } $io->writeln('Updating entity'); $dbProject->setName($pjtname); $dbProject->setActive(true); $em->flush(); $io->success('Done'); } else { $io->error('You may reload the command with the --force-update option'); $io->note('php app/console dbox:portal:pmvcs:import ' . $from . ' ' . $pjtname . ' --force-update'); exit(0); } } else { // Creating entity if ($input->getOption('force') && $io->confirm('Do you want to continue ?', true)) { $project = new Project(); // Import PM Values if ($from == "pm" || $from == "both") { $io->writeln('Importing from PM'); $project->setRedmineProjectId($pmProject['project']['id']); $project->setRedmineProjectIdentifier($pmProject['project']['identifier']); $project->setRedmineWebUrl($apiPM->getProjectWebUrl($project)); $io->writeln('Updating PM remote project'); $project->setName($pjtname); $update = $apiPM->updateProject($project); // dump($update); } // Import VCS Values if ($from == "vcs" || $from == "both") { $io->writeln('Importing from VCS'); $project->setGitLabIssueEnabled($vcsProject['issues_enabled']); $project->setGitLabWikiEnabled($vcsProject['wiki_enabled']); $project->setGitLabSnippetsEnabled($vcsProject['snippets_enabled']); $project->setGitLabProjectId($vcsProject['id']); $project->setGitLabSshUrlToRepo($vcsProject['ssh_url_to_repo']); $project->setGitLabHttpUrlToRepo($vcsProject['http_url_to_repo']); $project->setGitLabWebUrl($vcsProject['web_url']); $project->setGitLabNamespace($vcsProject['path_with_namespace']); $io->writeln('Updating VCS remote project'); // Create hooks $nbCommitHookUrl = $selfBaseUrl != 'none' ? $selfBaseUrl . "web_hook/update/nb_commit/" . $project->getId() : $router->generate('spirit_dev_dbox_portal_bundle_webhook_pjt_update_nbcommits', array('pjt_id' => $project->getId()), true); $apiVCS->setProjectWebHook($project, $nbCommitHookUrl); // Push hook to ci server $processor = $container->get('spirit_dev_dbox_admin_bundle.admin.processor'); $jenkinsUrl = $processor->defineJenkinsProjectUrl($project); $apiVCS->setProjectWebHook($project, $jenkinsUrl); } $io->writeln('Creating entity'); $project->setName($pjtname); $project->setActive(true); $em->persist($project); $em->flush(); $io->success('Done'); } else { $io->error('You may reload the command with the --force option'); $io->note('php app/console dbox:portal:pmvcs:import ' . $from . ' ' . $pjtname . ' --force'); exit(0); } } }
/** * Remove member from project * @param Project $project * @param null $tracker * @return null */ public function getIssues(Project $project, $tracker = null) { // Fast Return in case of server stopped if (!$this->serverAvailable) { return null; } try { return $this->redmineClient->api($this::API_ISSUE)->all(array('project_id' => $project->getRedmineProjectId(), 'tracker_id' => $tracker)); } catch (\Exception $e) { return null; } }
/** * Extract available user to add to project * @param EntityManager $em * @param Project $project * @return array */ private function getAvailableUsers(EntityManager $em, Project $project) { $users = $em->getRepository('SpiritDevDBoxUserBundle:User')->getUsableUsers()->getQuery()->getResult(); $returnedUsers = array(); foreach ($users as $user) { $userIsMember = false; foreach ($project->getTeamMembers() as $member) { if ($user == $member) { $userIsMember = true; } } if (!$userIsMember) { $returnedUsers[] = $user; } } return $returnedUsers; }
/** * @param Project $project * @param $filePath * @param string $ref * @return mixed */ public function getFile(Project $project, $filePath, $ref = 'master') { // Fast Return in case of server stopped if (!$this->isServerAvailable()) { return null; } // Create file $file = $this->gitLabClient->api($this::API_REPOSITORIES)->getFile($project->getGitLabProjectId(), $filePath, $ref); // Return created file return $file; }
/** * Get issues of a defined project per severity * @param Project $project * @param $severity * @return mixed */ public function getIssuesPerSeverity(Project $project, $severity) { // Fast Return in case of server stopped if (!$this->serverAvailable) { return null; } try { return $this->sonarClient->api('issues')->search(array("componentRoots" => $project->getSonarProjectKey(), "severities" => $severity)); } catch (\Exception $e) { return null; } }
/** * Setting demand content * @param Project $project * @return array */ private function setContentData(Project $project) { $owner = $project->getOwner()->getCommonName(); $teamMembersArray = ""; $teamMembers = $project->getTeamMembers(); $tml = count($teamMembers); $tmc = 1; foreach ($teamMembers as $member) { $teamMembersArray .= $member->getCommonName(); if ($tmc < $tml) { $teamMembersArray .= ", "; } $tmc++; } return ["name" => $project->getName(), "description" => $project->getDescription(), "owner" => $owner, "team_members" => $teamMembersArray, "git_issues" => $project->isGitLabIssueEnabled(), "git_wiki" => $project->isGitLabWikiEnabled(), "git_snippets" => $project->isGitLabSnippetsEnabled(), "id" => $project->getId()]; }