GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Completed
Push — master ( c5752c...f61021 )
by
unknown
04:58
created

Package::__get()   D

Complexity

Conditions 9
Paths 9

Size

Total Lines 25
Code Lines 21

Duplication

Lines 0
Ratio 0 %

Importance

Changes 4
Bugs 0 Features 1
Metric Value
cc 9
eloc 21
c 4
b 0
f 1
nc 9
nop 1
dl 0
loc 25
rs 4.909
1
<?php
2
/**
3
 * See class comment
4
 *
5
 * PHP Version 5
6
 *
7
 * @category Netresearch
8
 * @package  Netresearch\Kite\Service\Composer
9
 * @author   Christian Opitz <[email protected]>
10
 * @license  http://www.netresearch.de Netresearch Copyright
11
 * @link     http://www.netresearch.de
12
 */
13
14
namespace Netresearch\Kite\Service\Composer;
15
use Netresearch\Kite\Exception;
16
use Netresearch\Kite\Service\Composer;
17
18
/**
19
 * Class Package
20
 *
21
 * // Composer properties, not necessarily present:
22
 *
23
 * @property string      $name      Package name
24
 * @property string      $version   Package version
25
 * @property object      $source    Information about the source
26
 *                                  (may have f.i. "reference")
27
 *
28
 * // Additional properties
29
 *
30
 * @property string      $path      Package path
31
 * @property bool        $isRoot    Whether package is root (project)
32
 * @property array       $requires  The packages from $require as array
33
 * @property bool        $git       Whether installed package is a get repository
34
 * @property array       $branches  Git branches (including remote branches)
35
 * @property array       $upstreams Upstream branches (values) for local branches (keys)
36
 * @property string|null $branch    The currently checked out branch, if any
37
 *                                  If package is on a tag this will always be null
38
 * @property string|null $tag       The currently checked out tag, if any
39
 * @property string|null $remote    The remote url (no multiple urls supported)
40
 *
41
 *
42
 * @category Netresearch
43
 * @package  Netresearch\Kite\Service\Composer
44
 * @author   Christian Opitz <[email protected]>
45
 * @license  http://www.netresearch.de Netresearch Copyright
46
 * @link     http://www.netresearch.de
47
 */
