public function testThatCanReportAndRetrieveInvalidFileErrors() { $error = new Error(Error::TYPE_LINT, 'foo.php'); $errorsManager = new ErrorsManager(); $errorsManager->report($error); $this->assertFalse($errorsManager->isEmpty()); $errors = $errorsManager->getLintErrors(); $this->assertInternalType('array', $errors); $this->assertCount(1, $errors); $this->assertSame($error, array_shift($errors)); $this->assertCount(0, $errorsManager->getInvalidErrors()); $this->assertCount(0, $errorsManager->getExceptionErrors()); }
public function fixFile(\SplFileInfo $file, array $fixers, $dryRun, $diff, FileCacheManager $fileCacheManager) { $new = $old = file_get_contents($file->getRealpath()); if ('' === $old || !$fileCacheManager->needFixing($this->getFileRelativePathname($file), $old) || PHP_VERSION_ID >= 50306 && PHP_VERSION_ID < 50400 && false !== stripos($old, '__halt_compiler()')) { $this->dispatchEvent(FixerFileProcessedEvent::NAME, FixerFileProcessedEvent::create()->setStatus(FixerFileProcessedEvent::STATUS_SKIPPED)); return; } try { $this->linter->lintFile($file->getRealpath()); } catch (LintingException $e) { $this->dispatchEvent(FixerFileProcessedEvent::NAME, FixerFileProcessedEvent::create()->setStatus(FixerFileProcessedEvent::STATUS_INVALID)); $this->errorsManager->report(new Error(Error::TYPE_INVALID, $this->getFileRelativePathname($file))); return; } $old = file_get_contents($file->getRealpath()); $appliedFixers = array(); // we do not need Tokens to still caching previously fixed file - so clear the cache Tokens::clearCache(); $tokens = Tokens::fromCode($old); $newHash = $oldHash = $tokens->getCodeHash(); try { foreach ($fixers as $fixer) { if (!$fixer->supports($file) || !$fixer->isCandidate($tokens)) { continue; } $fixer->fix($file, $tokens); if ($tokens->isChanged()) { $tokens->clearEmptyTokens(); $tokens->clearChanged(); $appliedFixers[] = $fixer->getName(); } } } catch (\Exception $e) { $this->dispatchEvent(FixerFileProcessedEvent::NAME, FixerFileProcessedEvent::create()->setStatus(FixerFileProcessedEvent::STATUS_EXCEPTION)); $this->errorsManager->report(new Error(Error::TYPE_EXCEPTION, $this->getFileRelativePathname($file))); return; } $fixInfo = null; if (!empty($appliedFixers)) { $new = $tokens->generateCode(); $newHash = $tokens->getCodeHash(); } // We need to check if content was changed and then applied changes. // But we can't simple check $appliedFixers, because one fixer may revert // work of other and both of them will mark collection as changed. // Therefore we need to check if code hashes changed. if ($oldHash !== $newHash) { try { $this->linter->lintSource($new); } catch (LintingException $e) { $this->dispatchEvent(FixerFileProcessedEvent::NAME, FixerFileProcessedEvent::create()->setStatus(FixerFileProcessedEvent::STATUS_LINT)); $this->errorsManager->report(new Error(Error::TYPE_LINT, $this->getFileRelativePathname($file))); return; } if (!$dryRun && false === @file_put_contents($file->getRealpath(), $new)) { $error = error_get_last(); if ($error) { throw new IOException(sprintf('Failed to write file "%s", "%s".', $file->getRealpath(), $error['message']), 0, null, $file->getRealpath()); } throw new IOException(sprintf('Failed to write file "%s".', $file->getRealpath()), 0, null, $file->getRealpath()); } $fixInfo = array('appliedFixers' => $appliedFixers); if ($diff) { $fixInfo['diff'] = $this->stringDiff($old, $new); } } $fileCacheManager->setFile($this->getFileRelativePathname($file), $new); $this->dispatchEvent(FixerFileProcessedEvent::NAME, FixerFileProcessedEvent::create()->setStatus($fixInfo ? FixerFileProcessedEvent::STATUS_FIXED : FixerFileProcessedEvent::STATUS_NO_CHANGES)); return $fixInfo; }
/** * @see Command */ protected function execute(InputInterface $input, OutputInterface $output) { $verbosity = $output->getVerbosity(); $resolver = new ConfigurationResolver(); $resolver->setCwd(getcwd())->setDefaultConfig($this->defaultConfig)->setFixer($this->fixer)->setOptions(array('config' => $input->getOption('config'), 'config-file' => $input->getOption('config-file'), 'dry-run' => $input->getOption('dry-run'), 'level' => $input->getOption('level'), 'fixers' => $input->getOption('fixers'), 'path' => $input->getArgument('path'), 'progress' => OutputInterface::VERBOSITY_VERBOSE <= $verbosity && 'txt' === $input->getOption('format'), 'using-cache' => $input->getOption('using-cache'), 'cache-file' => $input->getOption('cache-file')))->resolve(); $config = $resolver->getConfig(); $configFile = $resolver->getConfigFile(); if ($configFile && 'txt' === $input->getOption('format')) { $output->writeln(sprintf('Loaded config from "%s"', $configFile)); } // register custom fixers from config $this->fixer->registerCustomFixers($config->getCustomFixers()); if ($config->usingLinter()) { try { $this->fixer->setLinter(new Linter($config->getPhpExecutable())); } catch (UnavailableLinterException $e) { if ($configFile && 'txt' === $input->getOption('format')) { $output->writeln('Unable to use linter, can not find PHP executable'); } } } $showProgress = $resolver->getProgress(); if ($showProgress) { $this->fixer->setEventDispatcher($this->eventDispatcher); $progressOutput = new ProcessOutput($this->eventDispatcher); } $this->stopwatch->start('fixFiles'); $changed = $this->fixer->fix($config, $resolver->isDryRun(), $input->getOption('diff')); $this->stopwatch->stop('fixFiles'); if ($showProgress) { $progressOutput->printLegend(); $this->fixer->setEventDispatcher(null); } $i = 1; switch ($input->getOption('format')) { case 'txt': foreach ($changed as $file => $fixResult) { $output->write(sprintf('%4d) %s', $i++, $file)); if (OutputInterface::VERBOSITY_VERBOSE <= $verbosity) { $output->write(sprintf(' (<comment>%s</comment>)', implode(', ', $fixResult['appliedFixers']))); } if ($input->getOption('diff')) { $output->writeln(''); $output->writeln('<comment> ---------- begin diff ----------</comment>'); $output->writeln($fixResult['diff']); $output->writeln('<comment> ---------- end diff ----------</comment>'); } $output->writeln(''); } if (OutputInterface::VERBOSITY_DEBUG <= $verbosity) { $output->writeln('Fixing time per file:'); foreach ($this->stopwatch->getSectionEvents('fixFile') as $file => $event) { if ('__section__' === $file) { continue; } $output->writeln(sprintf('[%.3f s] %s', $event->getDuration() / 1000, $file)); } $output->writeln(''); } $fixEvent = $this->stopwatch->getEvent('fixFiles'); $output->writeln(sprintf('Fixed all files in %.3f seconds, %.3f MB memory used', $fixEvent->getDuration() / 1000, $fixEvent->getMemory() / 1024 / 1024)); break; case 'xml': $dom = new \DOMDocument('1.0', 'UTF-8'); $filesXML = $dom->createElement('files'); $dom->appendChild($filesXML); foreach ($changed as $file => $fixResult) { $fileXML = $dom->createElement('file'); $fileXML->setAttribute('id', $i++); $fileXML->setAttribute('name', $file); $filesXML->appendChild($fileXML); if (OutputInterface::VERBOSITY_VERBOSE <= $verbosity) { $appliedFixersXML = $dom->createElement('applied_fixers'); $fileXML->appendChild($appliedFixersXML); foreach ($fixResult['appliedFixers'] as $appliedFixer) { $appliedFixerXML = $dom->createElement('applied_fixer'); $appliedFixerXML->setAttribute('name', $appliedFixer); $appliedFixersXML->appendChild($appliedFixerXML); } } if ($input->getOption('diff')) { $diffXML = $dom->createElement('diff'); $diffXML->appendChild($dom->createCDATASection($fixResult['diff'])); $fileXML->appendChild($diffXML); } } $fixEvent = $this->stopwatch->getEvent('fixFiles'); $timeXML = $dom->createElement('time'); $memoryXML = $dom->createElement('memory'); $dom->appendChild($timeXML); $dom->appendChild($memoryXML); $memoryXML->setAttribute('value', round($fixEvent->getMemory() / 1024 / 1024, 3)); $memoryXML->setAttribute('unit', 'MB'); $timeXML->setAttribute('unit', 's'); $timeTotalXML = $dom->createElement('total'); $timeTotalXML->setAttribute('value', round($fixEvent->getDuration() / 1000, 3)); $timeXML->appendChild($timeTotalXML); if (OutputInterface::VERBOSITY_DEBUG <= $verbosity) { $timeFilesXML = $dom->createElement('files'); $timeXML->appendChild($timeFilesXML); $eventCounter = 1; foreach ($this->stopwatch->getSectionEvents('fixFile') as $file => $event) { if ('__section__' === $file) { continue; } $timeFileXML = $dom->createElement('file'); $timeFilesXML->appendChild($timeFileXML); $timeFileXML->setAttribute('id', $eventCounter++); $timeFileXML->setAttribute('name', $file); $timeFileXML->setAttribute('value', round($event->getDuration() / 1000, 3)); } } $dom->formatOutput = true; $output->write($dom->saveXML()); break; case 'json': $jFiles = array(); foreach ($changed as $file => $fixResult) { $jfile = array('name' => $file); if (OutputInterface::VERBOSITY_VERBOSE <= $verbosity) { $jfile['appliedFixers'] = $fixResult['appliedFixers']; } if ($input->getOption('diff')) { $jfile['diff'] = $fixResult['diff']; } $jFiles[] = $jfile; } $fixEvent = $this->stopwatch->getEvent('fixFiles'); $json = array('files' => $jFiles, 'memory' => round($fixEvent->getMemory() / 1024 / 1024, 3), 'time' => array('total' => round($fixEvent->getDuration() / 1000, 3))); if (OutputInterface::VERBOSITY_DEBUG <= $verbosity) { $jFileTime = array(); foreach ($this->stopwatch->getSectionEvents('fixFile') as $file => $event) { if ('__section__' === $file) { continue; } $jFileTime[$file] = round($event->getDuration() / 1000, 3); } $json['time']['files'] = $jFileTime; } $output->write(json_encode($json)); break; default: throw new \InvalidArgumentException(sprintf('The format "%s" is not defined.', $input->getOption('format'))); } $invalidErrors = $this->errorsManager->getInvalidErrors(); if (!empty($invalidErrors)) { $this->listErrors($output, 'linting before fixing', $invalidErrors); } $exceptionErrors = $this->errorsManager->getExceptionErrors(); if (!empty($exceptionErrors)) { $this->listErrors($output, 'fixing', $exceptionErrors); } $lintErrors = $this->errorsManager->getLintErrors(); if (!empty($lintErrors)) { $this->listErrors($output, 'linting after fixing', $lintErrors); } return !$resolver->isDryRun() || empty($changed) ? 0 : 3; }
/** * @see Command */ protected function execute(InputInterface $input, OutputInterface $output) { $stdErr = $output instanceof ConsoleOutputInterface ? $output->getErrorOutput() : null; if ($stdErr && extension_loaded('xdebug')) { $stdErr->writeln(sprintf($stdErr->isDecorated() ? '<bg=yellow;fg=black;>%s</>' : '%s', 'You are running php-cs-fixer with xdebug enabled. This has a major impact on runtime performance.')); } $verbosity = $output->getVerbosity(); $resolver = new ConfigurationResolver(); $resolver->setCwd(getcwd())->setDefaultConfig($this->defaultConfig)->setFixer($this->fixer)->setOptions(array('allow-risky' => $input->getOption('allow-risky'), 'config' => $input->getOption('config'), 'config-file' => $input->getOption('config-file'), 'dry-run' => $input->getOption('dry-run'), 'rules' => $input->getOption('rules'), 'path' => $input->getArgument('path'), 'progress' => OutputInterface::VERBOSITY_VERBOSE <= $verbosity && 'txt' === $input->getOption('format'), 'using-cache' => $input->getOption('using-cache'), 'cache-file' => $input->getOption('cache-file'), 'format' => $input->getOption('format')))->resolve(); $config = $resolver->getConfig(); $configFile = $resolver->getConfigFile(); if ($configFile && 'txt' === $input->getOption('format')) { $output->writeln(sprintf('Loaded config from "%s"', $configFile)); } if ($config->usingLinter()) { try { $this->fixer->setLinter(new Linter($config->getPhpExecutable())); } catch (UnavailableLinterException $e) { if ($configFile && 'txt' === $input->getOption('format')) { $output->writeln('Unable to use linter, can not find PHP executable'); } } } $showProgress = $resolver->getProgress(); if ($showProgress) { $this->fixer->setEventDispatcher($this->eventDispatcher); $progressOutput = new ProcessOutput($this->eventDispatcher); } $this->stopwatch->start('fixFiles'); $changed = $this->fixer->fix($config, $resolver->isDryRun(), $input->getOption('diff')); $this->stopwatch->stop('fixFiles'); if ($showProgress) { $progressOutput->printLegend(); $this->fixer->setEventDispatcher(null); } $i = 1; switch ($resolver->getFormat()) { case 'txt': $fixerDetailLine = false; if (OutputInterface::VERBOSITY_VERBOSE <= $verbosity) { $fixerDetailLine = $output->isDecorated() ? ' (<comment>%s</comment>)' : ' %s'; } foreach ($changed as $file => $fixResult) { $output->write(sprintf('%4d) %s', $i++, $file)); if ($fixerDetailLine) { $output->write(sprintf($fixerDetailLine, implode(', ', $fixResult['appliedFixers']))); } if ($input->getOption('diff')) { $output->writeln(''); $output->writeln('<comment> ---------- begin diff ----------</comment>'); $output->writeln($fixResult['diff']); $output->writeln('<comment> ---------- end diff ----------</comment>'); } $output->writeln(''); } if (OutputInterface::VERBOSITY_DEBUG <= $verbosity) { $output->writeln('Fixing time per file:'); foreach ($this->stopwatch->getSectionEvents('fixFile') as $file => $event) { if ('__section__' === $file) { continue; } $output->writeln(sprintf('[%.3f s] %s', $event->getDuration() / 1000, $file)); } $output->writeln(''); } $fixEvent = $this->stopwatch->getEvent('fixFiles'); $output->writeln(sprintf('%s all files in %.3f seconds, %.3f MB memory used', $input->getOption('dry-run') ? 'Checked' : 'Fixed', $fixEvent->getDuration() / 1000, $fixEvent->getMemory() / 1024 / 1024)); break; case 'xml': $dom = new \DOMDocument('1.0', 'UTF-8'); // new nodes should be added to this or existing children $root = $dom->createElement('report'); $dom->appendChild($root); $filesXML = $dom->createElement('files'); $root->appendChild($filesXML); foreach ($changed as $file => $fixResult) { $fileXML = $dom->createElement('file'); $fileXML->setAttribute('id', $i++); $fileXML->setAttribute('name', $file); $filesXML->appendChild($fileXML); if (OutputInterface::VERBOSITY_VERBOSE <= $verbosity) { $appliedFixersXML = $dom->createElement('applied_fixers'); $fileXML->appendChild($appliedFixersXML); foreach ($fixResult['appliedFixers'] as $appliedFixer) { $appliedFixerXML = $dom->createElement('applied_fixer'); $appliedFixerXML->setAttribute('name', $appliedFixer); $appliedFixersXML->appendChild($appliedFixerXML); } } if ($input->getOption('diff')) { $diffXML = $dom->createElement('diff'); $diffXML->appendChild($dom->createCDATASection($fixResult['diff'])); $fileXML->appendChild($diffXML); } } $fixEvent = $this->stopwatch->getEvent('fixFiles'); $timeXML = $dom->createElement('time'); $memoryXML = $dom->createElement('memory'); $root->appendChild($timeXML); $root->appendChild($memoryXML); $memoryXML->setAttribute('value', round($fixEvent->getMemory() / 1024 / 1024, 3)); $memoryXML->setAttribute('unit', 'MB'); $timeXML->setAttribute('unit', 's'); $timeTotalXML = $dom->createElement('total'); $timeTotalXML->setAttribute('value', round($fixEvent->getDuration() / 1000, 3)); $timeXML->appendChild($timeTotalXML); if (OutputInterface::VERBOSITY_DEBUG <= $verbosity) { $timeFilesXML = $dom->createElement('files'); $timeXML->appendChild($timeFilesXML); $eventCounter = 1; foreach ($this->stopwatch->getSectionEvents('fixFile') as $file => $event) { if ('__section__' === $file) { continue; } $timeFileXML = $dom->createElement('file'); $timeFilesXML->appendChild($timeFileXML); $timeFileXML->setAttribute('id', $eventCounter++); $timeFileXML->setAttribute('name', $file); $timeFileXML->setAttribute('value', round($event->getDuration() / 1000, 3)); } } $dom->formatOutput = true; $output->write($dom->saveXML()); break; case 'json': $jFiles = array(); foreach ($changed as $file => $fixResult) { $jfile = array('name' => $file); if (OutputInterface::VERBOSITY_VERBOSE <= $verbosity) { $jfile['appliedFixers'] = $fixResult['appliedFixers']; } if ($input->getOption('diff')) { $jfile['diff'] = $fixResult['diff']; } $jFiles[] = $jfile; } $fixEvent = $this->stopwatch->getEvent('fixFiles'); $json = array('files' => $jFiles, 'memory' => round($fixEvent->getMemory() / 1024 / 1024, 3), 'time' => array('total' => round($fixEvent->getDuration() / 1000, 3))); if (OutputInterface::VERBOSITY_DEBUG <= $verbosity) { $jFileTime = array(); foreach ($this->stopwatch->getSectionEvents('fixFile') as $file => $event) { if ('__section__' === $file) { continue; } $jFileTime[$file] = round($event->getDuration() / 1000, 3); } $json['time']['files'] = $jFileTime; } $output->write(json_encode($json)); break; } $invalidErrors = $this->errorsManager->getInvalidErrors(); if (!empty($invalidErrors)) { $this->listErrors($output, 'linting before fixing', $invalidErrors); } $exceptionErrors = $this->errorsManager->getExceptionErrors(); if (!empty($exceptionErrors)) { $this->listErrors($output, 'fixing', $exceptionErrors); } $lintErrors = $this->errorsManager->getLintErrors(); if (!empty($lintErrors)) { $this->listErrors($output, 'linting after fixing', $lintErrors); } $exitStatus = 0; if ($resolver->isDryRun()) { if (!empty($invalidErrors)) { $exitStatus |= self::EXIT_STATUS_FLAG_HAS_INVALID_FILES; } if (!empty($changed)) { $exitStatus |= self::EXIT_STATUS_FLAG_HAS_CHANGED_FILES; } } return $exitStatus; }
public function testExitCodeActualRunWithChangedAndInvalidFiles() { $errorsManager = new ErrorsManager(); $errorsManager->report(new Error(Error::TYPE_INVALID, 'Invalid.php')); $fixer = $this->getFixerMock(array('Changed.php'), $errorsManager); $command = new FixCommand($fixer); $input = $this->getInputMock(array('dry-run' => false)); $exitCode = $command->run($input, new NullOutput()); $this->assertSame(0, $exitCode); }
/** * @see Command */ protected function execute(InputInterface $input, OutputInterface $output) { $verbosity = $output->getVerbosity(); $resolver = new ConfigurationResolver(); $resolver->setCwd(getcwd())->setDefaultConfig($this->defaultConfig)->setFixer($this->fixer)->setOptions(array('allow-risky' => $input->getOption('allow-risky'), 'config' => $input->getOption('config'), 'config-file' => $input->getOption('config-file'), 'dry-run' => $input->getOption('dry-run'), 'rules' => $input->getOption('rules'), 'path' => $input->getArgument('path'), 'progress' => OutputInterface::VERBOSITY_VERBOSE <= $verbosity && 'txt' === $input->getOption('format'), 'using-cache' => $input->getOption('using-cache'), 'cache-file' => $input->getOption('cache-file')))->resolve(); $config = $resolver->getConfig(); $configFile = $resolver->getConfigFile(); if ($configFile && 'txt' === $input->getOption('format')) { $output->writeln(sprintf('Loaded config from "%s"', $configFile)); } if ($config->usingLinter()) { try { $this->fixer->setLinter(new Linter($config->getPhpExecutable())); } catch (UnavailableLinterException $e) { if ($configFile && 'txt' === $input->getOption('format')) { $output->writeln('Unable to use linter, can not find PHP executable'); } } } $showProgress = $resolver->getProgress(); if ($showProgress) { $this->fixer->setEventDispatcher($this->eventDispatcher); $progressOutput = new ProcessOutput($this->eventDispatcher); } $this->stopwatch->start('fixFiles'); $changed = $this->fixer->fix($config, $resolver->isDryRun(), $input->getOption('diff')); $this->stopwatch->stop('fixFiles'); if ($showProgress) { $progressOutput->printLegend(); $this->fixer->setEventDispatcher(null); } $translator = new Translator('en'); $translator->addResource('yml', __DIR__ . '/../../Resources/translations/messages.en.yml', 'en'); $translator->addLoader('yml', new YamlFileLoader()); switch ($input->getOption('format')) { case 'txt': $helper = new FixResultTxtOutputHelper($output, $translator, $verbosity, $input->getOption('diff')); $helper->write($changed, $this->stopwatch); break; case 'xml': $i = 1; $dom = new \DOMDocument('1.0', 'UTF-8'); // new nodes should be added to this or existing children $root = $dom->createElement('report'); $dom->appendChild($root); $filesXML = $dom->createElement('files'); $root->appendChild($filesXML); foreach ($changed as $file => $fixResult) { $fileXML = $dom->createElement('file'); $fileXML->setAttribute('id', $i++); $fileXML->setAttribute('name', $file); $filesXML->appendChild($fileXML); if (OutputInterface::VERBOSITY_VERBOSE <= $verbosity) { $appliedFixersXML = $dom->createElement('applied_fixers'); $fileXML->appendChild($appliedFixersXML); foreach ($fixResult['appliedFixers'] as $appliedFixer) { $appliedFixerXML = $dom->createElement('applied_fixer'); $appliedFixerXML->setAttribute('name', $appliedFixer); $appliedFixersXML->appendChild($appliedFixerXML); } } if ($input->getOption('diff')) { $diffXML = $dom->createElement('diff'); $diffXML->appendChild($dom->createCDATASection($fixResult['diff'])); $fileXML->appendChild($diffXML); } } $fixEvent = $this->stopwatch->getEvent('fixFiles'); $timeXML = $dom->createElement('time'); $memoryXML = $dom->createElement('memory'); $root->appendChild($timeXML); $root->appendChild($memoryXML); $memoryXML->setAttribute('value', round($fixEvent->getMemory() / 1024 / 1024, 3)); $memoryXML->setAttribute('unit', 'MB'); $timeXML->setAttribute('unit', 's'); $timeTotalXML = $dom->createElement('total'); $timeTotalXML->setAttribute('value', round($fixEvent->getDuration() / 1000, 3)); $timeXML->appendChild($timeTotalXML); if (OutputInterface::VERBOSITY_DEBUG <= $verbosity) { $timeFilesXML = $dom->createElement('files'); $timeXML->appendChild($timeFilesXML); $eventCounter = 1; foreach ($this->stopwatch->getSectionEvents('fixFile') as $file => $event) { if ('__section__' === $file) { continue; } $timeFileXML = $dom->createElement('file'); $timeFilesXML->appendChild($timeFileXML); $timeFileXML->setAttribute('id', $eventCounter++); $timeFileXML->setAttribute('name', $file); $timeFileXML->setAttribute('value', round($event->getDuration() / 1000, 3)); } } $dom->formatOutput = true; $output->write($dom->saveXML()); break; case 'json': $jFiles = array(); foreach ($changed as $file => $fixResult) { $jfile = array('name' => $file); if (OutputInterface::VERBOSITY_VERBOSE <= $verbosity) { $jfile['appliedFixers'] = $fixResult['appliedFixers']; } if ($input->getOption('diff')) { $jfile['diff'] = $fixResult['diff']; } $jFiles[] = $jfile; } $fixEvent = $this->stopwatch->getEvent('fixFiles'); $json = array('files' => $jFiles, 'memory' => round($fixEvent->getMemory() / 1024 / 1024, 3), 'time' => array('total' => round($fixEvent->getDuration() / 1000, 3))); if (OutputInterface::VERBOSITY_DEBUG <= $verbosity) { $jFileTime = array(); foreach ($this->stopwatch->getSectionEvents('fixFile') as $file => $event) { if ('__section__' === $file) { continue; } $jFileTime[$file] = round($event->getDuration() / 1000, 3); } $json['time']['files'] = $jFileTime; } $output->write(json_encode($json)); break; default: throw new \InvalidArgumentException(sprintf('The format "%s" is not defined.', $input->getOption('format'))); } $invalidErrors = $this->errorsManager->getInvalidErrors(); if (!empty($invalidErrors)) { $this->listErrors($output, 'linting before fixing', $invalidErrors); } $exceptionErrors = $this->errorsManager->getExceptionErrors(); if (!empty($exceptionErrors)) { $this->listErrors($output, 'fixing', $exceptionErrors); } $lintErrors = $this->errorsManager->getLintErrors(); if (!empty($lintErrors)) { $this->listErrors($output, 'linting after fixing', $lintErrors); } $exitStatus = 0; if (!empty($invalidErrors)) { $exitStatus |= self::EXIT_STATUS_FLAG_HAS_INVALID_FILES; } if (!empty($changed)) { $exitStatus |= self::EXIT_STATUS_FLAG_HAS_CHANGED_FILES; } return $exitStatus; }