Completed
Pull Request — develop (#147)
by
unknown
02:05
created

Caller::getBinaryVersion()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 2
cts 2
cp 1
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 0
crap 1
1
<?php
2
/**
3
 * GitElephant - An abstraction layer for git written in PHP
4
 * Copyright (C) 2013  Matteo Giachino
5
 *
6
 * This program is free software: you can redistribute it and/or modify
7
 * it under the terms of the GNU General Public License as published by
8
 * the Free Software Foundation, either version 3 of the License, or
9
 * (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program.  If not, see [http://www.gnu.org/licenses/].
18
 */
19
20
namespace GitElephant\Command\Caller;
21
22
use GitElephant\Exception\InvalidRepositoryPathException;
23
use \GitElephant\GitBinary;
24
use \Symfony\Component\Process\Process;
25
26
/**
27
 * Caller
28
 *
29
 * @author Matteo Giachino <[email protected]>
30
 */
31
class Caller implements CallerInterface
32
{
33
    /**
34
     * GitBinary instance
35
     *
36
     * @var \GitElephant\GitBinary
37
     */
38
    private $binary;
39
40
    /**
41
     * the repository path
42
     *
43
     * @var string
44
     */
45
    private $repositoryPath;
46
47
    /**
48
     * the output lines of the command
49
     *
50
     * @var array
51
     */
52
    private $outputLines = array();
53
54
    /**
55
     * raw output
56
     *
57
     * @var string
58
     */
59
    private $rawOutput;
60
61
    /**
62
     * the output lines of the command
63
     *
64
     * @var array
65
     */
66
    private $errorLines = array();
67
68
    /**
69
     * raw output
70
     *
71
     * @var string
72
     */
73
    private $rawErrorOutput;
74
75
    /**
76
     * Class constructor
77
     *
78
     * @param \GitElephant\GitBinary $binary         the binary
79
     * @param string                 $repositoryPath the physical base path for the repository
80
     */
81 107
    public function __construct(GitBinary $binary, $repositoryPath)
82
    {
83 107
        $this->binary         = $binary;
84
85 107
        if (!is_dir($repositoryPath)) {
86 1
            throw new InvalidRepositoryPathException($repositoryPath);
87
        }
88
89 107
        $this->repositoryPath = $repositoryPath;
90 107
    }
91
92
    /**
93
     * @inheritdoc
94
     */
95 1
    public function getBinaryPath()
96
    {
97 1
        return $this->binary->getPath();
98
    }
99
100
    /**
101
     * @inheritdoc
102
     */
103 96
    public function getBinaryVersion()
104
    {
105 96
        return $this->binary->getVersion();
106
    }
107
108
    /**
109
     * Executes a command
110
     *
111
     * @param string $cmd               the command to execute
112
     * @param bool   $git               if the command is git or a generic command
113
     * @param null   $cwd               the directory where the command must be executed
114
     * @param array  $acceptedExitCodes exit codes accepted to consider the command execution successful
115
     *
116
     * @throws \RuntimeException
117
     * @throws \Symfony\Component\Process\Exception\InvalidArgumentException
118
     * @throws \Symfony\Component\Process\Exception\ProcessTimedOutException
119
     * @throws \Symfony\Component\Process\Exception\RuntimeException
120
     * @throws \Symfony\Component\Process\Exception\LogicException
121
     * @return Caller
122
     */
123 99
    public function execute($cmd, $git = true, $cwd = null, $acceptedExitCodes = array(0))
124
    {
125 99
        if ($git) {
126 99
            $cmd = $this->binary->getPath() . ' ' . $cmd;
127
        }
128
129 99
        if (stripos(PHP_OS, 'WIN') !== 0) {
130
            // We rely on the C locale in all output we parse.
131 99
            $cmd = 'LC_ALL=C ' . $cmd;
132
        }
133
134 99
        $process = new Process($cmd, is_null($cwd) ? $this->repositoryPath : $cwd);
135 99
        $process->setTimeout(15000);
136 99
        $process->run();
137 99
        if (!in_array($process->getExitCode(), $acceptedExitCodes)) {
138 1
            $text = 'Exit code: ' . $process->getExitCode();
139 1
            $text .= ' while executing: "' . $cmd;
140 1
            $text .= '" with reason: ' . $process->getErrorOutput();
141 1
            $text .= "\n" . $process->getOutput();
142 1
            throw new \RuntimeException($text);
143
        }
144 98
        $this->rawOutput = $process->getOutput();
145
146
        // rtrim values
147 98
        $values = array_map('rtrim', explode(PHP_EOL, $process->getOutput()));
148 98
        $this->outputLines = $values;
149
150 98
        return $this;
151
    }
152
153
    /**
154
     * returns the output of the last executed command
155
     *
156
     * @return string
157
     */
158 2
    public function getOutput()
159
    {
160 2
        return implode("\n", $this->outputLines);
161
    }
162
163
    /**
164
     * returns the output of the last executed command as an array of lines
165
     *
166
     * @param bool $stripBlankLines remove the blank lines
167
     *
168
     * @return array
169
     */
170 91
    public function getOutputLines($stripBlankLines = false)
171
    {
172 91
        if ($stripBlankLines) {
173 81
            $output = array();
174 81
            foreach ($this->outputLines as $line) {
175 81
                if ('' !== $line) {
176 81
                    $output[] = $line;
177
                }
178
            }
179
180 81
            return $output;
181
        }
182
183 45
        return $this->outputLines;
184
    }
185
186
    /**
187
     * Get RawOutput
188
     *
189
     * @return string
190
     */
191 1
    public function getRawOutput()
192
    {
193 1
        return $this->rawOutput;
194
    }
195
196
    /**
197
     * returns the error output of the last executed command
198
     *
199
     * @return string
200
     */
201
    public function getErrorOutput()
202
    {
203
        return implode("\n", $this->errorLines);
204
    }
205
206
    /**
207
     * returns the error output of the last executed command as an array of lines
208
     *
209
     * @param bool $stripBlankLines remove the blank lines
210
     *
211
     * @return array
212
     */
213
    public function getErrorLines($stripBlankLines = false)
214
    {
215
        if ($stripBlankLines) {
216
            $output = array();
217
            foreach ($this->errorLines as $line) {
218
                if ('' !== $line) {
219
                    $output[] = $line;
220
                }
221
            }
222
223
            return $output;
224
        }
225
226
        return $this->errorLines;
227
    }
228
229
    /**
230
     * Get RawErrorOutput
231
     *
232
     * @return string
233
     */
234
    public function getRawErrorOutput()
235
    {
236
        return $this->rawErrorOutput;
237
    }
238
}
239