-
-
Notifications
You must be signed in to change notification settings - Fork 32
/
travis-matrix.php
110 lines (85 loc) · 2.19 KB
/
travis-matrix.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
<?php
declare(strict_types=1);
$phpVersions = [
'7.2',
'7.3',
'7.4',
'8.0',
];
$engines = [
'PDO_MYSQL',
'PDO_MYSQL_MARIADB',
'PDO_PGSQL',
'SQLite3',
'GEOS',
];
$latestDist = 'focal';
/**
* The dists required to run a given PHP version or engine.
* In chronological order. The latest compatible dist will be chosen.
*/
$requires = [
'7.2' => ['trusty', 'xenial', 'bionic'],
'7.3' => ['trusty', 'xenial', 'bionic'],
'7.4' => ['trusty', 'xenial', 'bionic'],
'8.0' => ['xenial', 'bionic', 'focal'],
];
/** @var Job[] $jobs */
$jobs = [];
foreach ($phpVersions as $phpVersion) {
foreach ($engines as $engine) {
$job = new Job();
$dist = getDist($phpVersion, $engine);
if ($dist === null) {
continue;
}
$job->phpVersion = $phpVersion;
$job->engine = $engine;
$job->dist = $dist;
$jobs[] = $job;
}
}
echo "matrix:\n";
echo " include:\n";
foreach ($jobs as $job) {
echo " - php: {$job->phpVersion}\n";
echo " env: ENGINE={$job->engine}\n";
echo " dist: {$job->dist}\n";
}
function getDist(string $phpVersion, string $engine): ?string
{
global $latestDist;
global $requires;
if ($phpVersion === '8.0' && $engine === 'GEOS') {
// GEOS PHP does not support PHP 8 yet
// See: https://git.osgeo.org/gitea/geos/php-geos/issues/26
return null;
}
$requiredDists = [];
foreach ([$phpVersion, $engine] as $key) {
if (isset($requires[$key])) {
$requiredDists[] = (array) $requires[$key];
}
}
switch (count($requiredDists)) {
case 0:
return $latestDist;
case 1:
return $requiredDists[0][count($requiredDists[0]) - 1];
default:
$dists = array_values(array_intersect($requiredDists[0], $requiredDists[1]));
if (! $dists) {
// conflicting requirements; can't run!
return null;
}
return $dists[count($dists) - 1];
}
}
class Job {
/** @var string */
public $phpVersion;
/** @var string */
public $engine;
/** @var string */
public $dist;
}