additionalAutoloader = $additionalAutoloader; $this->changedFilesDetector = $changedFilesDetector; $this->configInitializer = $configInitializer; $this->applicationFileProcessor = $applicationFileProcessor; $this->dynamicSourceLocatorDecorator = $dynamicSourceLocatorDecorator; $this->outputFormatterCollector = $outputFormatterCollector; $this->symfonyStyle = $symfonyStyle; $this->memoryLimiter = $memoryLimiter; $this->configurationFactory = $configurationFactory; parent::__construct(); } protected function configure() : void { $this->setName('process'); $this->setDescription('Upgrades or refactors source code with provided rectors'); ProcessConfigureDecorator::decorate($this); parent::configure(); } protected function execute(InputInterface $input, OutputInterface $output) : int { // missing config? add it :) if (!$this->configInitializer->areSomeRectorsLoaded()) { $this->configInitializer->createConfig(\getcwd()); return self::SUCCESS; } $configuration = $this->configurationFactory->createFromInput($input); $this->memoryLimiter->adjust($configuration); // disable console output in case of json output formatter if ($configuration->getOutputFormat() === JsonOutputFormatter::NAME) { $this->symfonyStyle->setVerbosity(OutputInterface::VERBOSITY_QUIET); } $this->additionalAutoloader->autoloadInput($input); $this->additionalAutoloader->autoloadPaths(); $paths = $configuration->getPaths(); // 1. add files and directories to static locator $this->dynamicSourceLocatorDecorator->addPaths($paths); if ($this->dynamicSourceLocatorDecorator->isPathsEmpty()) { $this->symfonyStyle->error('The given paths do not match any files'); return ExitCode::FAILURE; } // MAIN PHASE // 2. run Rector $processResult = $this->applicationFileProcessor->run($configuration, $input); // REPORTING PHASE // 3. reporting phaseRunning 2nd time with collectors data // report diffs and errors $outputFormat = $configuration->getOutputFormat(); $outputFormatter = $this->outputFormatterCollector->getByName($outputFormat); $outputFormatter->report($processResult, $configuration); return $this->resolveReturnCode($processResult, $configuration); } protected function initialize(InputInterface $input, OutputInterface $output) : void { $application = $this->getApplication(); if (!$application instanceof Application) { throw new ShouldNotHappenException(); } $optionDebug = (bool) $input->getOption(Option::DEBUG); if ($optionDebug) { $application->setCatchExceptions(\false); } // clear cache $optionClearCache = (bool) $input->getOption(Option::CLEAR_CACHE); if ($optionDebug || $optionClearCache) { $this->changedFilesDetector->clear(); } } /** * @return ExitCode::* */ private function resolveReturnCode(ProcessResult $processResult, Configuration $configuration) : int { // some system errors were found → fail if ($processResult->getSystemErrors() !== []) { return ExitCode::FAILURE; } // inverse error code for CI dry-run if (!$configuration->isDryRun()) { return ExitCode::SUCCESS; } if ($processResult->getFileDiffs() !== []) { return ExitCode::CHANGED_CODE; } return ExitCode::SUCCESS; } }