private function fixProvider(OutputInterface $output, Project $project) { if (strlen($project->getProviderName()) > 0) { $output->writeln('project <info>' . $project->getFullName() . '</info> already migrated'); return false; } $output->writeln('migrating project <info>' . $project->getFullName() . '</info>'); $project->setFullName($project->getGithubFullName()); $project->setProviderName('github'); $project->setProviderData(['clone_url' => $project->getCloneUrl(), 'ssh_url' => $project->getSshUrl(), 'keys_url' => $project->getKeysUrl(), 'hooks_url' => $project->getHooksUrl(), 'contents_url' => $project->getContentsUrl(), 'id' => $project->getGithubId(), 'full_name' => $project->getGithubFullName(), 'owner_login' => $project->getGithubOwnerLogin(), 'hook_id' => $project->getGithubHookId(), 'deploy_key_id' => $project->getGithubDeployKeyId(), 'private' => $project->getGithubPrivate(), 'url' => $project->getGithubUrl()]); return true; }
/** * @todo use github api instead of relying on request parameters * * @param Project $project */ protected function doInspect(Project $project) { try { $request = $this->client->get('/repos/' . $project->getFullName()); $response = $request->send(); } catch (\Guzzle\Http\Exception\ClientErrorResponseException $e) { $this->logger->error($e->getMessage()); return false; } $infos = $response->json(); # @todo @slug $project->setSlug(preg_replace('/[^a-z0-9\\-]/', '-', strtolower($infos['full_name']))); $providerData = ['id' => $infos['id'], 'owner_login' => $infos['owner']['login'], 'full_name' => $infos['full_name'], 'url' => $infos['url'], 'clone_url' => $infos['clone_url'], 'ssh_url' => $infos['ssh_url'], 'keys_url' => $infos['keys_url'], 'hooks_url' => $infos['hooks_url'], 'contents_url' => $infos['contents_url'], 'private' => $infos['private']]; $project->setProviderName($this->provider->getName()); $project->setProviderData($providerData); $project->setFullName($infos['full_name']); $project->setName($infos['name']); $project->setDockerBaseImage('symfony2:latest'); $project->setIsPrivate($infos['private']); $project->setGitUrl($infos['private'] ? $infos['ssh_url'] : $infos['clone_url']); if (isset($infos['organization'])) { $this->logger->info('attaching project\'s organization', ['organization' => $infos['organization']['login']]); $rp = $this->doctrine->getRepository('Model:Organization'); $org = $rp->findOneBy(['name' => $infos['organization']['login'], 'providerName' => $this->provider->getName()]); if (null === $org) { $this->logger->info('organization not found, creating', ['organization' => $infos['organization']['login']]); $orgKeys = $this->sshKeysGenerator->generate(); $org = new Organization(); $org->setName($infos['organization']['login']); $org->setPublicKey($orgKeys['public']); $org->setPrivateKey($orgKeys['private']); $org->setProviderName($this->provider->getName()); } $project->setOrganization($org); } else { $this->logger->info('project has no organization, skipping'); } }
/** * {@inheritDoc} */ public function import(array $providerData, Closure $callback = null) { if (null === $this->provider) { throw new RuntimeException('No provider set'); } if (null === $this->user) { throw new RuntimeException('No user set'); } $logger = $this->logger; $logger->info('importing project', ['full_name' => $providerData['full_name']]); $project = new Project(); $project->setFullName($providerData['full_name']); $project->addUser($this->getUser()); $project->setProviderData($providerData); if (null === $callback) { $callback = function () { }; } $announce = function ($step) use($callback, $logger) { $logger->debug('running import step', $step); $callback($step); }; foreach ($this->getSteps() as $step) { $announce($step); if (!method_exists($this, $step['callback'])) { $logger->error('could not run step: method does not exist', $step); throw new RuntimeException(sprintf('Step method does not exist (step id: %s, method: %s', $step['id'], $step['callback'])); } $ret = call_user_func([$this, $step['callback']], $project); if ($ret === false && $step['abort_on_error']) { $logger->error('aborting import on step error', $step); return false; } } # set default build policy $settings = new ProjectSettings(); $settings->setProject($project); $settings->setPolicy(ProjectSettings::POLICY_ALL); $em = $this->doctrine->getManager(); $em->persist($project); $em->flush(); $em->persist($settings); $em->flush(); return $project; }
/** * @param Project */ protected function doInspect(Project $project) { try { $response = $this->client->get('2.0/repositories/' . $project->getProviderData('full_slug'))->send(); } catch (\Guzzle\Http\Exception\ClientErrorResponseException $e) { $this->logger->error($e->getMessage()); return false; } $infos = $response->json(); # @todo @slug $project->setSlug(preg_replace('/[^a-z0-9\\-]/', '-', strtolower($infos['full_name']))); $providerData = ['id' => $infos['full_name'], 'owner_login' => $infos['owner']['username'], 'full_name' => sprintf('%s/%s', $infos['owner']['username'], $infos['name']), 'full_slug' => $infos['full_name'], 'private' => $infos['is_private'], 'url' => $infos['links']['self']['href']]; foreach ($infos['links']['clone'] as $link) { switch ($link['name']) { case 'https': $providerData['clone_url'] = $link['href']; break; case 'ssh': $providerData['ssh_url'] = $link['href']; break; } } $project->setProviderName($this->provider->getName()); $project->setProviderData($providerData); $project->setFullName($providerData['full_name']); $project->setName($infos['name']); $project->setIsPrivate($providerData['private']); $project->setGitUrl($providerData['private'] ? $providerData['ssh_url'] : $providerData['clone_url']); $project->setDockerBaseImage('stage1/symfony2'); if (strpos($infos['owner']['links']['self']['href'], '.0/teams')) { $orgName = $infos['owner']['username']; $this->logger->info('attaching project\'s organization', ['organization' => $orgName]); $rp = $this->doctrine->getRepository('Model:Organization'); $org = $rp->findOneBy(['name' => $orgName, 'providerName' => $this->provider->getName()]); if (null === $org) { $this->logger->info('organization not found, creating', ['organization' => $orgName]); $orgKeys = $this->sshKeysGenerator->generate(); $org = new Organization(); $org->setName($orgName); $org->setPublicKey($orgKeys['public']); $org->setPrivateKey($orgKeys['private']); $org->setProviderName($this->provider->getName()); } $project->setOrganization($org); } else { $this->logger->info('project has no organization, skipping'); } }