Completed
Push — master ( cee00e...0bc9c5 )
by Tomáš
9s
created

GitProcess::start()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 10
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 10
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 6
nc 2
nop 2
1
<?php declare(strict_types=1);
2
3
namespace GitWrapper;
4
5
use GitWrapper\Event\GitEvent;
6
use GitWrapper\Event\GitEvents;
7
use RuntimeException;
8
use Symfony\Component\Process\Process;
9
10
final class GitProcess extends Process
11
{
12
    /**
13
     * @var GitWrapper
14
     */
15
    protected $gitWrapper;
16
17
    /**
18
     * @var GitCommand
19
     */
20
    protected $gitCommand;
21
22
    public function __construct(GitWrapper $gitWrapper, GitCommand $gitCommand, ?string $cwd = null)
23
    {
24
        $this->gitWrapper = $gitWrapper;
25
        $this->gitCommand = $gitCommand;
26
27
        // Build the command line options, flags, and arguments.
28
        $gitCommandLine = $gitCommand->getCommandLine();
29
        $commandLine = array_merge([$gitWrapper->getGitBinary()], (array) $gitCommandLine);
30
31
        // Support for executing an arbitrary git command.
32
        if (is_string($gitCommandLine)) {
33
            $commandLine = implode(' ', $commandLine);
34
        }
35
36
        // Resolve the working directory of the Git process. Use the directory
37
        // in the command object if it exists.
38
        if ($cwd === null) {
39
            $directory = $gitCommand->getDirectory();
40
            if ($directory !== null) {
41
                if (! $cwd = realpath($directory)) {
42
                    throw new GitException('Path to working directory could not be resolved: ' . $directory);
43
                }
44
            }
45
        }
46
47
        // Finalize the environment variables, an empty array is converted
48
        // to null which enherits the environment of the PHP process.
49
        $env = $gitWrapper->getEnvVars();
50
        if (! $env) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $env of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
51
            $env = null;
52
        }
53
54
        parent::__construct($commandLine, $cwd, $env, null, (float) $gitWrapper->getTimeout());
55
    }
56
57
    /**
58
     * {@inheritdoc}
59
     */
60
    public function start(?callable $callback = null, array $env = []): void
61
    {
62
        $this->dispatchGitEvent(GitEvents::GIT_PREPARE);
63
64
        if ($this->gitCommand->notBypassed()) {
65
            parent::start($callback, $env);
66
        } else {
67
            $this->dispatchGitEvent(GitEvents::GIT_BYPASS);
68
        }
69
    }
70
71
    public function wait(?callable $callback = null): int
72
    {
73
        if (! $this->gitCommand->notBypassed()) {
74
            return -1;
75
        }
76
77
        try {
78
            $exitCode = parent::wait($callback);
79
80
            if ($this->isSuccessful()) {
81
                $this->dispatchGitEvent(GitEvents::GIT_SUCCESS);
82
            } else {
83
                $output = $this->getErrorOutput();
84
85
                if (trim($output) === '') {
86
                    $output = $this->getOutput();
87
                }
88
89
                throw new GitException($output);
90
            }
91
        } catch (RuntimeException $runtimeException) {
92
            $this->dispatchGitEvent(GitEvents::GIT_ERROR);
93
            throw new GitException($runtimeException->getMessage(), $runtimeException->getCode(), $runtimeException);
94
        }
95
96
        return $exitCode;
97
    }
98
99
    private function dispatchGitEvent(string $eventName): void
100
    {
101
        $this->gitWrapper->getDispatcher()->dispatch(
102
            $eventName,
103
            new GitEvent($this->gitWrapper, $this, $this->gitCommand)
104
        );
105
    }
106
}
107