Issues (1)

src/Version.php (1 issue)

Labels
Severity
1
<?php
2
3
namespace Spinen\Version;
4
5
/**
6
 * Class Version
7
 *
8
 * Parse the version file into its parts
9
 *
10
 * @package Spinen\Version
11
 */
12
class Version
13
{
14
    /**
15
     * Major version
16
     *
17
     * @var integer|null
18
     */
19
    public $major = null;
20
21
    /**
22
     * Meta
23
     *
24
     * Extra data about the version with dots separating key data and underscores for spaces
25
     *
26
     * @var string|null
27
     */
28
    public $meta = null;
29
30
    /**
31
     * Minor version
32
     *
33
     * @var integer|null
34
     */
35
    public $minor = null;
36
37
    /**
38
     * Patch version
39
     *
40
     * @var integer|null
41
     */
42
    public $patch = null;
43
44
    /**
45
     * Pre release
46
     *
47
     * This will most likely be the branch version, unless we are on the master branch
48
     *
49
     * @var string|null
50
     */
51
    public $pre_release = null;
52
53
    /**
54
     * Version in SemVer format
55
     *
56
     * @var string
57
     */
58
    public $semver;
59
60
    /**
61
     * The version of the application
62
     *
63
     * @var string
64
     */
65
    public $version = "UNDEFINED";
66
67
    /**
68
     * The file that holds the version info
69
     *
70
     * @var string
71
     */
72
    protected $version_file;
73
74
    /**
75
     * Version constructor.
76
     *
77
     * @param string $file
78
     */
79 9
    public function __construct($file)
80
    {
81 9
        $this->version_file = $file;
82
83 9
        $this->parseVersionFile();
84
85 9
        $this->generateSemVer();
86 9
    }
87
88
    /**
89
     * If the object is used as a string, then return the full version
90
     *
91
     * @return string
92
     */
93 8
    public function __toString()
94
    {
95 8
        return $this->semver;
96
    }
97
98
    /**
99
     * Put together version parts into the SemVer format
100
     */
101 9
    protected function generateSemVer()
102
    {
103 9
        $this->semver = $this->version;
104
105 9
        if ($this->pre_release) {
106 3
            $this->semver .= '-' . $this->pre_release;
107
        }
108
109 9
        if ($this->meta) {
110 3
            $this->semver .= '+' . $this->meta;
111
        }
112 9
    }
113
114
    /**
115
     * If the read-in line matches a version, then parse it
116
     *
117
     * @param string $version
118
     *
119
     * @return bool
120
     */
121 7
    protected function parseVersion($version)
122
    {
123 7
        if (!preg_match('/\\d+\\.\\d+\\.\\d+/u', $version)) {
124 1
            return false;
125
        }
126
127 6
        $this->version = $version;
128
129 6
        list($this->major, $this->minor, $this->patch) = array_map('intval', explode(".", $this->version));
130
131 6
        return true;
132
    }
133
134
    /**
135
     * Read the version file into the various parts
136
     *
137
     * @return void
138
     */
139 9
    protected function parseVersionFile()
140
    {
141 9
        if (!file_exists($this->version_file)) {
142 1
            return;
143
        }
144
145
        // Read file in as an array & remove any empty lines
146 8
        $version_parts = array_filter(explode("\n", @file_get_contents($this->version_file)));
0 ignored issues
show
It seems like @file_get_contents($this->version_file) can also be of type false; however, parameter $string of explode() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

146
        $version_parts = array_filter(explode("\n", /** @scrutinizer ignore-type */ @file_get_contents($this->version_file)));
Loading history...
147
148
        // First line is the version
149 8
        if (empty($version_parts) or !$this->parseVersion(array_shift($version_parts))) {
150 2
            return;
151
        }
152
153
        // Next line is branch/pre release
154 6
        $pre_release = array_shift($version_parts);
155
156 6
        $this->pre_release = ($pre_release !== 'master') ? $pre_release : null;
157
158
        // Is there anything left in the file for meta?
159 6
        if (empty($version_parts)) {
160 3
            return;
161
        }
162
163
        // Everything left is the meta, so concatenate it with .'s & replace the spaces with _'s
164 3
        $this->meta = preg_replace("/\\s+/u", "_", implode('.', $version_parts));
165 3
    }
166
}
167