protected function checkUpdates()
    {
        // Avoid checking more than once in this process.
        if (self::$checkedUpdates) {
            return;
        }
        self::$checkedUpdates = true;

        // Check that the Phar extension is available.
        if (!extension_loaded('Phar')) {
            return;
        }

        // Get the filename of the Phar, or stop if this instance of the CLI is
        // not a Phar.
        $pharFilename = \Phar::running(false);
        if (!$pharFilename) {
            return;
        }

        // Check if the file is writable.
        if (!is_writable($pharFilename)) {
            return;
        }

        // Check if updates are configured.
        $config = $this->config();
        if (!$config->get('updates.check')) {
            return;
        }

        // Determine an embargo time, after which updates can be checked.
        $timestamp = time();
        $embargoTime = $timestamp - $config->get('updates.check_interval');

        // Stop if updates were last checked after the embargo time.
        /** @var \Platformsh\Cli\Service\State $state */
        $state = $this->getService('state');
        if ($state->get('updates.last_checked') > $embargoTime) {
            return;
        }

        // Stop if the Phar was updated after the embargo time.
        if (filemtime($pharFilename) > $embargoTime) {
            return;
        }

        // Ensure classes are auto-loaded if they may be needed after the
        // update.
        /** @var \Platformsh\Cli\Service\Shell $shell */
        $shell = $this->getService('shell');
        /** @var \Platformsh\Cli\Service\QuestionHelper $questionHelper */
        $questionHelper = $this->getService('question_helper');
        $currentVersion = $this->config()->get('application.version');

        /** @var \Platformsh\Cli\Service\SelfUpdater $cliUpdater */
        $cliUpdater = $this->getService('self_updater');
        $cliUpdater->setAllowMajor(true);
        $cliUpdater->setTimeout(5);

        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;
            }
        }

        $state->set('updates.last_checked', $timestamp);

        // 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($this->input)
                && $this->input instanceof ArgvInput
                && is_executable($pharFilename)) {
                $originalCommand = $this->input->__toString();
                $questionText = "\n"
                    . 'Original command: <info>' . $originalCommand . '</info>'
                    . "\n\n" . 'Continue?';
                if ($questionHelper->confirm($questionText)) {
                    $this->stdErr->writeln('');
                    $exitCode = $shell->executeSimple(escapeshellarg($pharFilename) . ' ' . $originalCommand);
                }
            }
            exit($exitCode);
        }

        $this->stdErr->writeln('');
    }
protected function checkUpdates()
    {
        // Avoid checking more than once in this process.
        if (self::$checkedUpdates) {
            return;
        }
        self::$checkedUpdates = true;

        // Check that the Phar extension is available.
        if (!extension_loaded('Phar')) {
            return;
        }

        // Get the filename of the Phar, or stop if this instance of the CLI is
        // not a Phar.
        $pharFilename = \Phar::running(false);
        if (!$pharFilename) {
            return;
        }

        // Check if the file is writable.
        if (!is_writable($pharFilename)) {
            return;
        }

        // Check if updates are configured.
        $config = $this->config();
        if (!$config->get('updates.check')) {
            return;
        }

        // Determine an embargo time, after which updates can be checked.
        $timestamp = time();
        $embargoTime = $timestamp - $config->get('updates.check_interval');

        // Stop if updates were last checked after the embargo time.
        /** @var \Platformsh\Cli\Service\State $state */
        $state = $this->getService('state');
        if ($state->get('updates.last_checked') > $embargoTime) {
            return;
        }

        // Stop if the Phar was updated after the embargo time.
        if (filemtime($pharFilename) > $embargoTime) {
            return;
        }

        // Ensure classes are auto-loaded if they may be needed after the
        // update.
        /** @var \Platformsh\Cli\Service\Shell $shell */
        $shell = $this->getService('shell');
        /** @var \Platformsh\Cli\Service\QuestionHelper $questionHelper */
        $questionHelper = $this->getService('question_helper');
        $currentVersion = $this->config()->get('application.version');

        /** @var \Platformsh\Cli\Service\SelfUpdater $cliUpdater */
        $cliUpdater = $this->getService('self_updater');
        $cliUpdater->setAllowMajor(true);
        $cliUpdater->setTimeout(5);

        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;
            }
        }

        $state->set('updates.last_checked', $timestamp);

        // 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($this->input)
                && $this->input instanceof ArgvInput
                && is_executable($pharFilename)) {
                $originalCommand = $this->input->__toString();
                $questionText = "\n"
                    . 'Original command: <info>' . $originalCommand . '</info>'
                    . "\n\n" . 'Continue?';
                if ($questionHelper->confirm($questionText)) {
                    $this->stdErr->writeln('');
                    $exitCode = $shell->executeSimple(escapeshellarg($pharFilename) . ' ' . $originalCommand);
                }
            }
            exit($exitCode);
        }

        $this->stdErr->writeln('');
    }
protected function checkUpdates ( ) { // Avoid checking more than once in this process. if ( self :: $ checkedUpdates ) { return ; } self :: $ checkedUpdates = true ; // Check that the Phar extension is available. if ( ! extension_loaded ( 'Phar' ) ) { return ; } // Get the filename of the Phar, or stop if this instance of the CLI is // not a Phar. $ pharFilename = \ Phar :: running ( false ) ; if ( ! $ pharFilename ) { return ; } // Check if the file is writable. if ( ! is_writable ( $ pharFilename ) ) { return ; } // Check if updates are configured. $ config = $ this -> config ( ) ; if ( ! $ config -> get ( 'updates.check' ) ) { return ; } // Determine an embargo time, after which updates can be checked. $ timestamp = time ( ) ; $ embargoTime = $ timestamp - $ config -> get ( 'updates.check_interval' ) ; // Stop if updates were last checked after the embargo time. /** @var \Platformsh\Cli\Service\State $state */ $ state = $ this -> getService ( 'state' ) ; if ( $ state -> get ( 'updates.last_checked' ) > $ embargoTime ) { return ; } // Stop if the Phar was updated after the embargo time. if ( filemtime ( $ pharFilename ) > $ embargoTime ) { return ; } // Ensure classes are auto-loaded if they may be needed after the // update. /** @var \Platformsh\Cli\Service\Shell $shell */ $ shell = $ this -> getService ( 'shell' ) ; /** @var \Platformsh\Cli\Service\QuestionHelper $questionHelper */ $ questionHelper = $ this -> getService ( 'question_helper' ) ; $ currentVersion = $ this -> config ( ) -> get ( 'application.version' ) ; /** @var \Platformsh\Cli\Service\SelfUpdater $cliUpdater */ $ cliUpdater = $ this -> getService ( 'self_updater' ) ; $ cliUpdater -> setAllowMajor ( true ) ; $ cliUpdater -> setTimeout ( 5 ) ; 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 ; } } $ state -> set ( 'updates.last_checked' , $ timestamp ) ; // 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 ( $ this -> input ) && $ this -> input instanceof ArgvInput && is_executable ( $ pharFilename ) ) { $ originalCommand = $ this -> input -> __toString ( ) ; $ questionText = "\n" . 'Original command: <info>' . $ originalCommand . '</info>' . "\n\n" . 'Continue?' ; if ( $ questionHelper -> confirm ( $ questionText ) ) { $ this -> stdErr -> writeln ( '' ) ; $ exitCode = $ shell -> executeSimple ( escapeshellarg ( $ pharFilename ) . ' ' . $ originalCommand ) ; } } exit ( $ exitCode ) ; } $ this -> stdErr -> writeln ( '' ) ; }
Check for updates.
Check for updates .