Chris@0: getLatest(), '>='); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @return string Chris@0: */ Chris@0: public function getLatest() Chris@0: { Chris@0: if (!isset($this->latest)) { Chris@0: $this->setLatest($this->getVersionFromTag()); Chris@0: } Chris@0: Chris@0: return $this->latest; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @param string $version Chris@0: */ Chris@0: public function setLatest($version) Chris@0: { Chris@0: $this->latest = $version; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @return string|null Chris@0: */ Chris@0: private function getVersionFromTag() Chris@0: { Chris@0: $contents = $this->fetchLatestRelease(); Chris@0: if (!$contents || !isset($contents->tag_name)) { Chris@0: throw new \InvalidArgumentException('Unable to check for updates'); Chris@0: } Chris@0: $this->setLatest($contents->tag_name); Chris@0: Chris@0: return $this->getLatest(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Set to public to make testing easier. Chris@0: * Chris@0: * @return mixed Chris@0: */ Chris@0: public function fetchLatestRelease() Chris@0: { Chris@0: $context = stream_context_create([ Chris@0: 'http' => [ Chris@0: 'user_agent' => 'PsySH/' . Shell::VERSION, Chris@0: 'timeout' => 3, Chris@0: ], Chris@0: ]); Chris@0: Chris@0: set_error_handler(function () { Chris@0: // Just ignore all errors with this. The checker will throw an exception Chris@0: // if it doesn't work :) Chris@0: }); Chris@0: Chris@0: $result = @file_get_contents(self::URL, false, $context); Chris@0: Chris@0: restore_error_handler(); Chris@0: Chris@0: return json_decode($result); Chris@0: } Chris@0: }