Passed
Push — master ( 88d9d6...ec4c8d )
by Tom
04:42
created

Proc::setStatus()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 1
dl 0
loc 3
ccs 2
cts 2
cp 1
crap 1
rs 10
1
<?php
2
3
/* this file is part of pipelines */
4
5
namespace Ktomk\Pipelines\Cli;
6
use RuntimeException;
7
8
/**
9
 * Run command non-interactively and capture standard output and error
10
 */
11
class Proc
12
{
13
    /**
14
     * @var string
15
     */
16
    private $command;
17
18
    /**
19
     * @var null|int
20
     */
21
    private $status;
22
23
    /**
24
     * @var null|string[]
25
     */
26
    private $buffers;
27
28
    /**
29
     * Proc constructor.
30
     *
31
     * @param string $command
32
     */
33 5
    public function __construct($command)
34
    {
35 5
        $this->command = $command;
36 5
    }
37
38
    /**
39
     * @throws RuntimeException
40
     *
41
     * @return int
42
     */
43 3
    public function run()
44
    {
45 3
        $command = $this->command;
46
47
        # do nothing placeholder
48 3
        if (':' === $command) {
49 2
            $this->buffers['stdout'] = $this->buffers['stderr'] = '';
50
51 2
            return $this->status = 0;
52
        }
53
54
        $descriptors = array(
55 1
            0 => array('file', '/dev/null', 'r'), // non-interactive running
56
            1 => array('pipe', 'w'),
57
            2 => array('pipe', 'w'),
58
        );
59
60 1
        $process = proc_open($command, $descriptors, $pipes);
61 1
        if (!is_resource($process)) {
62
            throw new RuntimeException(sprintf('Failed to open: %s', $command)); // @codeCoverageIgnore
63
        }
64
65 1
        $this->buffers['stdout'] = stream_get_contents($pipes[1]);
66 1
        $this->buffers['stderr'] = stream_get_contents($pipes[2]);
67
68
        # consume pipes
69 1
        foreach ($descriptors as $number => $descriptor) {
70 1
            if ('pipe' === $descriptor[0]) {
71 1
                $result = fclose($pipes[$number]);
72 1
                unset($result); # intentionally ignore errors (fail safe)
73
            }
74
        }
75
76 1
        $status = proc_close($process);
77
78 1
        return $this->status = $status;
79
    }
80
81
    /**
82
     * @return null|int exit status, null if not yet executed
83
     */
84 2
    public function getStatus()
85
    {
86 2
        return $this->status;
87
    }
88
89
    /**
90
     * @return string
91
     */
92 1
    public function getStandardOutput()
93
    {
94 1
        return $this->buffers ? $this->buffers['stdout'] : '';
95
    }
96
97
    /**
98
     * @return string
99
     */
100 1
    public function getStandardError()
101
    {
102 1
        return $this->buffers ? $this->buffers['stderr'] : '';
103
    }
104
105
    /**
106
     * @param null|int $status
107
     *
108
     * @return void
109
     */
110 1
    public function setStatus($status)
111
    {
112 1
        $this->status = $status;
113 1
    }
114
}
115