protected function execute(InputInterface $input, OutputInterface $output)
 {
     $manifestUrl = $input->getOption('manifest') ?: self::$config->get('application.manifest_url');
     $currentVersion = $input->getOption('current-version') ?: self::$config->get('application.version');
     $cliUpdater = new SelfUpdater($input, $output, self::$config, $this->getHelper('question'));
     $cliUpdater->setAllowMajor(!$input->getOption('no-major'));
     $cliUpdater->setAllowUnstable((bool) $input->getOption('unstable'));
     $cliUpdater->setTimeout($input->getOption('timeout'));
     $result = $cliUpdater->update($manifestUrl, $currentVersion);
     if ($result === false) {
         return 1;
     }
     // Phar cannot load more classes after the update has occurred. So to
     // avoid errors from classes loaded after this (e.g.
     // ConsoleTerminateEvent), we exit directly now.
     exit(0);
 }
 /**
  * Check for updates.
  *
  * @param bool $reset
  */
 protected function checkUpdates($reset = false)
 {
     if (!$reset && self::$checkedUpdates) {
         return;
     }
     self::$checkedUpdates = true;
     // Check that this instance of the CLI was installed as a Phar.
     if (!extension_loaded('Phar') || !\Phar::running(false)) {
         return;
     }
     $timestamp = time();
     if (!self::$config->get('updates.check')) {
         return;
     } elseif (!$reset && self::$config->get('updates.last_checked') > $timestamp - self::$config->get('updates.check_interval')) {
         return;
     }
     self::$config->writeUserConfig(['updates' => ['check' => true, 'last_checked' => $timestamp]]);
     // Ensure classes are auto-loaded if they may be needed after the
     // update.
     /** @var \Platformsh\Cli\Helper\ShellHelper $shellHelper */
     $shellHelper = $this->getHelper('shell');
     /** @var \Platformsh\Cli\Helper\QuestionHelper $questionHelper */
     $questionHelper = $this->getHelper('question');
     $currentVersion = self::$config->get('application.version');
     $cliUpdater = new SelfUpdater($this->input, $this->output, self::$config, $questionHelper);
     $cliUpdater->setAllowMajor(true);
     $cliUpdater->setTimeout(10);
     try {
         $newVersion = $cliUpdater->update(null, $currentVersion);
     } catch (\RuntimeException $e) {
         if (strpos($e->getMessage(), 'Failed to download') !== false) {
             $this->stdErr->writeln('<error>' . $e->getMessage() . '</error>');
             $newVersion = false;
         } else {
             throw $e;
         }
     }
     // If the update was successful, and it's not a major version change,
     // then prompt the user to continue after updating.
     if ($newVersion !== false) {
         $exitCode = 0;
         list($currentMajorVersion, ) = explode('.', $currentVersion, 2);
         list($newMajorVersion, ) = explode('.', $newVersion, 2);
         if ($newMajorVersion === $currentMajorVersion && isset($GLOBALS['argv'])) {
             $originalCommand = implode(' ', array_map('escapeshellarg', $GLOBALS['argv']));
             $questionText = "\n" . 'Original command: <info>' . $originalCommand . '</info>' . "\n\n" . 'Continue?';
             if ($questionHelper->confirm($questionText)) {
                 $this->stdErr->writeln('');
                 $exitCode = $shellHelper->executeSimple($originalCommand);
             }
         }
         exit($exitCode);
     }
     $this->stdErr->writeln('');
 }