StepScriptWriter::writeAfterScript()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 6
c 1
b 0
f 0
nc 1
nop 2
dl 0
loc 9
ccs 7
cts 7
cp 1
crap 1
rs 10
1
<?php
2
3
/* this file is part of pipelines */
4
5
namespace Ktomk\Pipelines\Runner;
6
7
use Ktomk\Pipelines\File\Pipeline\Step;
8
use Ktomk\Pipelines\Lib;
9
10
/**
11
 * Class StepScriptWriter
12
 *
13
 * Writes a pipeline step script as string. In use for script and after-script.
14
 *
15
 * @package Ktomk\Pipelines\Runner
16
 */
17
class StepScriptWriter
18
{
19
    /**
20
     * @param array|string[] $script
21
     * @param int $status exit status
22
     */
23 1
    public static function writeAfterScript(array $script, $status = 0)
24
    {
25 1
        $buffer = "# this /bin/sh script is generated from a pipeline after-script\n";
26 1
        $buffer .= "set -e\n";
27 1
        $buffer .= sprintf("BITBUCKET_EXIT_CODE=%d\n", $status);
28 1
        $buffer .= "export BITBUCKET_EXIT_CODE\n";
29 1
        $buffer .= self::generateScriptBody($script);
30
31 1
        return $buffer;
32
    }
33
34
    /**
35
     * generate step script from Step
36
     *
37
     * @param array|string[] $script
38
     * @param bool $scriptExitEarly the 'script.exit-early' configuration setting
39
     *
40
     * @return string
41
     */
42 1
    public static function writeStepScript(array $script, $scriptExitEarly = false)
43
    {
44 1
        $buffer = "# this /bin/sh script is generated from a pipeline script\n";
45 1
        $buffer .= "set -e\n";
46 1
        $buffer .= 'test "$0" = "/bin/bash" && if [ -f ~/.bashrc ]; then source ~/.bashrc; fi' . "\n";
47 1
        $buffer .= self::generateScriptBody(
48
            $script,
49 1
            self::getLinePostCommand($scriptExitEarly)
50
        );
51
52 1
        return $buffer;
53
    }
54
55
    /**
56
     * after command
57
     *
58
     * optional command after each line in a step script to more strictly
59
     * check the last step script command exit status.
60
     *
61
     * for debugging purposes.
62
     *
63
     * @param bool $strict
64
     *
65
     * @return null|string
66
     */
67 2
    public static function getLinePostCommand($strict)
68
    {
69 2
        return $strict ? '( r=$?; if [ $r -ne 0 ]; then exit $r; fi; ) || exit' . "\n" : null;
70
    }
71
72
    /**
73
     * @param array|string[] $script
74
     * @param null|string $afterCommand
75
     *
76
     * @return string
77
     */
78 2
    public static function generateScriptBody(array $script, $afterCommand = null)
79
    {
80 2
        $buffer = '';
81 2
        foreach ($script as $line) {
82 1
            $command = self::generateCommand($line);
83 1
            $line && $buffer .= 'printf \'\\n\'' . "\n";
84 1
            $buffer .= 'printf \'\\035+ %s\\n\' ' . Lib::quoteArg($command) . "\n";
85 1
            $buffer .= $command . "\n";
86 1
            null !== $afterCommand && $buffer .= $afterCommand;
87
        }
88
89 2
        return $buffer;
90
    }
91
92
    /**
93
     * @param null|array|string $line
94
     *
95
     * @return string
96
     */
97 2
    public static function generateCommand($line)
98
    {
99 2
        $standard = is_scalar($line) || null === $line;
100 2
        $pipe = is_array($line) && isset($line['pipe']) && is_string($line['pipe']);
101
102 2
        if ($standard) {
103
            /** @var null|float|int|string $line */
104 1
            return (string)$line;
105
        }
106
107 1
        $line = (array)$line;
108 1
        $buffer = '';
109
110 1
        if ($pipe) {
111 1
            $buffer .= "echo \"pipe: {$line['pipe']} (pending feature)\" # pipe feature is pending\n";
112 1
            if (isset($line['variables']) && is_array($line['variables'])) {
113 1
                foreach ($line['variables'] as $name => $value) {
114 1
                    $buffer .= sprintf(
115
                        "printf %%s %s; printf '%%s ' %s; printf '\\n' \n",
116 1
                        Lib::quoteArg("  {$name} ({$value}): "),
117
                        $value
118
                    );
119
                }
120
            }
121
        }
122
123 1
        return $buffer;
124
    }
125
}
126