Completed
Push — develop ( 3c6b2e...cb8cbd )
by
unknown
02:27
created

Caller   A

Complexity

Total Complexity 20

Size/Duplication

Total Lines 202
Duplicated Lines 0 %

Coupling/Cohesion

Components 2
Dependencies 3

Test Coverage

Coverage 76%

Importance

Changes 0
Metric Value
wmc 20
lcom 2
cbo 3
dl 0
loc 202
ccs 38
cts 50
cp 0.76
rs 10
c 0
b 0
f 0

9 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 10 2
A getBinaryPath() 0 4 1
A execute() 0 29 5
A getOutput() 0 4 1
A getOutputLines() 0 15 4
A getRawOutput() 0 4 1
A getErrorOutput() 0 4 1
A getErrorLines() 0 15 4
A getRawErrorOutput() 0 4 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 105
    public function __construct(GitBinary $binary, $repositoryPath)
82
    {
83 105
        $this->binary         = $binary;
84
85 105
        if (!is_dir($repositoryPath)) {
86 1
            throw new InvalidRepositoryPathException($repositoryPath);
87
        }
88
89 105
        $this->repositoryPath = $repositoryPath;
90 105
    }
91
92
    /**
93
     * Get the binary path
94
     *
95
     * @return mixed
96
     */
97 1
    public function getBinaryPath()
98
    {
99 1
        return $this->binary->getPath();
100
    }
101
102
    /**
103
     * Executes a command
104
     *
105
     * @param string $cmd               the command to execute
106
     * @param bool   $git               if the command is git or a generic command
107
     * @param null   $cwd               the directory where the command must be executed
108
     * @param array  $acceptedExitCodes exit codes accepted to consider the command execution successful
109
     *
110
     * @throws \RuntimeException
111
     * @throws \Symfony\Component\Process\Exception\InvalidArgumentException
112
     * @throws \Symfony\Component\Process\Exception\ProcessTimedOutException
113
     * @throws \Symfony\Component\Process\Exception\RuntimeException
114
     * @throws \Symfony\Component\Process\Exception\LogicException
115
     * @return Caller
116
     */
117 99
    public function execute($cmd, $git = true, $cwd = null, $acceptedExitCodes = array(0))
118
    {
119 99
        if ($git) {
120 99
            $cmd = $this->binary->getPath() . ' ' . $cmd;
121
        }
122
123 99
        if (stripos(PHP_OS, 'WIN') !== 0) {
124
            // We rely on the C locale in all output we parse.
125 99
            $cmd = 'LC_ALL=C ' . $cmd;
126
        }
127
128 99
        $process = new Process($cmd, is_null($cwd) ? $this->repositoryPath : $cwd);
129 99
        $process->setTimeout(15000);
130 99
        $process->run();
131 99
        if (!in_array($process->getExitCode(), $acceptedExitCodes)) {
132 1
            $text = 'Exit code: ' . $process->getExitCode();
133 1
            $text .= ' while executing: "' . $cmd;
134 1
            $text .= '" with reason: ' . $process->getErrorOutput();
135 1
            $text .= "\n" . $process->getOutput();
136 1
            throw new \RuntimeException($text);
137
        }
138 98
        $this->rawOutput = $process->getOutput();
139
140
        // rtrim values
141 98
        $values = array_map('rtrim', explode(PHP_EOL, $process->getOutput()));
142 98
        $this->outputLines = $values;
143
144 98
        return $this;
145
    }
146
147
    /**
148
     * returns the output of the last executed command
149
     *
150
     * @return string
151
     */
152 2
    public function getOutput()
153
    {
154 2
        return implode("\n", $this->outputLines);
155
    }
156
157
    /**
158
     * returns the output of the last executed command as an array of lines
159
     *
160
     * @param bool $stripBlankLines remove the blank lines
161
     *
162
     * @return array
163
     */
164 91
    public function getOutputLines($stripBlankLines = false)
165
    {
166 91
        if ($stripBlankLines) {
167 81
            $output = array();
168 81
            foreach ($this->outputLines as $line) {
169 81
                if ('' !== $line) {
170 81
                    $output[] = $line;
171
                }
172
            }
173
174 81
            return $output;
175
        }
176
177 45
        return $this->outputLines;
178
    }
179
180
    /**
181
     * Get RawOutput
182
     *
183
     * @return string
184
     */
185 1
    public function getRawOutput()
186
    {
187 1
        return $this->rawOutput;
188
    }
189
190
    /**
191
     * returns the error output of the last executed command
192
     *
193
     * @return string
194
     */
195
    public function getErrorOutput()
196
    {
197
        return implode("\n", $this->errorLines);
198
    }
199
200
    /**
201
     * returns the error output of the last executed command as an array of lines
202
     *
203
     * @param bool $stripBlankLines remove the blank lines
204
     *
205
     * @return array
206
     */
207
    public function getErrorLines($stripBlankLines = false)
208
    {
209
        if ($stripBlankLines) {
210
            $output = array();
211
            foreach ($this->errorLines as $line) {
212
                if ('' !== $line) {
213
                    $output[] = $line;
214
                }
215
            }
216
217
            return $output;
218
        }
219
220
        return $this->errorLines;
221
    }
222
223
    /**
224
     * Get RawErrorOutput
225
     *
226
     * @return string
227
     */
228
    public function getRawErrorOutput()
229
    {
230
        return $this->rawErrorOutput;
231
    }
232
}
233