Version 1
[yaffs-website] / vendor / psy / psysh / src / Psy / VersionUpdater / GitHubChecker.php
1 <?php
2
3 /*
4  * This file is part of Psy Shell.
5  *
6  * (c) 2012-2017 Justin Hileman
7  *
8  * For the full copyright and license information, please view the LICENSE
9  * file that was distributed with this source code.
10  */
11
12 namespace Psy\VersionUpdater;
13
14 use Psy\Shell;
15
16 class GitHubChecker implements Checker
17 {
18     const URL = 'https://api.github.com/repos/bobthecow/psysh/releases/latest';
19
20     private $latest;
21
22     /**
23      * @return bool
24      */
25     public function isLatest()
26     {
27         return version_compare(Shell::VERSION, $this->getLatest(), '>=');
28     }
29
30     /**
31      * @return string
32      */
33     public function getLatest()
34     {
35         if (!isset($this->latest)) {
36             $this->setLatest($this->getVersionFromTag());
37         }
38
39         return $this->latest;
40     }
41
42     /**
43      * @param string $version
44      */
45     public function setLatest($version)
46     {
47         $this->latest = $version;
48     }
49
50     /**
51      * @return string|null
52      */
53     private function getVersionFromTag()
54     {
55         $contents = $this->fetchLatestRelease();
56         if (!$contents || !isset($contents->tag_name)) {
57             throw new \InvalidArgumentException('Unable to check for updates');
58         }
59         $this->setLatest($contents->tag_name);
60
61         return $this->getLatest();
62     }
63
64     /**
65      * Set to public to make testing easier.
66      *
67      * @return mixed
68      */
69     public function fetchLatestRelease()
70     {
71         $context = stream_context_create(array('http' => array('user_agent' => 'PsySH/' . Shell::VERSION)));
72
73         return json_decode(@file_get_contents(self::URL, false, $context));
74     }
75 }