Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
131 changes: 4 additions & 127 deletions src/Console/Command/SetupCICommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,10 @@

namespace Rector\Console\Command;

use Nette\Utils\FileSystem;
use OndraM\CiDetector\CiDetector;
use Rector\Git\RepositoryHelper;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
use function sprintf;

final class SetupCICommand extends Command
{
Expand All @@ -24,134 +20,15 @@ public function __construct(
protected function configure(): void
{
$this->setName('setup-ci');
$this->setDescription('Add CI workflow to let Rector work for you');
$this->setDescription('[DEPRECATED] Add CI workflow to let Rector work for you');
}

protected function execute(InputInterface $input, OutputInterface $output): int
{
// detect current CI
$ci = $this->resolveCurrentCI();

if ($ci === CiDetector::CI_GITLAB) {
return $this->handleGitlabCi();
}

if ($ci === CiDetector::CI_GITHUB_ACTIONS) {
return $this->handleGithubActions();
}

$noteMessage = sprintf(
'Only GitHub and GitLab are currently supported.%s Contribute your CI template to Rector to make this work: %s',
"\n",
'https://github.com/rectorphp/rector-src/'
);

$this->symfonyStyle->note($noteMessage);
return self::SUCCESS;
}

/**
* @return CiDetector::CI_*|null
*/
private function resolveCurrentCI(): ?string
{
if (file_exists(getcwd() . '/.github')) {
return CiDetector::CI_GITHUB_ACTIONS;
}

if (file_exists(getcwd() . '/.gitlab-ci.yml')) {
return CiDetector::CI_GITLAB;
}

return null;
}

private function addGithubActionsWorkflow(string $currentRepository, string $targetWorkflowFilePath): void
{
$workflowTemplate = FileSystem::read(__DIR__ . '/../../../templates/rector-github-action-check.yaml');
$workflowContents = strtr($workflowTemplate, [
'__CURRENT_REPOSITORY__' => $currentRepository,
]);

FileSystem::write($targetWorkflowFilePath, $workflowContents, null);

$this->symfonyStyle->newLine();
$this->symfonyStyle->success('The ".github/workflows/rector.yaml" file was added');

$this->symfonyStyle->writeln('<comment>2 more steps to run Rector in CI:</comment>');

$this->symfonyStyle->newLine();
$this->symfonyStyle->writeln(
'1) Generate token with "repo" scope:' . \PHP_EOL . 'https://github.com/settings/tokens/new'
);

$this->symfonyStyle->newLine();

$repositoryNewSecretsLink = sprintf('https://github.com/%s/settings/secrets/actions/new', $currentRepository);
$this->symfonyStyle->writeln(
'2) Add the token to Action secrets as "ACCESS_TOKEN":' . \PHP_EOL . $repositoryNewSecretsLink
$this->symfonyStyle->error(
'The "setup-ci" command is deprecated and no longer generates files. Its generic template lacked caching and did not fit most setups. Add a CI workflow explicitly for your use case instead - an AI agent can tailor one to your repository.'
);
}

private function addGitlabFile(string $targetGitlabFilePath): void
{
$gitlabTemplate = FileSystem::read(__DIR__ . '/../../../templates/rector-gitlab-check.yaml');
FileSystem::write($targetGitlabFilePath, $gitlabTemplate, null);

$this->symfonyStyle->newLine();
$this->symfonyStyle->success('The "gitlab/rector.yaml" file was added');

$this->symfonyStyle->newLine();
$this->symfonyStyle->writeln(
'1) Register it in your ".gitlab-ci.yml" file:' . \PHP_EOL . 'include:' . \PHP_EOL . ' - local: gitlab/rector.yaml'
);
}

/**
* @return self::SUCCESS
*/
private function handleGitlabCi(): int
{
// add snippet in the end of file or include it?
$ciRectorFilePath = getcwd() . '/gitlab/rector.yaml';

if (file_exists($ciRectorFilePath)) {
$response = $this->symfonyStyle->ask(
'The "gitlab/rector.yaml" workflow already exists. Overwrite it?',
'Yes'
);
if (! in_array($response, ['y', 'yes', 'Yes'], true)) {
$this->symfonyStyle->note('Nothing changed');
return self::SUCCESS;
}
}

$this->addGitlabFile($ciRectorFilePath);
return self::SUCCESS;
}

/**
* @return self::SUCCESS|self::FAILURE
*/
private function handleGithubActions(): int
{
$rectorWorkflowFilePath = getcwd() . '/.github/workflows/rector.yaml';
if (file_exists($rectorWorkflowFilePath)) {
$response = $this->symfonyStyle->ask('The "rector.yaml" workflow already exists. Overwrite it?', 'Yes');
if (! in_array($response, ['y', 'yes', 'Yes'], true)) {
$this->symfonyStyle->note('Nothing changed');
return self::SUCCESS;
}
}

$currentRepository = RepositoryHelper::resolveGithubRepositoryName(getcwd());
if ($currentRepository === null) {
$this->symfonyStyle->error('Current repository name could not be resolved');

return self::FAILURE;
}

$this->addGithubActionsWorkflow($currentRepository, $rectorWorkflowFilePath);
return self::SUCCESS;
return Command::FAILURE;
}
}
28 changes: 0 additions & 28 deletions src/Git/RepositoryHelper.php

This file was deleted.

36 changes: 0 additions & 36 deletions templates/rector-github-action-check.yaml

This file was deleted.

27 changes: 0 additions & 27 deletions templates/rector-gitlab-check.yaml

This file was deleted.

Loading