1<?php 2 3const BRANCHES = ['master', 'PHP-8.2', 'PHP-8.1', 'PHP-8.0']; 4 5function get_branch_commit_cache_file_path(): string { 6 return dirname(__DIR__) . '/branch-commit-cache.json'; 7} 8 9function get_branch_matrix(array $branches) { 10 $result = array_map(function ($branch) { 11 $branch_key = strtoupper(str_replace('.', '', $branch)); 12 return [ 13 'name' => $branch_key, 14 'ref' => $branch, 15 ]; 16 }, $branches); 17 18 return $result; 19} 20 21function get_branches() { 22 $branch_commit_cache_file = get_branch_commit_cache_file_path(); 23 $branch_commit_map = []; 24 if (file_exists($branch_commit_cache_file)) { 25 $branch_commit_map = json_decode(file_get_contents($branch_commit_cache_file), JSON_THROW_ON_ERROR); 26 } 27 28 $changed_branches = []; 29 foreach (BRANCHES as $branch) { 30 $previous_commit_hash = $branch_commit_map[$branch] ?? null; 31 $current_commit_hash = trim(shell_exec('git rev-parse origin/' . $branch)); 32 33 if ($previous_commit_hash !== $current_commit_hash) { 34 $changed_branches[] = $branch; 35 } 36 37 $branch_commit_map[$branch] = $current_commit_hash; 38 } 39 40 file_put_contents($branch_commit_cache_file, json_encode($branch_commit_map)); 41 42 return get_branch_matrix($changed_branches); 43} 44 45function get_matrix_include(array $branches) { 46 $jobs = []; 47 foreach ($branches as $branch) { 48 $jobs[] = [ 49 'name' => '_ASAN_UBSAN', 50 'branch' => $branch, 51 'debug' => true, 52 'zts' => true, 53 'configuration_parameters' => "CFLAGS='-fsanitize=undefined,address -DZEND_TRACK_ARENA_ALLOC' LDFLAGS='-fsanitize=undefined,address'", 54 'run_tests_parameters' => '--asan', 55 'test_function_jit' => false, 56 ]; 57 if ($branch['ref'] !== 'PHP-8.0') { 58 $jobs[] = [ 59 'name' => '_REPEAT', 60 'branch' => $branch, 61 'debug' => true, 62 'zts' => false, 63 'run_tests_parameters' => '--repeat 2', 64 'timeout_minutes' => 360, 65 'test_function_jit' => true, 66 ]; 67 $jobs[] = [ 68 'name' => '_VARIATION', 69 'branch' => $branch, 70 'debug' => true, 71 'zts' => true, 72 'configuration_parameters' => "CFLAGS='-DZEND_RC_DEBUG=1 -DPROFITABILITY_CHECKS=0 -DZEND_VERIFY_FUNC_INFO=1'", 73 'run_tests_parameters' => '-d zend_test.observer.enabled=1 -d zend_test.observer.show_output=0', 74 'timeout_minutes' => 360, 75 'test_function_jit' => true, 76 ]; 77 } 78 } 79 return $jobs; 80} 81 82function get_windows_matrix_include(array $branches) { 83 $jobs = []; 84 foreach ($branches as $branch) { 85 $jobs[] = [ 86 'branch' => $branch, 87 'x64' => true, 88 'zts' => true, 89 'opcache' => true, 90 ]; 91 $jobs[] = [ 92 'branch' => $branch, 93 'x64' => false, 94 'zts' => false, 95 'opcache' => false, 96 ]; 97 } 98 return $jobs; 99} 100 101$trigger = $argv[1] ?? 'schedule'; 102$attempt = (int) ($argv[2] ?? 1); 103$discard_cache = ($trigger === 'schedule' && $attempt !== 1) || $trigger === 'workflow_dispatch'; 104if ($discard_cache) { 105 @unlink(get_branch_commit_cache_file_path()); 106} 107 108$branches = get_branches(); 109$matrix_include = get_matrix_include($branches); 110$windows_matrix_include = get_windows_matrix_include($branches); 111 112echo '::set-output name=branches::' . json_encode($branches, JSON_UNESCAPED_SLASHES) . "\n"; 113echo '::set-output name=matrix-include::' . json_encode($matrix_include, JSON_UNESCAPED_SLASHES) . "\n"; 114echo '::set-output name=windows-matrix-include::' . json_encode($windows_matrix_include, JSON_UNESCAPED_SLASHES) . "\n"; 115