Skip to content

Instantly share code, notes, and snippets.

@pascalchevrel
Last active October 8, 2025 14:07
Show Gist options
  • Select an option

  • Save pascalchevrel/55d9d8c7111ff55335b44eaa53bf6a62 to your computer and use it in GitHub Desktop.

Select an option

Save pascalchevrel/55d9d8c7111ff55335b44eaa53bf6a62 to your computer and use it in GitHub Desktop.
Major releases and dot releases per owner since version 122
<?php declare(strict_types=1);
function convertJson(string $url): array {
return json_decode(file_get_contents($url), true);
}
$api_root = 'https://whattrainisitnow.com/api/';
$owners = convertJson($api_root . 'release/owners/');
$releases = convertJson($api_root . 'firefox/releases/');
$current_release = (int) explode('.', array_key_last($releases))[0];
$current_team = [
'Ryan VanderMeulen',
'Donal Meehan',
'Pascal Chevrel',
'Dianna Smith',
];
// Analysis 2022
$start = 96;
$end = 108;
// Analysis 2023
$start = 108;
$end = 121;
// Analysis 2024
$start = 121;
$end = 133;
// Analysis 2025
$start = 134;
$end = $current_release;
// Analysis January 2024 to today
$start = 122;
$end = $current_release;
$major_releases_owners = array_filter(
$owners,
fn($k) => $k >= $start && $k <= $current_release,
ARRAY_FILTER_USE_KEY
);
// Set up a counter per owner
$counter = [];
foreach ($current_team as $owner) {
$counter[$owner] = [
'major' => 0,
'dot' => 0,
'average' => 0,
];
}
foreach (array_keys($releases) as $value) {
$data = explode('.', $value);
// Outside of team scope
if (! in_array(intval($data[0]), array_keys($major_releases_owners))) {
continue;
}
// Major release
if (count($data) == 2 ) {
$counter[$major_releases_owners[$data[0]]]['major']++;
continue;
}
$counter[$major_releases_owners[$data[0]]]['dot']++;
}
foreach ($current_team as $owner) {
$counter[$owner]['average'] = $counter[$owner]['dot'] / $counter[$owner]['major'];
}
$table_head = ' Owner' . str_pad('', 15, " ") . 'Major' . str_pad('', 4, " ") . 'Minor' . str_pad('', 4, " ") . 'Average';
$divider = str_pad('', strlen($table_head), "-");
echo "\n Major releases and dot releases per owner since version {$start} (" . $releases[strval($start) . '.0'] . ")\n\n";
echo "\033[1m" . $table_head . "\033[0m\n";
echo $divider . "\n";
foreach ($counter as $key => $value) {
[$major, $minor, $average] = array_map('strval', array_values($value)) ;
echo ' ' . str_pad($key, 22, " ") . str_pad( $major, 8, " ") . str_pad( $minor, 10, " ") . number_format((float)$average, 2, '.', '') . "\n";
}
$total_col = function($column) use ($counter) {
return (string) array_sum(array_column($counter, $column));
};
echo " \033[0;30;46m";
echo str_pad('Whole team', 22, " ")
. str_pad($total_col('major'), 8, " ")
. str_pad($total_col('dot'), 10, " ")
. number_format((float)$total_col('dot')/$total_col('major'), 2, '.', '');
echo "\033[0m\n";
@pascalchevrel
Copy link
Author

Gives this output (as of Firefox 143):

Major releases and dot releases per owner since version 122 (2024-01-23)

Owner               Major    Minor    Average
---------------------------------------------
Ryan VanderMeulen     5       12        2.40
Donal Meehan          6       12        2.00
Pascal Chevrel        6       10        1.67
Dianna Smith          4       8         2.00
Whole team            21      42        2.00

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment