Completed
Pull Request — master (#112)
by Pieter
04:24 queued 01:13
created

GitProcess::run()   B

Complexity

Conditions 5
Paths 13

Size

Total Lines 36
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 18
CRAP Score 5.025

Importance

Changes 2
Bugs 2 Features 1
Metric Value
c 2
b 2
f 1
dl 0
loc 36
ccs 18
cts 20
cp 0.9
rs 8.439
cc 5
eloc 19
nc 13
nop 1
crap 5.025
1
<?php
2
3
namespace GitWrapper;
4
5
use Symfony\Component\Process\Process;
6
use Symfony\Component\Process\ProcessUtils;
7
8
/**
9
 * GitProcess runs a Git command in an independent process.
10
 */
11
class GitProcess extends Process
12
{
13
    /**
14
     * @var \GitWrapper\GitWrapper
15
     */
16
    protected $git;
17
18
    /**
19
     * @var \GitWrapper\GitCommand
20
     */
21
    protected $command;
22
23
    /**
24
     * Constructs a GitProcess object.
25
     *
26
     * @param \GitWrapper\GitWrapper $git
27
     * @param \GitWrapper\GitCommand $command
28
     * @param string|null $cwd
29
     */
30 88
    public function __construct(GitWrapper $git, GitCommand $command, $cwd = null)
31
    {
32 88
        $this->git = $git;
33 88
        $this->command = $command;
34
35
        // Build the command line options, flags, and arguments.
36 88
        $binary = ProcessUtils::escapeArgument($git->getGitBinary());
37 88
        $commandLine = rtrim($binary . ' ' . $command->getCommandLine());
38
39
        // Resolve the working directory of the Git process. Use the directory
40
        // in the command object if it exists.
41 88
        if (null === $cwd) {
42 88
            if (null !== $directory = $command->getDirectory()) {
43 56
                if (!$cwd = realpath($directory)) {
44 4
                    throw new GitException('Path to working directory could not be resolved: ' . $directory);
45
                }
46 52
            }
47 84
        }
48
49
        // Finalize the environment variables, an empty array is converted
50
        // to null which enherits the environment of the PHP process.
51 84
        $env = $git->getEnvVars();
52 84
        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...
53 84
            $env = null;
54 84
        }
55
56 84
        parent::__construct($commandLine, $cwd, $env, null, $git->getTimeout(), $git->getProcOptions());
57 84
    }
58
59
    /**
60
     * {@inheritdoc}
61
     */
62 84
    public function run($callback = null)
63
    {
64 84
        $event = new Event\GitEvent($this->git, $this, $this->command);
65 84
        $dispatcher = $this->git->getDispatcher();
66
67
        try {
68
69
            // Throw the "git.command.prepare" event prior to executing.
70 84
            $dispatcher->dispatch(Event\GitEvents::GIT_PREPARE, $event);
71
72
            // Execute command if it is not flagged to be bypassed and throw the
73
            // "git.command.success" event, otherwise do not execute the comamnd
74
            // and throw the "git.command.bypass" event.
75 84
            if ($this->command->notBypassed()) {
76 72
                parent::run($callback);
77
78 72
                if ($this->isSuccessful()) {
79 64
                    $dispatcher->dispatch(Event\GitEvents::GIT_SUCCESS, $event);
80 64
                } else {
81 56
                    $output = $this->getErrorOutput();
82
83 56
                    if(trim($output) == '') {
84
                        $output = $this->getOutput();
85
                    }
86
87 56
                    throw new \RuntimeException($output);
88
                }
89 64
            } else {
90 12
                $dispatcher->dispatch(Event\GitEvents::GIT_BYPASS, $event);
91
            }
92
93 84
        } catch (\RuntimeException $e) {
94 56
            $dispatcher->dispatch(Event\GitEvents::GIT_ERROR, $event);
95 56
            throw new GitException($e->getMessage());
96
        }
97 76
    }
98
}
99