Completed
Push — master ( f493e8...60bb4c )
by Andrii
03:26
created

Binary::prepareCommand()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 4
rs 10
cc 1
eloc 2
nc 1
nop 1
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));
0 ignored issues
show
Unused Code Comprehensibility introduced by
73% of this comment could be valid code. Did you maybe forget this after debugging?

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.

Loading history...
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