|
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) 2014-2016, HiQDev (http://hiqdev.com/) |
|
10
|
|
|
*/ |
|
11
|
|
|
|
|
12
|
|
|
namespace hidev\base; |
|
13
|
|
|
|
|
14
|
|
|
use yii\base\InvalidConfigException; |
|
15
|
|
|
|
|
16
|
|
|
class Binary extends \yii\base\Object |
|
17
|
|
|
{ |
|
18
|
|
|
/** |
|
19
|
|
|
* @var string command name, eg.: phpunit, composer |
|
20
|
|
|
*/ |
|
21
|
|
|
public $name; |
|
22
|
|
|
|
|
23
|
|
|
/** |
|
24
|
|
|
* @var string full path to the binary, eg.: /usr/bin/git |
|
25
|
|
|
*/ |
|
26
|
|
|
protected $_path; |
|
27
|
|
|
|
|
28
|
|
|
/** |
|
29
|
|
|
* @var string full command to run the binary, possibly with added command runner, eg.: /usr/bin/env php /home/user/command.phar |
|
30
|
|
|
*/ |
|
31
|
|
|
protected $_command; |
|
32
|
|
|
|
|
33
|
|
|
/** |
|
34
|
|
|
* Prepares and runs with passthru, returns exit code. |
|
35
|
|
|
* @param string|array $args |
|
36
|
|
|
* @return int exit code |
|
37
|
|
|
*/ |
|
38
|
|
|
public function passthru($args = []) |
|
39
|
|
|
{ |
|
40
|
|
|
// error_log($this->prepareCommand($args)); |
|
|
|
|
|
|
41
|
|
|
passthru($this->prepareCommand($args), $exitcode); |
|
42
|
|
|
|
|
43
|
|
|
return $exitcode; |
|
44
|
|
|
} |
|
45
|
|
|
|
|
46
|
|
|
/** |
|
47
|
|
|
* Prepares and runs with exec, returns stdout array. |
|
48
|
|
|
* @param string|array $args |
|
49
|
|
|
* @return array stdout |
|
50
|
|
|
*/ |
|
51
|
|
|
public function exec($args = []) |
|
52
|
|
|
{ |
|
53
|
|
|
exec($this->prepareCommand($args), $array); |
|
54
|
|
|
|
|
55
|
|
|
return $array; |
|
56
|
|
|
} |
|
57
|
|
|
|
|
58
|
|
|
public function prepareCommand($args) |
|
59
|
|
|
{ |
|
60
|
|
|
return $this->getCommand() . $this->prepareArguments($args); |
|
61
|
|
|
} |
|
62
|
|
|
|
|
63
|
|
|
public function install() |
|
64
|
|
|
{ |
|
65
|
|
|
throw new InvalidConfigException('Don\'t know how to install ' . $this->name); |
|
66
|
|
|
} |
|
67
|
|
|
|
|
68
|
|
|
/** |
|
69
|
|
|
* Setter for path. |
|
70
|
|
|
* @param string $value the path |
|
71
|
|
|
*/ |
|
72
|
|
|
public function setPath($value) |
|
73
|
|
|
{ |
|
74
|
|
|
$this->_path = $value; |
|
75
|
|
|
} |
|
76
|
|
|
|
|
77
|
|
|
/** |
|
78
|
|
|
* Getter for path. |
|
79
|
|
|
* @return string |
|
80
|
|
|
*/ |
|
81
|
|
|
public function getPath() |
|
82
|
|
|
{ |
|
83
|
|
|
if (!$this->_path) { |
|
84
|
|
|
$this->_path = $this->detectPath($this->name); |
|
85
|
|
|
} |
|
86
|
|
|
|
|
87
|
|
|
return $this->_path; |
|
88
|
|
|
} |
|
89
|
|
|
|
|
90
|
|
|
/** |
|
91
|
|
|
* Detects how to run the binary with `which` utility. |
|
92
|
|
|
* @param string $name |
|
93
|
|
|
* @return string path to the binary |
|
94
|
|
|
*/ |
|
95
|
|
|
public function detectPath($name) |
|
96
|
|
|
{ |
|
97
|
|
|
return exec('which ' . $name) ?: null; |
|
98
|
|
|
} |
|
99
|
|
|
|
|
100
|
|
|
/** |
|
101
|
|
|
* Setter for command. |
|
102
|
|
|
* @param string $value the command |
|
103
|
|
|
*/ |
|
104
|
|
|
public function setCommand($value) |
|
105
|
|
|
{ |
|
106
|
|
|
$this->_command = $value; |
|
107
|
|
|
} |
|
108
|
|
|
|
|
109
|
|
|
/** |
|
110
|
|
|
* @return string full command to run the binary |
|
111
|
|
|
*/ |
|
112
|
|
|
public function getCommand() |
|
113
|
|
|
{ |
|
114
|
|
|
if ($this->_command === null) { |
|
115
|
|
|
$this->_command = $this->detectCommand($this->getPath()); |
|
116
|
|
|
} |
|
117
|
|
|
|
|
118
|
|
|
return $this->_command; |
|
119
|
|
|
} |
|
120
|
|
|
|
|
121
|
|
|
/** |
|
122
|
|
|
* Detects command to run the given path, e.g. /usr/bin/env php /the/dir/command.phar. |
|
123
|
|
|
* @return string path to the binary |
|
124
|
|
|
*/ |
|
125
|
|
|
public function detectCommand($path) |
|
126
|
|
|
{ |
|
127
|
|
|
if (!$path) { |
|
128
|
|
|
$this->install(); |
|
129
|
|
|
$path = $this->getPath(); |
|
130
|
|
|
} |
|
131
|
|
|
if (!$path || !file_exists($path)) { |
|
132
|
|
|
throw new InvalidConfigException('Failed to find how to run ' . $this->name); |
|
133
|
|
|
} |
|
134
|
|
|
|
|
135
|
|
|
return $path; |
|
136
|
|
|
} |
|
137
|
|
|
|
|
138
|
|
|
/** |
|
139
|
|
|
* Prepares given command arguments. |
|
140
|
|
|
* @param string|array $args |
|
141
|
|
|
* @return string |
|
142
|
|
|
*/ |
|
143
|
|
|
public function prepareArguments($args) |
|
144
|
|
|
{ |
|
145
|
|
|
if (is_string($args)) { |
|
146
|
|
|
$res = ' ' . trim($args); |
|
147
|
|
|
} else { |
|
148
|
|
|
$res = ''; |
|
149
|
|
|
foreach ($args as $a) { |
|
150
|
|
|
$res .= ' ' . escapeshellarg($a); |
|
151
|
|
|
} |
|
152
|
|
|
} |
|
153
|
|
|
|
|
154
|
|
|
return $res; |
|
155
|
|
|
} |
|
156
|
|
|
} |
|
157
|
|
|
|
Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.
The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.
This check looks for comments that seem to be mostly valid code and reports them.