1
|
|
|
<?php |
2
|
|
|
/** |
3
|
|
|
* Automation tool mixed with code generator for easier continuous development |
4
|
|
|
* |
5
|
|
|
* @link https://github.com/hiqdev/hidev |
6
|
|
|
* @package hidev |
7
|
|
|
* @license BSD-3-Clause |
8
|
|
|
* @copyright Copyright (c) 2015-2018, HiQDev (http://hiqdev.com/) |
9
|
|
|
*/ |
10
|
|
|
|
11
|
|
|
namespace hidev\components; |
12
|
|
|
|
13
|
|
|
use hidev\helpers\Helper; |
14
|
|
|
use yii\helpers\Json; |
15
|
|
|
|
16
|
|
|
/** |
17
|
|
|
* GitHub component. |
18
|
|
|
*/ |
19
|
|
|
class GitHub extends \hidev\base\Component |
20
|
|
|
{ |
21
|
|
|
protected $_name; |
22
|
|
|
protected $_vendor; |
23
|
|
|
protected $_description; |
24
|
|
|
protected $_vendorType; |
25
|
|
|
|
26
|
|
|
/** |
27
|
|
|
* @var string GitHub OAuth access token |
28
|
|
|
*/ |
29
|
|
|
protected $_token; |
30
|
|
|
|
31
|
|
|
public function setFull_name($value) |
32
|
|
|
{ |
33
|
|
|
list($this->_vendor, $this->_name) = explode('/', $value, 2); |
34
|
|
|
} |
35
|
|
|
|
36
|
|
|
public function getFull_name() |
37
|
|
|
{ |
38
|
|
|
return $this->getVendor() . '/' . $this->getName(); |
39
|
|
|
} |
40
|
|
|
|
41
|
|
|
public function setFullName($value) |
42
|
|
|
{ |
43
|
|
|
return $this->setFull_name($value); |
|
|
|
|
44
|
|
|
} |
45
|
|
|
|
46
|
|
|
public function getFullName() |
47
|
|
|
{ |
48
|
|
|
return $this->getFull_name(); |
49
|
|
|
} |
50
|
|
|
|
51
|
|
|
public function setName($value) |
52
|
|
|
{ |
53
|
|
|
$this->_name = $value; |
54
|
|
|
} |
55
|
|
|
|
56
|
|
|
public function getName() |
57
|
|
|
{ |
58
|
|
|
if (!$this->_name) { |
59
|
|
|
$this->_name = $this->take('package')->name; |
60
|
|
|
} |
61
|
|
|
|
62
|
|
|
return $this->_name; |
63
|
|
|
} |
64
|
|
|
|
65
|
|
|
public function setVendorType($value) |
66
|
|
|
{ |
67
|
|
|
$this->_vendorType = $value; |
68
|
|
|
} |
69
|
|
|
|
70
|
|
|
public function getVendorType() |
71
|
|
|
{ |
72
|
|
|
if (!$this->_vendorType) { |
73
|
|
|
$this->_vendorType = 'org'; |
74
|
|
|
} |
75
|
|
|
|
76
|
|
|
return $this->_vendorType; |
77
|
|
|
} |
78
|
|
|
|
79
|
|
|
public function setVendor($value) |
80
|
|
|
{ |
81
|
|
|
$this->_vendor = $value; |
82
|
|
|
} |
83
|
|
|
|
84
|
|
|
public function getVendor() |
85
|
|
|
{ |
86
|
|
|
if (!$this->_vendor) { |
87
|
|
|
$this->_vendor = $this->take('vendor')->name; |
88
|
|
|
} |
89
|
|
|
|
90
|
|
|
return $this->_vendor; |
91
|
|
|
} |
92
|
|
|
|
93
|
|
|
public function setDescription($value) |
94
|
|
|
{ |
95
|
|
|
$this->_description = $value; |
96
|
|
|
} |
97
|
|
|
|
98
|
|
|
public function getDescription() |
99
|
|
|
{ |
100
|
|
|
if ($this->_description === null) { |
101
|
|
|
$this->_description = $this->take('package')->getTitle(); |
102
|
|
|
} |
103
|
|
|
|
104
|
|
|
return $this->_description; |
105
|
|
|
} |
106
|
|
|
|
107
|
|
|
/** |
108
|
|
|
* Create the repo on GitHub. |
109
|
|
|
* @return int exit code |
110
|
|
|
*/ |
111
|
|
|
public function createRepo(string $repo = null) |
|
|
|
|
112
|
|
|
{ |
113
|
|
|
$end = $this->getVendorType() === 'org' |
114
|
|
|
?'/orgs/' . $this->getVendor() . '/repos' |
115
|
|
|
: '/user/repos' |
116
|
|
|
; |
117
|
|
|
$res = $this->request('POST', $end, [ |
118
|
|
|
'name' => $this->getName(), |
119
|
|
|
'description' => $this->getDescription(), |
120
|
|
|
]); |
121
|
|
|
if (Helper::isResponseOk($res)) { |
122
|
|
|
echo "\ngit remote add origin [email protected]:{$this->getFullName()}.git\n"; |
123
|
|
|
echo "git push -u origin master\n"; |
124
|
|
|
} |
125
|
|
|
|
126
|
|
|
return $res; |
127
|
|
|
} |
128
|
|
|
|
129
|
|
|
/** |
130
|
|
|
* Clone repo from github. |
131
|
|
|
* TODO this action must be run without `start`. |
132
|
|
|
* @param string $repo full name vendor/package |
133
|
|
|
* @return int exit code |
134
|
|
|
*/ |
135
|
|
|
public function cloneRepo($repo) |
136
|
|
|
{ |
137
|
|
|
return $this->passthru('git', ['clone', '[email protected]:' . $repo]); |
138
|
|
|
} |
139
|
|
|
|
140
|
|
|
/** |
141
|
|
|
* Checks if repo exists. |
142
|
|
|
* @param string $repo full name vendor/package defaults to this repo name |
143
|
|
|
* @return int exit code |
144
|
|
|
*/ |
145
|
|
|
public function existsRepo($repo = null) |
146
|
|
|
{ |
147
|
|
|
return static::exists($repo ?: $this->getFull_name()); |
|
|
|
|
148
|
|
|
} |
149
|
|
|
|
150
|
|
|
/** |
151
|
|
|
* Check if repo exists. |
152
|
|
|
* @param string $repo |
153
|
|
|
* @return bool |
154
|
|
|
*/ |
155
|
|
|
public static function exists($repo) |
156
|
|
|
{ |
157
|
|
|
return !static::exec('git', ['ls-remote', '[email protected]:' . $repo], true); |
|
|
|
|
158
|
|
|
} |
159
|
|
|
|
160
|
|
|
/** |
161
|
|
|
* Creates github release. |
162
|
|
|
* @param string $release version number |
163
|
|
|
*/ |
164
|
|
|
public function releaseRepo($release = null) |
165
|
|
|
{ |
166
|
|
|
$release = $this->take('version')->getRelease($release); |
167
|
|
|
$notes = $this->take('chkipper')->getReleaseNotes(); |
168
|
|
|
$wait = $this->waitPush(); |
169
|
|
|
if ($wait) { |
170
|
|
|
return $wait; |
171
|
|
|
} |
172
|
|
|
|
173
|
|
|
return $this->request('POST', '/repos/' . $this->getFull_name() . '/releases', [ |
174
|
|
|
'tag_name' => $release, |
175
|
|
|
'name' => $release, |
176
|
|
|
'body' => $notes, |
177
|
|
|
]); |
178
|
|
|
} |
179
|
|
|
|
180
|
|
|
/** |
181
|
|
|
* Waits until push is actually finished. |
182
|
|
|
* TODO Check github if it really has latest local commit. |
183
|
|
|
* @return int 0 - success, 1 - failed |
184
|
|
|
*/ |
185
|
|
|
public function waitPush() |
186
|
|
|
{ |
187
|
|
|
sleep(7); |
188
|
|
|
|
189
|
|
|
return 0; |
190
|
|
|
} |
191
|
|
|
|
192
|
|
|
public function request($method, $path, $data) |
193
|
|
|
{ |
194
|
|
|
$url = 'https://api.github.com' . $path; |
195
|
|
|
|
196
|
|
|
return $this->passthru('curl', ['-X', $method, '-H', 'Authorization: token ' . $this->getToken(), '--data', Json::encode($data), $url]); |
197
|
|
|
} |
198
|
|
|
|
199
|
|
|
public function findToken() |
200
|
|
|
{ |
201
|
|
|
return $_SERVER['GITHUB_TOKEN'] ?: Helper::readpassword('GitHub token:'); |
202
|
|
|
} |
203
|
|
|
|
204
|
|
|
public function getToken() |
205
|
|
|
{ |
206
|
|
|
if ($this->_token === null) { |
207
|
|
|
$this->_token = $this->findToken(); |
208
|
|
|
} |
209
|
|
|
|
210
|
|
|
return $this->_token; |
211
|
|
|
} |
212
|
|
|
} |
213
|
|
|
|
This check looks for function or method calls that always return null and whose return value is used.
The method
getObject()
can return nothing but null, so it makes no sense to use the return value.The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.