Re-implement version check

This makes LibreTime check its version against github releases and lets the user know when to update. It uses the red exclamation point when there is a patch release or if LibreTime is more than one major release ahead. The orange icon is used when LibreTime is on a git install, a single major update is available, or a pre-release version is installed. The green update icon gets used to signify that a new minor release is available. Finally the green checkmark will be used when you are on a stable release.
This commit is contained in:
Lucas Bickel 2017-03-20 20:34:23 +01:00
parent 81d3c3e2b8
commit 06a3ad0ed3
8 changed files with 230 additions and 38 deletions

View file

@ -25,6 +25,7 @@ define('AIRTIME_TRANSIFEX_URL' , 'http://libretime.org/translating/');
define('SUPPORT_TICKET_URL' , 'https://github.com/LibreTime/libretime/issues');
define('UI_REVAMP_EMBED_URL' , 'https://www.youtube.com/embed/nqpNnCKGluY');
define('LIBRETIME_WHATS_NEW_URL' , 'https://github.com/LibreTime/libretime/releases');
define('LIBRETIME_UPDATE_FEED' , 'https://github.com/LibreTime/libretime/releases.atom');
define('LIBRETIME_EMAIL_FROM' , 'noreply@libretime.org');
define('LICENSE_VERSION' , 'GNU AGPL v.3');

View file

@ -39,9 +39,11 @@ class LocaleController extends Zend_Controller_Action
//dashboard/versiontooltip.js
"You are running the latest version" => _("You are running the latest version"),
"New version available: " => _("New version available: "),
"This version will soon be obsolete." => _("This version will soon be obsolete."),
"This version is no longer supported." => _("This version is no longer supported."),
"Please upgrade to " => _("Please upgrade to "),
"You have a pre-release version of LibreTime intalled." => _("You have a pre-release version of LibreTime intalled."),
"A patch update for your LibreTime installation is available." => _("A patch update for your LibreTime installation is available."),
"A feature update for your LibreTime installation is available." => _("A feature update for your LibreTime installation is available."),
"A major update for your LibreTime installation is available." => _("A major update for your LibreTime installation is available."),
"Multiple major updates for LibreTime installation are available. Please upgrade as soon as possible." => _("Multiple major updates for LibreTime installation are available. Please upgrade as soon as possible."),
//library/events/library_playlistbuilder.js
"Add to current playlist" => _("Add to current playlist"),
"Add to current smart block" => _("Add to current smart block"),

View file

@ -879,8 +879,27 @@ class Application_Model_Preference
public static function GetLatestVersion()
{
$config = Config::getConfig();
$latest = self::getValue("latest_version");
if ($latest == null || strlen($latest) == 0) {
$latest = json_decode(self::getValue('latest_version'));
$nextCheck = self::getValue('latest_version_nextcheck');
if ($latest && $nextCheck > time()) {
return $latest;
}
$rss = new SimplePie();
$rss->set_feed_url(array(LIBRETIME_UPDATE_FEED));
$rss->enable_cache(false);
$rss->init();
$rss->handle_content_type();
// get all available versions ut to default github api limit
$versions = array();
foreach ($rss->get_items() as $item) {
$versions[] = $item->get_title();
}
$latest = $versions;
self::setValue('latest_version', json_encode($latest));
self::setValue('latest_version_nextcheck', strtotime('+1 week'));
if (empty($latest)) {
return $config['airtime_version'];
} else {
return $latest;
@ -899,7 +918,7 @@ class Application_Model_Preference
{
$link = self::getValue("latest_link");
if ($link == null || strlen($link) == 0) {
return 'http://airtime.sourcefabric.org';
return LIBRETIME_WHATS_NEW_URL;
} else {
return $link;
}

View file

@ -1,5 +1,8 @@
<?php
use Composer\Semver\Comparator;
use Composer\Semver\Semver;
/**
* This file does the following things:
* 1. Calculate how many major versions back the current installation
@ -9,9 +12,63 @@
* (stored in pair of invisible div tags)
* 4. Returns the current version, as HTML (stored in pair of invisible div tags)
*/
class Airtime_View_Helper_VersionNotify extends Zend_View_Helper_Abstract{
class Airtime_View_Helper_VersionNotify extends Zend_View_Helper_Abstract {
public function versionNotify(){
return "";
public function versionNotify()
{
$config = Config::getConfig();
// retrieve and validate current and latest versions,
$current = $config['airtime_version'];
$latest = Application_Model_Preference::GetLatestVersion();
$link = Application_Model_Preference::GetLatestLink();
$isGitRelease = preg_match('/^[[:alnum:]]{7}$/i', $current) === 1;
$currentParts = array(0, 0, 0, 0);
if (!$isGitRelease) {
$currentParts = preg_split("/(\.|-)/", $current);
}
$majorCandidates = SemVer::satisfiedBy($latest, sprintf('>=%1$s', $currentParts[0] + 1));
$minorCandidates = SemVer::satisfiedBy($latest, sprintf('~%1$s.%2$s', $currentParts[0], $currentParts[1] + 1));
$patchCandidates = SemVer::satisfiedBy($latest, sprintf('>=%1$s.%2$s.%3$s <%1$s.%3$s', $currentParts[0], $currentParts[1], $currentParts[2] + 1, $currentParts[1] + 1));
$hasMajor = !empty($majorCandidates);
$hasMinor = !empty($minorCandidates);
$hasPatch = !empty($patchCandidates);
$isPreRelease = $isGitRelease || array_key_exists(4, $currentParts);
$hasMultiMajor = count($majorCandidates) > 1;
if ($isPreRelease) {
// orange "warning" if you are on unreleased code
$class = 'update2';
} else if ($hasPatch || $hasMultiMajor) {
// current patch or more than 1 major behind
$class = 'outdated';
} else if ($hasMinor) {
// green warning for feature update
$class = 'update';
} else if ($hasMajor) {
// orange warning for 1 major beind
$class = 'update2';
} else {
$class = 'uptodate';
}
$latest = SemVer::rsort($latest);
$highestVersion = $latest[0];
$data = (object) array(
'link' => $link,
'latest' => $highestVersion,
'current' => $current,
'hasPatch' => $hasPatch,
'hasMinor' => $hasMinor,
'hasMajor' => $hasMajor,
'isPreRelease' => $isPreRelease,
'hasMultiMajor' => $hasMultiMajor,
);
$result = sprintf('<script>var versionNotifyInfo = %s;</script>', json_encode($data))
. "<div id='version-icon' class='" . $class . "'></div>";
return $result;
}
}