2017-10-22 14:31:29 +00:00
|
|
|
<?php declare(strict_types=1);
|
|
|
|
|
|
|
|
namespace Rector\Console\Output;
|
|
|
|
|
2018-09-17 10:38:11 +00:00
|
|
|
use Rector\Application\Error;
|
2019-05-28 14:28:46 +00:00
|
|
|
use Rector\Application\ErrorAndDiffCollector;
|
2019-05-25 16:36:53 +00:00
|
|
|
use Rector\Contract\Console\Output\OutputFormatterInterface;
|
2018-02-08 15:51:16 +00:00
|
|
|
use Rector\Reporting\FileDiff;
|
2019-01-02 13:22:25 +00:00
|
|
|
use Symfony\Component\Console\Style\SymfonyStyle;
|
2017-10-22 14:31:29 +00:00
|
|
|
|
2019-05-25 16:36:53 +00:00
|
|
|
final class ConsoleOutputFormatter implements OutputFormatterInterface
|
2017-10-22 14:31:29 +00:00
|
|
|
{
|
2019-05-25 16:36:53 +00:00
|
|
|
/**
|
|
|
|
* @var string
|
|
|
|
*/
|
|
|
|
public const NAME = 'console';
|
|
|
|
|
2017-10-22 14:31:29 +00:00
|
|
|
/**
|
2018-11-02 17:27:00 +00:00
|
|
|
* @var SymfonyStyle
|
2017-10-22 14:31:29 +00:00
|
|
|
*/
|
2018-11-02 17:27:00 +00:00
|
|
|
private $symfonyStyle;
|
2017-10-22 14:31:29 +00:00
|
|
|
|
2019-05-18 23:02:07 +00:00
|
|
|
public function __construct(SymfonyStyle $symfonyStyle)
|
|
|
|
{
|
2018-11-02 17:27:00 +00:00
|
|
|
$this->symfonyStyle = $symfonyStyle;
|
2017-10-22 14:31:29 +00:00
|
|
|
}
|
|
|
|
|
2019-05-28 14:28:46 +00:00
|
|
|
public function report(ErrorAndDiffCollector $errorAndDiffCollector): void
|
|
|
|
{
|
|
|
|
$this->reportFileDiffs($errorAndDiffCollector->getFileDiffs());
|
|
|
|
$this->reportErrors($errorAndDiffCollector->getErrors());
|
2019-08-06 07:37:31 +00:00
|
|
|
$this->reportRemovedFilesAndNodes($errorAndDiffCollector);
|
2019-05-28 14:47:55 +00:00
|
|
|
|
|
|
|
if ($errorAndDiffCollector->getErrors() !== []) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->symfonyStyle->success(sprintf(
|
|
|
|
'Rector is done! %d changed files',
|
|
|
|
count($errorAndDiffCollector->getFileDiffs()) + $errorAndDiffCollector->getRemovedAndAddedFilesCount()
|
|
|
|
));
|
2019-05-28 14:28:46 +00:00
|
|
|
}
|
|
|
|
|
2019-05-25 16:36:53 +00:00
|
|
|
public function getName(): string
|
|
|
|
{
|
|
|
|
return self::NAME;
|
|
|
|
}
|
|
|
|
|
2018-01-02 06:03:11 +00:00
|
|
|
/**
|
2018-02-08 15:51:16 +00:00
|
|
|
* @param FileDiff[] $fileDiffs
|
2018-01-02 06:03:11 +00:00
|
|
|
*/
|
2019-05-28 14:28:46 +00:00
|
|
|
private function reportFileDiffs(array $fileDiffs): void
|
2018-01-02 06:03:11 +00:00
|
|
|
{
|
2018-02-08 15:51:16 +00:00
|
|
|
if (count($fileDiffs) <= 0) {
|
2018-01-06 23:09:22 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2018-12-07 17:54:24 +00:00
|
|
|
// normalize
|
|
|
|
ksort($fileDiffs);
|
|
|
|
|
2018-11-02 17:27:00 +00:00
|
|
|
$this->symfonyStyle->title(
|
2018-09-21 05:12:24 +00:00
|
|
|
sprintf('%d file%s with changes', count($fileDiffs), count($fileDiffs) === 1 ? '' : 's')
|
|
|
|
);
|
2018-01-02 06:03:11 +00:00
|
|
|
|
2018-01-06 20:10:35 +00:00
|
|
|
$i = 0;
|
2018-02-08 15:51:16 +00:00
|
|
|
foreach ($fileDiffs as $fileDiff) {
|
2019-05-28 20:38:21 +00:00
|
|
|
$relativeFilePath = $fileDiff->getRelativeFilePath();
|
2019-05-28 16:28:20 +00:00
|
|
|
|
|
|
|
$this->symfonyStyle->writeln(sprintf('<options=bold>%d) %s</>', ++$i, $relativeFilePath));
|
2018-11-02 17:27:00 +00:00
|
|
|
$this->symfonyStyle->newLine();
|
2019-05-28 14:18:05 +00:00
|
|
|
$this->symfonyStyle->writeln($fileDiff->getDiffConsoleFormatted());
|
2018-11-02 17:27:00 +00:00
|
|
|
$this->symfonyStyle->newLine();
|
2018-11-05 01:27:48 +00:00
|
|
|
|
2019-02-17 14:12:47 +00:00
|
|
|
if ($fileDiff->getAppliedRectorClasses() !== []) {
|
2018-11-05 01:27:48 +00:00
|
|
|
$this->symfonyStyle->writeln('Applied rectors:');
|
|
|
|
$this->symfonyStyle->newLine();
|
|
|
|
$this->symfonyStyle->listing($fileDiff->getAppliedRectorClasses());
|
|
|
|
$this->symfonyStyle->newLine();
|
|
|
|
}
|
2018-01-02 06:03:11 +00:00
|
|
|
}
|
|
|
|
}
|
2018-09-17 10:38:11 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @param Error[] $errors
|
|
|
|
*/
|
2019-05-28 14:28:46 +00:00
|
|
|
private function reportErrors(array $errors): void
|
2018-09-17 10:38:11 +00:00
|
|
|
{
|
|
|
|
foreach ($errors as $error) {
|
|
|
|
$message = sprintf(
|
2018-11-04 23:36:12 +00:00
|
|
|
'Could not process "%s" file%s, due to: %s"%s".',
|
2018-09-17 10:38:11 +00:00
|
|
|
$error->getFileInfo()->getPathname(),
|
2018-11-04 23:36:12 +00:00
|
|
|
$error->getRectorClass() ? ' by "' . $error->getRectorClass() . '"' : '',
|
2018-09-17 10:38:11 +00:00
|
|
|
PHP_EOL,
|
|
|
|
$error->getMessage()
|
|
|
|
);
|
|
|
|
|
|
|
|
if ($error->getLine()) {
|
|
|
|
$message .= ' On line: ' . $error->getLine();
|
|
|
|
}
|
|
|
|
|
2018-11-02 17:27:00 +00:00
|
|
|
$this->symfonyStyle->error($message);
|
2018-09-17 10:38:11 +00:00
|
|
|
}
|
|
|
|
}
|
2019-08-06 07:37:31 +00:00
|
|
|
|
|
|
|
private function reportRemovedFilesAndNodes(ErrorAndDiffCollector $errorAndDiffCollector): void
|
|
|
|
{
|
|
|
|
if ($errorAndDiffCollector->getRemovedAndAddedFilesCount()) {
|
|
|
|
$this->symfonyStyle->note(
|
|
|
|
sprintf('%d files were added/removed', $errorAndDiffCollector->getRemovedAndAddedFilesCount())
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($errorAndDiffCollector->getRemovedNodeCount()) {
|
|
|
|
$this->symfonyStyle->note(sprintf('%d nodes were removed', $errorAndDiffCollector->getRemovedNodeCount()));
|
|
|
|
}
|
|
|
|
}
|
2017-10-22 14:31:29 +00:00
|
|
|
}
|