app/models/future_release.php (83 lines of code) (raw):
<?php
declare(strict_types=1);
use ReleaseInsights\{Bugzilla, Data, Duration, Json, Nightly, Release, URL, Version};
$requested_version = Version::get();
$data = new Data();
if ($data->isTodayReleaseDay()) {
// On release day we want to force fetching product-details on all page views
$data->cache_duration = 1;
}
$all_releases = $data->getMajorReleases();
// Avoid a warning when we have a race condition in product-details
$release_date = $all_releases[(string) $requested_version] ?? '';
// Future release date object
$release = new DateTime($release_date);
// Previous release object
$previous_release = new DateTime($all_releases[Version::decrement($requested_version, 1)]);
// Release n-2 Needed for nightly cycle length calculation
$nightly_start = new DateTime($all_releases[Version::decrement($requested_version, 2)]);
// Calculate the number of weeks between the 2 releases
$beta_cycle_length = $release->diff($previous_release)->days / 7;
$nightly_cycle_length = $previous_release->diff($nightly_start)->days / 7;
// Get the schedule for the release requested
$cycle_dates = new Release($requested_version)->getSchedule();
$nightly_fixes = 0;
/* Only for the current Beta view */
$nightly_fixes = 0;
if ((int) $requested_version === BETA) {
// Number of bugs fixed in nightly
$nightly_fixes = Bugzilla::getBugsFromHgWeb(
URL::Mercurial->value
. 'mozilla-central/json-pushes'
. '?fromchange=FIREFOX_NIGHTLY_' . ((int) $requested_version - 1) . '_END'
. '&tochange=FIREFOX_NIGHTLY_' . (int) $requested_version .'_END'
. '&full&version=2',
true,
-1 // Immutable external data, store forever
);
}
$nightly_updates = true;
$nightly_emergency = '';
/* Only for the current Nightly view, this makes an HTTP request */
if ((int) $requested_version == NIGHTLY) {
// Are nightly updates activated?
$nightly_state = new Nightly();
$nightly_updates = $nightly_state->auto_updates;
$nightly_emergency = Bugzilla::linkify($nightly_state->emergency_message);
}
$deadlines = [];
foreach ($cycle_dates as $k => $date) {
// Not a real milestone
if ($k === 'version') {
continue;
}
// let's ignore hours and only consider full days for simplicity
$reference_date = new DateTime($date)->setTime(0, 0);
$time = new Duration(new DateTime(), $reference_date);
$deadlines[$k] = $time->report();
if ($reference_date>= new DateTime()) {
// Future
if ($time->report()['weeks'] >= 2) {
$deadlines[$k]['message'] = 'In ' . $time->report()['weeks'] . ' weeks';
} else {
$deadlines[$k]['message'] = match($time->report()['workdays']) {
0 => 'No working day before milestone',
1 => '1 working day',
default => 'In ' . $time->report()['workdays'] . ' working days',
};
}
} else {
// Past
if ($time->report()['weeks'] >= 2) {
$deadlines[$k]['message'] = $time->report()['weeks'] . ' weeks ago';
} else {
$deadlines[$k]['message'] = match($time->report()['days']) {
-1 => 'yesterday',
0 => 'Today',
1 => 'Yesterday',
default => $time->report()['days'] . ' days ago',
};
}
}
}
// Check current rollout for the beta channel
if ((int) $requested_version === BETA) {
$rollout = Json::load(URL::Balrog->value . 'rules/firefox-beta')['backgroundRate'];
}
return [
$release_date,
$beta_cycle_length,
$nightly_cycle_length,
$nightly_fixes,
$nightly_updates,
$nightly_emergency,
$cycle_dates,
$deadlines,
$rollout ?? -1,
$wellness_days = new Data()->wellness_days,
Nightly::getLatestBuildID(),
];