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) { $path = $input->getArgument('path'); $stdin = false; if ('-' === $path) { $stdin = true; // Can't write to STDIN $input->setOption('dry-run', true); } if (null !== $path) { $filesystem = new Filesystem(); if (!$filesystem->isAbsolutePath($path)) { $path = getcwd() . DIRECTORY_SEPARATOR . $path; } } $configFile = $input->getOption('config-file'); if (null === $configFile) { if (is_file($path) && ($dirName = pathinfo($path, PATHINFO_DIRNAME))) { $configDir = $dirName; } elseif ($stdin || null === $path) { $configDir = getcwd(); // path is directory } else { $configDir = $path; } $configFile = $configDir . DIRECTORY_SEPARATOR . '.php_cs'; } if ($input->getOption('config')) { $config = null; foreach ($this->fixer->getConfigs() as $c) { if ($c->getName() === $input->getOption('config')) { $config = $c; break; } } if (null === $config) { throw new \InvalidArgumentException(sprintf('The configuration "%s" is not defined', $input->getOption('config'))); } } elseif (file_exists($configFile)) { $config = (include $configFile); // verify that the config has an instance of Config if (!$config instanceof Config) { throw new \UnexpectedValueException(sprintf('The config file "%s" does not return an instance of Symfony\\CS\\Config\\Config', $configFile)); } if ('txt' === $input->getOption('format')) { $output->writeln(sprintf('Loaded config from "%s"', $configFile)); } } else { $config = $this->defaultConfig; } if ($config->usingLinter()) { $this->fixer->setLintManager(new LintManager()); } if (is_file($path)) { $config->finder(new \ArrayIterator(array(new \SplFileInfo($path)))); } elseif ($stdin) { $config->finder(new \ArrayIterator(array(new StdinFileInfo()))); } elseif (null !== $path) { $config->setDir($path); } // register custom fixers from config $this->fixer->registerCustomFixers($config->getCustomFixers()); $resolver = new ConfigurationResolver(); $resolver->setAllFixers($this->fixer->getFixers())->setConfig($config)->setOptions(array('level' => $input->getOption('level'), 'fixers' => $input->getOption('fixers'), 'progress' => $output->isVerbose() && 'txt' === $input->getOption('format')))->resolve(); $config->fixers($resolver->getFixers()); $showProgress = $resolver->getProgress(); if ($showProgress) { $fileProcessedEventListener = function (FixerFileProcessedEvent $event) use($output) { $output->write($event->getStatusAsString()); }; $this->fixer->setEventDispatcher($this->eventDispatcher); $this->eventDispatcher->addListener(FixerFileProcessedEvent::NAME, $fileProcessedEventListener); } $this->stopwatch->start('fixFiles'); $changed = $this->fixer->fix($config, $input->getOption('dry-run'), $input->getOption('diff')); $this->stopwatch->stop('fixFiles'); if ($showProgress) { $this->fixer->setEventDispatcher(null); $this->eventDispatcher->removeListener(FixerFileProcessedEvent::NAME, $fileProcessedEventListener); $output->writeln(''); $legend = array(); foreach (FixerFileProcessedEvent::getStatusMap() as $status) { if ($status['symbol'] && $status['description']) { $legend[] = $status['symbol'] . '-' . $status['description']; } } $output->writeln('Legend: ' . implode(', ', array_unique($legend))); } $verbosity = $output->getVerbosity(); $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'))); } if (!$this->errorsManager->isEmpty()) { $output->writeLn(''); $output->writeLn('Files that were not fixed due to internal error:'); foreach ($this->errorsManager->getErrors() as $i => $error) { $output->writeLn(sprintf('%4d) %s', $i + 1, $error['filepath'])); } } return empty($changed) ? 0 : 1; }
/** * Execute the command line : * php app/console swagger:generate --file=Resources/example/swagger.json. * * * @param InputInterface $input * @param OutputInterface $output * * @return int|null|void */ protected function execute(InputInterface $input, OutputInterface $output) { $style = new OutputFormatterStyle('red', 'yellow', array('bold', 'blink')); $output->getFormatter()->setStyle('fire', $style); $verbosity = $output->getVerbosity(); $manager = $this->getCreatorsManager(); $conf = $manager->getConfig(); if (isset($conf['definitions'])) { $output->writeln('Start creating definitions...'); $manager->createDefinitions($conf['definitions'], $output); $output->writeln('Finish creating definitions.'); } else { $output->writeln(''); $output->writeln('WARNING: definitions not found'); } if (isset($conf['paths'])) { $output->writeln('Start creating controllers...'); $buildRoutingAnnotations = 'annotation' === $manager->getRoutingType(); $manager->createControllers($conf['paths'], $buildRoutingAnnotations, $output); $output->writeln('Finish creating controllers.'); if ('yaml' == $manager->getRoutingType()) { $output->writeln('Start creating routing yaml file...'); $manager->createRoutingYamlFile($conf['paths'], $output); $output->writeln('Finish creating routing yaml file.'); } } else { $output->writeln(''); $output->writeln('WARNING: paths not found'); } //security: $security = isset($conf['security']) ? $conf['security'] : null; $paths = isset($conf['paths']) ? $conf['paths'] : array(); $manager->createSecurityYamlFile($conf['basePath'], $security, $paths, $output); $output->writeln('Finish creating security yaml file.'); if (!$input->getOption('no-csfixer')) { $watcher = new Stopwatch(); $eventDispatcher = new EventDispatcher(); $dirs = array($manager->getOutputPath() . 'Controller/Api/', $manager->getOutputPath() . 'Api/Model'); $fixer = new fixer(); $fixer->setStopwatch(new Stopwatch()); $fixer->registerBuiltInFixers(); $fixer->registerBuiltInConfigs(); $config = new config(); $config->fixers($fixer->getFixers()); foreach ($dirs as $dir) { if (file_exists($dir) && is_dir($dir)) { $config->getFinder()->setDir($dir); } } $fileProcessedEventListener = function (FixerFileProcessedEvent $event) use($output) { $output->write($event->getStatusAsString()); }; $fixer->setEventDispatcher($eventDispatcher); $eventDispatcher->addListener(FixerFileProcessedEvent::NAME, $fileProcessedEventListener); $watcher->start('fixFiles'); $changed = $fixer->fix($config); $watcher->stop('fixFiles'); $fixer->setEventDispatcher(null); $eventDispatcher->removeListener(FixerFileProcessedEvent::NAME, $fileProcessedEventListener); $output->writeln(''); $legend = array(); foreach (FixerFileProcessedEvent::getStatusMap() as $status) { if ($status['symbol'] && $status['description']) { $legend[] = $status['symbol'] . '-' . $status['description']; } } $output->writeln('Legend: ' . implode(', ', array_unique($legend))); if (OutputInterface::VERBOSITY_VERBOSE <= $verbosity) { $i = 1; foreach ($changed as $file => $fixResult) { $output->writeln(sprintf('%4d) %s', $i++, $file)); } $output->writeln(''); $fixEvent = $watcher->getEvent('fixFiles'); $output->writeln(sprintf('Fixed all files in %.3f seconds, %.3f MB memory used', $fixEvent->getDuration() / 1000, $fixEvent->getMemory() / 1024 / 1024)); } } }
public function fixFile(\SplFileInfo $file, array $fixers, $dryRun, $diff, FileCacheManager $fileCacheManager) { $new = $old = file_get_contents($file->getRealpath()); if (!$fileCacheManager->needFixing($this->getFileRelativePathname($file), $old)) { if ($this->eventDispatcher) { $this->eventDispatcher->dispatch(FixerFileProcessedEvent::NAME, FixerFileProcessedEvent::create()->setStatus(FixerFileProcessedEvent::STATUS_SKIPPED)); } return; } if ($this->lintManager && !$this->lintManager->createProcessForFile($file->getRealpath())->isSuccessful()) { if ($this->eventDispatcher) { $this->eventDispatcher->dispatch(FixerFileProcessedEvent::NAME, FixerFileProcessedEvent::create()->setStatus(FixerFileProcessedEvent::STATUS_INVALID)); } return; } $appliedFixers = array(); // we do not need Tokens to still caching previously fixed file - so clear the cache Tokens::clearCache(); try { foreach ($fixers as $fixer) { if (!$fixer->supports($file)) { continue; } $newest = $fixer->fix($file, $new); if ($newest !== $new) { $appliedFixers[] = $fixer->getName(); } $new = $newest; } } catch (\Exception $e) { if ($this->eventDispatcher) { $this->eventDispatcher->dispatch(FixerFileProcessedEvent::NAME, FixerFileProcessedEvent::create()->setStatus(FixerFileProcessedEvent::STATUS_EXCEPTION)); } if ($this->errorsManager) { $this->errorsManager->report(ErrorsManager::ERROR_TYPE_EXCEPTION, $this->getFileRelativePathname($file), $e->__toString()); } return; } $fixInfo = null; if ($new !== $old) { if ($this->lintManager) { $lintProcess = $this->lintManager->createProcessForSource($new); if (!$lintProcess->isSuccessful()) { if ($this->eventDispatcher) { $this->eventDispatcher->dispatch(FixerFileProcessedEvent::NAME, FixerFileProcessedEvent::create()->setStatus(FixerFileProcessedEvent::STATUS_LINT)); } if ($this->errorsManager) { $this->errorsManager->report(ErrorsManager::ERROR_TYPE_LINT, $this->getFileRelativePathname($file), $lintProcess->getOutput()); } return; } } if (!$dryRun) { file_put_contents($file->getRealpath(), $new); } $fixInfo = array('appliedFixers' => $appliedFixers); if ($diff) { $fixInfo['diff'] = $this->stringDiff($old, $new); } } $fileCacheManager->setFile($this->getFileRelativePathname($file), $new); if ($this->eventDispatcher) { $this->eventDispatcher->dispatch(FixerFileProcessedEvent::NAME, FixerFileProcessedEvent::create()->setStatus($fixInfo ? FixerFileProcessedEvent::STATUS_FIXED : FixerFileProcessedEvent::STATUS_NO_CHANGES)); } return $fixInfo; }
public function onFixerFileProcessed(FixerFileProcessedEvent $event) { $status = self::$eventStatusMap[$event->getStatus()]; $this->output->write($this->output->isDecorated() ? sprintf($status['format'], $status['symbol']) : $status['symbol']); }
public function fixFile(\SplFileInfo $file, array $fixers, $dryRun, $diff, FileCacheManager $fileCacheManager) { $new = $old = file_get_contents($file->getRealpath()); if (!$fileCacheManager->needFixing($this->getFileRelativePathname($file), $old)) { if ($this->eventDispatcher) { $this->eventDispatcher->dispatch(FixerFileProcessedEvent::NAME, FixerFileProcessedEvent::create()->setStatus(FixerFileProcessedEvent::STATUS_SKIPPED)); } return; } $appliedFixers = array(); // we do not need Tokens to still caching previously fixed file - so clear the cache Tokens::clearCache(); foreach ($fixers as $fixer) { if (!$fixer->supports($file)) { continue; } $newest = $fixer->fix($file, $new); if ($newest !== $new) { $appliedFixers[] = $fixer->getName(); } $new = $newest; } $fixInfo = null; if ($new !== $old) { if (!$dryRun) { file_put_contents($file->getRealpath(), $new); } $fixInfo = array('appliedFixers' => $appliedFixers); if ($diff) { $fixInfo['diff'] = $this->stringDiff($old, $new); } } $fileCacheManager->setFile($this->getFileRelativePathname($file), $new); if ($this->eventDispatcher) { $this->eventDispatcher->dispatch(FixerFileProcessedEvent::NAME, FixerFileProcessedEvent::create()->setStatus($fixInfo ? FixerFileProcessedEvent::STATUS_FIXED : FixerFileProcessedEvent::STATUS_NO_CHANGES)); } return $fixInfo; }
/** * @see Command */ protected function execute(InputInterface $input, OutputInterface $output) { // setup output $stdErr = $output instanceof ConsoleOutputInterface ? $output->getErrorOutput() : ('txt' === $input->getOption('format') ? $output : null); if (null !== $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(); // setup input $path = $input->getArgument('path'); $stdin = false; if ('-' === $path) { $stdin = true; // Can't write to STDIN $input->setOption('dry-run', true); } if (null !== $path) { $filesystem = new Filesystem(); if (!$filesystem->isAbsolutePath($path)) { $path = getcwd() . DIRECTORY_SEPARATOR . $path; } } // setup configuration location $configFile = $input->getOption('config-file'); if (null === $configFile) { $configDir = $path; if (is_file($path) && ($dirName = pathinfo($path, PATHINFO_DIRNAME))) { $configDir = $dirName; } elseif ($stdin || null === $path) { $configDir = getcwd(); // path is directory } $configFile = $configDir . DIRECTORY_SEPARATOR . '.php_cs'; } if ($input->getOption('config')) { $config = null; foreach ($this->fixer->getConfigs() as $c) { if ($c->getName() === $input->getOption('config')) { $config = $c; break; } } if (null === $config) { throw new InvalidConfigurationException(sprintf('The configuration "%s" is not defined.', $input->getOption('config'))); } } elseif (file_exists($configFile)) { $config = (include $configFile); // verify that the config has an instance of Config if (!$config instanceof ConfigInterface) { throw new InvalidConfigurationException(sprintf('The config file "%s" does not return a "Symfony\\CS\\ConfigInterface" instance. Got: "%s".', $configFile, is_object($config) ? get_class($config) : gettype($config))); } if (null !== $stdErr && $configFile) { $stdErr->writeln(sprintf('Loaded config from "%s".', $configFile)); } } else { $config = $this->defaultConfig; } // setup location of source(s) to fix if (is_file($path)) { $config->finder(new \ArrayIterator(array(new \SplFileInfo($path)))); } elseif ($stdin) { $config->finder(new \ArrayIterator(array(new StdinFileInfo()))); } elseif (null !== $path) { $config->setDir($path); } // setup Linter if ($config->usingLinter()) { $this->fixer->setLintManager(new LintManager()); } // register custom fixers from config $this->fixer->registerCustomFixers($config->getCustomFixers()); $resolver = new ConfigurationResolver(); $resolver->setAllFixers($this->fixer->getFixers())->setConfig($config)->setOptions(array('level' => $input->getOption('level'), 'fixers' => $input->getOption('fixers'), 'progress' => OutputInterface::VERBOSITY_VERBOSE <= $verbosity && 'txt' === $input->getOption('format'), 'format' => $input->getOption('format')))->resolve(); $config->fixers($resolver->getFixers()); $showProgress = null !== $stdErr && $resolver->getProgress(); if ($showProgress) { $fileProcessedEventListener = function (FixerFileProcessedEvent $event) use($stdErr) { $stdErr->write($event->getStatusAsString()); }; $this->fixer->setEventDispatcher($this->eventDispatcher); $this->eventDispatcher->addListener(FixerFileProcessedEvent::NAME, $fileProcessedEventListener); } $isDiff = $input->getOption('diff'); $this->stopwatch->start('fixFiles'); $changed = $this->fixer->fix($config, $input->getOption('dry-run'), $isDiff); $this->stopwatch->stop('fixFiles'); if ($showProgress) { $this->fixer->setEventDispatcher(null); $this->eventDispatcher->removeListener(FixerFileProcessedEvent::NAME, $fileProcessedEventListener); $stdErr->writeln(''); $legend = array(); foreach (FixerFileProcessedEvent::getStatusMap() as $status) { if ($status['symbol'] && $status['description']) { $legend[] = $status['symbol'] . '-' . $status['description']; } } $stdErr->writeln('Legend: ' . implode(', ', array_unique($legend))); } $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 ($isDiff) { $output->writeln(''); $output->writeln('<comment> ---------- begin diff ----------</comment>'); if ($output->isDecorated()) { $diff = implode(PHP_EOL, array_map(function ($string) { $string = preg_replace('/^(\\+){3}/', '<info>+++</info>', $string); $string = preg_replace('/^(\\+){1}/', '<info>+</info>', $string); $string = preg_replace('/^(\\-){3}/', '<error>---</error>', $string); $string = preg_replace('/^(\\-){1}/', '<error>-</error>', $string); $string = str_repeat(' ', 6) . $string; return $string; }, explode(PHP_EOL, OutputFormatter::escape($fixResult['diff'])))); $output->writeln($diff); } else { $output->writeln($fixResult['diff'], OutputInterface::OUTPUT_RAW); } $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'); $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 ($isDiff) { $diffXML = $dom->createElement('diff'); $diffXML->appendChild($dom->createCDATASection($fixResult['diff'])); $fileXML->appendChild($diffXML); } } $dom->formatOutput = true; $output->write($dom->saveXML(), false, OutputInterface::OUTPUT_RAW); break; case 'json': $jFiles = array(); foreach ($changed as $file => $fixResult) { $jfile = array('name' => $file); if (OutputInterface::VERBOSITY_VERBOSE <= $verbosity) { $jfile['appliedFixers'] = $fixResult['appliedFixers']; } if ($isDiff) { $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), false, OutputInterface::OUTPUT_RAW); break; } if (null !== $stdErr && !$this->errorsManager->isEmpty()) { $stdErr->writeln(''); $stdErr->writeln('Files that were not fixed due to internal error:'); foreach ($this->errorsManager->getErrors() as $i => $error) { $stdErr->writeln(sprintf('%4d) %s', $i + 1, $error['filepath'])); } } return 0 === count($changed) ? 0 : 1; }