ExecutableFinder::which()   A
last analyzed

Complexity

Conditions 3
Paths 4

Size

Total Lines 11
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
eloc 7
c 1
b 0
f 0
nc 4
nop 1
dl 0
loc 11
ccs 0
cts 9
cp 0
crap 12
rs 10
1
<?php
2
3
4
namespace Deployee\Plugins\ShellTasks\Helper;
5
6
7
use Phizzl\PhpShellCommand\ShellCommand;
8
9
class ExecutableFinder
10
{
11
    /**
12
     * @var array
13
     */
14
    private $aliases;
15
16
    /**
17
     * @param array $aliases
18
     */
19
    public function __construct(array $aliases = [])
20
    {
21
        $this->aliases = $aliases;
22
    }
23
24
    /**
25
     * @param string $name
26
     * @return string
27
     */
28
    public function find(string $name): string
29
    {
30
        $return = $name;
31
        if(isset($this->aliases[$name])){
32
            $return = $this->aliases[$name];
33
        }
34
        elseif(trim($name) !== ''
35
            && ($path = $this->which($name))){
36
            $return = $path;
37
        }
38
39
        return $return;
40
    }
41
42
    /**
43
     * Usage:
44
     * ExecutableFinderService::addAlias('mysqldump', '/usr/local/mysql5/bin/mysqldump')
45
     *
46
     * @param string $alias
47
     * @param string $resolved
48
     */
49
    public function addAlias($alias, $resolved)
50
    {
51
        $this->aliases[$alias] = $resolved;
52
    }
53
54
    /**
55
     * @param string $name
56
     * @return string
57
     */
58
    private function which(string $name): string
59
    {
60
        $isOsWin = stripos(PHP_OS, 'WIN') === 0;
61
62
        $which = $isOsWin ? 'where' : 'which';
63
        $cmd = new ShellCommand(sprintf('%s %s', $which, escapeshellarg($name)), null);
64
        $result = $cmd->run();
65
66
        return $result->getExitCode() > 0
67
            ? ''
68
            : trim(current(explode(PHP_EOL, $result->getOutput())));
69
    }
70
}