Passed
Push — test ( 828863...b61927 )
by Tom
02:29
created

Runner::createEx()   A

Complexity

Conditions 4
Paths 8

Size

Total Lines 14
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 4

Importance

Changes 0
Metric Value
cc 4
eloc 4
c 0
b 0
f 0
nc 8
nop 6
dl 0
loc 14
ccs 5
cts 5
cp 1
crap 4
rs 10
1
<?php
2
3
/* this file is part of pipelines */
4
5
namespace Ktomk\Pipelines\Runner;
6
7
use Ktomk\Pipelines\Cli\Exec;
8
use Ktomk\Pipelines\Cli\Streams;
9
use Ktomk\Pipelines\File\Pipeline;
10
use Ktomk\Pipelines\File\Step;
11
12
/**
13
 * Pipeline runner with docker under the hood
14
 */
15
class Runner
16
{
17
    const STATUS_NO_STEPS = 1;
18
    const STATUS_RECURSION_DETECTED = 127;
19
20
    /**
21
     * @var string
22
     */
23
    private $prefix;
24
25
    /**
26
     * @var Directories
27
     */
28
    private $directories;
29
30
    /**
31
     * @var Exec
32
     */
33
    private $exec;
34
35
    /**
36
     * @var Flags
37
     */
38
    private $flags;
39
40
    /**
41
     * @var Env
42
     */
43
    private $env;
44
    /**
45
     * @var Streams
46
     */
47
    private $streams;
48
49
    /**
50
     * Static factory method.
51
     *
52
     * The "ex" version of runner creation, moving creation out of the ctor itself.
53
     *
54
     * @param string $prefix
55
     * @param Directories $directories source repository root directory based directories object
56
     * @param Exec $exec
57
     * @param Flags $flags [optional]
58
     * @param Env $env [optional]
59
     * @param Streams $streams [optional]
60
     * @return Runner
61
     */
62 1
    public static function createEx(
63
        $prefix,
64
        Directories $directories,
65
        Exec $exec,
66
        Flags $flags = null,
67
        Env $env = null,
68
        Streams $streams = null
69
    )
70
    {
71 1
        $flags = null === $flags ? new Flags() : $flags;
72 1
        $env = null === $env ? Env::create() : $env;
73 1
        $streams = null === $streams ? Streams::create() : $streams;
74
75 1
        return new self($prefix, $directories, $exec, $flags, $env, $streams);
76
    }
77
78
    /**
79
     * Runner constructor.
80
     *
81
     * @param string $prefix
82
     * @param Directories $directories source repository root directory based directories object
83
     * @param Exec $exec
84
     * @param Flags $flags
85
     * @param Env $env
86
     * @param Streams $streams
87
     */
88 6
    public function __construct(
89
        $prefix,
90
        Directories $directories,
91
        Exec $exec,
92
        Flags $flags,
93
        Env $env,
94
        Streams $streams
95
    )
96
    {
97 6
        $this->prefix = $prefix;
98 6
        $this->directories = $directories;
99 6
        $this->exec = $exec;
100 6
        $this->flags = $flags;
101 6
        $this->env = $env;
102 6
        $this->streams = $streams;
103 6
    }
104
105
    /**
106
     * @param Pipeline $pipeline
107
     * @throws \RuntimeException
108
     * @return int status (as in exit status, 0 OK, !0 NOK)
109
     */
110 4
    public function run(Pipeline $pipeline)
111
    {
112 4
        $hasId = $this->env->setPipelinesId($pipeline->getId()); # TODO give Env an addPipeline() method (compare addReference)
113 4
        if ($hasId) {
114 1
            $this->streams->err(sprintf(
115 1
                "pipelines: won't start pipeline '%s'; pipeline inside pipelines recursion detected\n",
116 1
                $pipeline->getId()
117
            ));
118
119 1
            return self::STATUS_RECURSION_DETECTED;
120
        }
121
122 3
        foreach ($pipeline->getSteps() as $step) {
123 2
            $status = $this->runStep($step);
124 2
            if (0 !== $status) {
125 1
                return $status;
126
            }
127
        }
128
129 2
        if (!isset($status)) {
130 1
            $this->streams->err("pipelines: pipeline with no step to execute\n");
131
132 1
            return self::STATUS_NO_STEPS;
133
        }
134
135 1
        return $status;
136
    }
137
138
    /**
139
     * @param Step $step
140
     * @return int status (as in exit status, 0 OK, !0 NOK)
141
     */
142 1
    public function runStep(Step $step) {
143 1
        $stepRunner = new StepRunner(
144 1
            $this->prefix,
145 1
            $this->directories,
146 1
            $this->exec,
147 1
            $this->flags,
148 1
            $this->env,
149 1
            $this->streams
150
        );
151
152 1
        return $stepRunner->runStep($step);
153
    }
154
}
155