Completed
Push — master ( 9039c2...e30981 )
by Andrii
03:01
created

GithubController   A

Complexity

Total Complexity 26

Size/Duplication

Total Lines 155
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Test Coverage

Coverage 0%

Importance

Changes 8
Bugs 1 Features 1
Metric Value
wmc 26
c 8
b 1
f 1
lcom 1
cbo 2
dl 0
loc 155
ccs 0
cts 99
cp 0
rs 10

16 Methods

Rating   Name   Duplication   Size   Complexity  
A setName() 0 7 3
A getName() 0 8 2
A setVendor() 0 4 1
A getVendor() 0 8 2
A setPackage() 0 4 1
A getPackage() 0 8 2
A setDescription() 0 4 1
A getDescription() 0 8 2
A actionCreate() 0 7 1
A actionClone() 0 4 1
A actionExists() 0 4 2
A actionRelease() 0 17 2
A actionWaitPush() 0 6 1
A request() 0 6 1
A findToken() 0 4 2
A getToken() 0 8 2
1
<?php
2
3
/*
4
 * Task runner, code generator and build tool for easier continuos integration
5
 *
6
 * @link      https://github.com/hiqdev/hidev
7
 * @package   hidev
8
 * @license   BSD-3-Clause
9
 * @copyright Copyright (c) 2015-2016, HiQDev (http://hiqdev.com/)
10
 */
11
12
namespace hidev\controllers;
13
14
use yii\helpers\Json;
15
16
/**
17
 * Goal for GitHub.
18
 */
19
class GithubController extends CommonController
20
{
21
    protected $_name;
22
    protected $_vendor;
23
    protected $_package;
24
    protected $_description;
25
26
    /**
27
     * @var string GitHub OAuth access token
28
     */
29
    protected $_token;
30
31
    public function setName($value)
32
    {
33
        list($vendor, $package) = explode('/', $value, 2);
34
        $this->_name    = $value;
35
        $this->_vendor  = $vendor ?: $package;
36
        $this->_package = $package ?: $vendor;
37
    }
38
39
    public function getName()
40
    {
41
        if ($this->_name === null) {
42
            $this->setName($this->takePackage()->fullName);
43
        }
44
45
        return $this->_name;
46
    }
47
48
    public function setVendor($value)
49
    {
50
        $this->_vendor = $value;
51
    }
52
53
    public function getVendor()
54
    {
55
        if ($this->_vendor === null) {
56
            $this->_vendor = $this->takeVendor()->name;
57
        }
58
59
        return $this->_vendor;
60
    }
61
62
    public function setPackage($value)
63
    {
64
        $this->_package = $value;
65
    }
66
67
    public function getPackage()
68
    {
69
        if ($this->_package === null) {
70
            $this->_package = $this->takePackage()->name;
71
        }
72
73
        return $this->_package;
74
    }
75
76
    public function setDescription($value)
77
    {
78
        $this->_description = $value;
79
    }
80
81
    public function getDescription()
82
    {
83
        if ($this->_description === null) {
84
            $this->_description = $this->takePackage()->getTitle();
85
        }
86
87
        return $this->_description;
88
    }
89
90
    /**
91
     * Create the repo on GitHub.
92
     * @return int exit code
93
     */
94
    public function actionCreate()
95
    {
96
        return $this->request('POST', '/orgs/' . $this->getVendor() . '/repos', [
97
            'name'        => $this->getPackage(),
98
            'description' => $this->getDescription(),
99
        ]);
100
    }
101
102
    /**
103
     * Clone repo from github.
104
     * TODO this action must be run without `start`.
105
     * @param string $repo full name vendor/package
106
     * @return int exit code
107
     */
108
    public function actionClone($repo)
109
    {
110
        return $this->passthru('git', ['clone', '[email protected]:' . $repo]);
0 ignored issues
show
Documentation introduced by
array('clone', '[email protected]:' . $repo) is of type array<integer,string,{"0":"string","1":"string"}>, but the function expects a string.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
111
    }
112
113
    /**
114
     * Check if repo exists.
115
     * @param string $repo full name vendor/package defaults to this repo name
116
     * @return int exit code
117
     */
118
    public function actionExists($repo = null)
119
    {
120
        return $this->exec('git', ['ls-remote', '[email protected]:' . ($repo ?: $this->getName())], true);
0 ignored issues
show
Documentation introduced by
array('ls-remote', 'git@...o ?: $this->getName())) is of type array<integer,string,{"0":"string","1":"string"}>, but the function expects a string.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
121
    }
122
123
    public function actionRelease($version = null)
124
    {
125
        $this->runRequest('CHANGELOG.md');
126
        $changelog = $this->takeGoal('CHANGELOG.md');
127
        $notes = reset($changelog->getFile()->getHandler()->releaseNotes);
128
        $version = $this->takeGoal('bump')->getVersion($version);
129
        $wait = $this->actionWaitPush();
130
        if ($wait) {
131
            return $wait;
132
        }
133
134
        return $this->request('POST', '/repos/' . $this->getName() . '/releases', [
135
            'tag_name'  => $version,
136
            'name'      => $version,
137
            'body'      => $notes,
138
        ]);
139
    }
140
141
    /**
142
     * Waits until push is actually finished.
143
     * TODO Check github if it really has latest local commit.
144
     * @return int 0 - success, 1 - failed
145
     */
146
    public function actionWaitPush()
147
    {
148
        sleep(7);
149
150
        return 0;
151
    }
152
153
    public function request($method, $path, $data)
154
    {
155
        $url = 'https://api.github.com' . $path;
156
157
        return $this->passthru('curl', ['-X', $method, '-H', 'Authorization: token ' . $this->getToken(), '--data', Json::encode($data), $url]);
0 ignored issues
show
Documentation introduced by
array('-X', $method, '-H...n::encode($data), $url) is of type array<integer,?,{"0":"st..."string","6":"string"}>, but the function expects a string.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
158
    }
159
160
    public function findToken()
0 ignored issues
show
Coding Style introduced by
findToken uses the super-global variable $_SERVER which is generally not recommended.

Instead of super-globals, we recommend to explicitly inject the dependencies of your class. This makes your code less dependent on global state and it becomes generally more testable:

// Bad
class Router
{
    public function generate($path)
    {
        return $_SERVER['HOST'].$path;
    }
}

// Better
class Router
{
    private $host;

    public function __construct($host)
    {
        $this->host = $host;
    }

    public function generate($path)
    {
        return $this->host.$path;
    }
}

class Controller
{
    public function myAction(Request $request)
    {
        // Instead of
        $page = isset($_GET['page']) ? intval($_GET['page']) : 1;

        // Better (assuming you use the Symfony2 request)
        $page = $request->query->get('page', 1);
    }
}
Loading history...
161
    {
162
        return $_SERVER['GITHUB_TOKEN'] ?: $this->readpassword('GitHub token:');
163
    }
164
165
    public function getToken()
166
    {
167
        if ($this->_token === null) {
168
            $this->_token = $this->findToken();
169
        }
170
171
        return $this->_token;
172
    }
173
}
174