-
Notifications
You must be signed in to change notification settings - Fork 195
/
Copy pathLatestRelease.php
137 lines (122 loc) · 3.38 KB
/
LatestRelease.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
<?php
namespace Pantheon\Terminus\Update;
use League\Container\ContainerAwareInterface;
use League\Container\ContainerAwareTrait;
use Pantheon\Terminus\DataStore\DataStoreAwareInterface;
use Pantheon\Terminus\DataStore\DataStoreAwareTrait;
use Pantheon\Terminus\DataStore\DataStoreInterface;
use Pantheon\Terminus\Exceptions\TerminusNotFoundException;
use Pantheon\Terminus\Request\RequestAwareInterface;
use Pantheon\Terminus\Request\RequestAwareTrait;
use Psr\Log\LoggerAwareInterface;
use Psr\Log\LoggerAwareTrait;
/**
* Class LatestRelease
*
* @package Pantheon\Terminus\Update
*/
class LatestRelease implements
ContainerAwareInterface,
DataStoreAwareInterface,
LoggerAwareInterface,
RequestAwareInterface
{
use ContainerAwareTrait;
use DataStoreAwareTrait;
use LoggerAwareTrait;
use RequestAwareTrait;
/**
* @var object
*/
private $attributes;
public const SAVE_FILE = 'latest_release';
public const TIME_BETWEEN_CHECKS = '7 days';
public const UPDATE_URL = 'https://api.github.com/repos/pantheon-systems/terminus/releases/latest';
/**
* @param DataStoreInterface $data_store
*/
public function __construct(DataStoreInterface $data_store)
{
$this->setDataStore($data_store);
}
/**
* @param string $id Key of the attribute to retrieve
*
* @return string
* @throws TerminusNotFoundException
*/
public function get($id)
{
$attributes = $this->getAttributes();
if (isset($attributes->$id)) {
return $attributes->$id;
}
throw new TerminusNotFoundException(
'There is no attribute called {id}.',
compact('id')
);
}
/**
* Retrieves release data. If it is time to check for an update, it will do
* that.
*/
private function fetch()
{
$saved_data = (object)$this->getSavedReleaseFromFile();
if (
!isset($saved_data->check_date)
|| (int)$saved_data->check_date < strtotime(
'-' . self::TIME_BETWEEN_CHECKS
)
) {
try {
$this->attributes = $this->getLatestReleaseFromGithub();
$this->saveReleaseData($this->attributes);
} catch (\Exception $e) {
$this->logger->debug(
"Terminus was unable to check the latest release version number.\n{message}",
['message' => $e->getMessage(),]
);
}
}
if (empty($this->attributes)) {
$this->attributes = $saved_data;
}
}
/**
* @return object
*/
private function getAttributes()
{
if (empty($this->attributes)) {
$this->fetch();
}
return $this->attributes;
}
/**
* @return object
*/
private function getLatestReleaseFromGithub()
{
return (object)[
'version' => $this->request()->request(
self::UPDATE_URL
)['data']->name,
'check_date' => time(),
];
}
/**
* @return object
*/
private function getSavedReleaseFromFile()
{
return $this->getDataStore()->get(self::SAVE_FILE);
}
/**
* @param object $data
*/
private function saveReleaseData($data)
{
$this->getDataStore()->set(self::SAVE_FILE, $data);
}
}