48
class Package
49
{
50
    /**
51
     * @var Composer
52
     */
53
    protected $composer;
54
55
    /**
56
     * @var bool
57
     */
58
    protected static $forEachRefHeadSupported = true;
59
60
    /**
61
     * Package constructor.
62
     *
63
     * @param Composer      $composer     The parent object
64
     * @param string|object $composerJson The composer json
65
     * @param bool          $isRoot       Whether package is root
66
     */
67
    public function __construct(Composer $composer, $composerJson, $isRoot = false)
68
    {
69
        $this->composer = $composer;
70
71
        if (is_string($composerJson)) {
72
            $path = realpath($composerJson);
73
            if (!$path) {
74
                throw new Exception('Could not find ' . $composerJson);
75
            }
76
            $this->path = dirname($path);
77
            $composerJson = json_decode(file_get_contents($path));
78
            if (!is_object($composerJson)) {
79
                throw new Exception('Could not load ' . $path);
80
            }
81
        }
82
        foreach (get_object_vars($composerJson) as $key => $value) {
83
            $this->$key = $value;
84
        }
85
86
        $this->isRoot = $isRoot;
87
    }
88
89
    /**
90
     * Load lazy properties
91
     *
92
     * @param string $name The property name
93
     *
94
     * @return mixed
95
     */
96
    public function __get($name)
97
    {
98
        switch ($name) {
99
        case 'git':
100
            $gitDir = $this->path . '/.git';
101
            $this->git = file_exists($gitDir) && is_dir($gitDir);
102
            break;
103
        case 'branches':
104
        case 'upstreams':
105
        case 'branch':
106
        case 'tag':
107
            $this->loadGitInformation();
108
            break;
109
        case 'remote':
110
            $this->loadRemote();
111
            break;
112
        case 'requires':
113
            $this->loadRequires();
114
            break;
115
        default:
116
            throw new Exception('Invalid property ' . $name);
117
118
        }
119
        return $this->$name;
120
    }
121
122
    /**
123
     * Mark lazy properties as present
124
     *
125
     * @param string $name The name
126
     *
127
     * @return bool
128
     */
129
    public function __isset($name)
130
    {
131
        return in_array($name, ['branches', 'upstreams', 'branch', 'tag', 'git', 'remote', 'requires'], true);
132
    }
133
134
    /**
135
     * Load the requires - removes inline aliases
136
     *
137
     * @return void
138
     */
139
    protected function loadRequires()
140
    {
141
        $this->requires = isset($this->require) ? get_object_vars($this->require) : array();
0 ignored issues
show
Bug introduced by
The property require does not seem to exist. Did you mean requires?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
142
        foreach ($this->requires as $package => $constraint) {
143
            if ($pos = strpos($constraint, ' as ')) {
144
                if ($hashPos = strpos($constraint, '#')) {
145
                    // dev-master#old-hash isn't treated by composer, so we don't as well
146
                    $pos = $hashPos;
147
                }
148
                $this->requires[$package] = substr($constraint, 0, $pos);
149
            }
150
        }
151
    }
152
153
    /**
154
     * Reload requires from composer.json
155
     *
156
     * @return $this
157
     */
158
    public function reloadRequires()
159
    {
160
        $file = $this->path . '/composer.json';
161
        if (file_exists($file)) {
162
            $composerJson = json_decode(file_get_contents($file));
163
            unset($this->require);
164
            if (isset($composerJson->require)) {
165
                $this->require = $composerJson->require;
0 ignored issues
show
Bug introduced by
The property require does not seem to exist. Did you mean requires?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
166
            }
167
            $this->loadRequires();
168
        }
169
        return $this;
170
    }
171
172
    /**
173
     * Get the remote
174
     *
175
     * @return void
176
     */
177
    protected function loadRemote()
178
    {
179
        $this->remote = null;
180
        if ($this->git) {
181
            $remote = null;
182
            $remotesString = $this->composer->git('remote', $this->path, ['verbose' => true]);
183
            $lines = explode("\n", trim($remotesString));
184
            foreach ($lines as $line) {
185
                preg_match('/^([^\s]+)\s+(.+) \((fetch|push)\)$/', $line, $match);
186
                array_shift($match);
187
                list($name, $url) = $match;
0 ignored issues
show
Unused Code introduced by
The assignment to $name is unused. Consider omitting it like so list($first,,$third).

This checks looks for assignemnts to variables using the list(...) function, where not all assigned variables are subsequently used.

Consider the following code example.

<?php

function returnThreeValues() {
    return array('a', 'b', 'c');
}

list($a, $b, $c) = returnThreeValues();

print $a . " - " . $c;

Only the variables $a and $c are used. There was no need to assign $b.

Instead, the list call could have been.

list($a,, $c) = returnThreeValues();
Loading history...
188
                if ($remote && $remote !== $url) {
189
                    $this->composer->output("<warning>Can not handle multiple remote urls - using $remote</warning>");
190
                    break;
191
                } else {
192
                    $remote = $url;
193
                }
194
            }
195
            $this->remote = $remote;
196
        }
197
    }
198
199
    /**
200
     * Load 'branches', 'upstreams', 'branch', 'tag', 'git'
201
     *
202
     * @throws Exception\ProcessFailedException
203
     *
204
     * @return void
205
     */
206
    protected function loadGitInformation()
207
    {
208
        $this->branches = array();
209
        $this->upstreams = array();
210
        $this->branch = null;
211
        $this->tag = null;
212
        if ($this->git) {
213
            $this->composer->git('fetch', $this->path, array('p' => true, 'origin'));
214
            try {
215
                $format = (self::$forEachRefHeadSupported ? '%(HEAD)' : '') . '|%(refname:short)|%(upstream:short)';
216
                $gitBr = $this->composer->git('for-each-ref', $this->path, ['format' => $format, 'refs/heads/', 'refs/remotes/origin']);
217
            } catch (Exception\ProcessFailedException $e) {
218
                if (trim($e->getProcess()->getErrorOutput()) === 'fatal: unknown field name: HEAD') {
219
                    self::$forEachRefHeadSupported = false;
220
                    $this->loadGitInformation();
221
                    return;
222
                } else {
223
                    throw $e;
224
                }
225
            }
226
            if (!self::$forEachRefHeadSupported && !($this->tag = $this->getTag())) {
227
                $this->branch = $this->composer->git('rev-parse', $this->path, ['abbrev-ref' => true, 'HEAD']) ?: null;
228
            }
229
            foreach (explode("\n", trim($gitBr)) as $line) {
230
                list($head, $branch, $upstream) = explode('|', $line);
231
                if ($branch === 'origin/HEAD') {
232
                    continue;
233
                }
234
                $this->branches[] = $branch;
235
                if ($head === '*') {
236
                    $this->branch = $branch;
237
                }
238
                if ($upstream) {
239
                    $this->upstreams[$branch] = $upstream;
240
                }
241
            }
242
            if (self::$forEachRefHeadSupported && !$this->branch) {
243
                $this->tag = $this->getTag();
244
            }
245
        }
246
    }
247
248
    /**
249
     * Get  the currently checked out tag
250
     *
251
     * @return string|null
252
     */
253
    protected function getTag()
254
    {
255
        try {
256
            return trim($this->composer->git('describe', $this->path, array('exact-match' => true, 'tags' => true)));
257
        } catch (Exception\ProcessFailedException $e) {
258
            return null;
259
        }
260
261
    }
262
}
263
264
?>
265