Update notifications now able to parse "rc"'s and also show release notes from GitHub.

This commit is contained in:
Sebastiaan Pasma 2018-08-27 14:06:10 +02:00
commit 2c2c21bcdf
No known key found for this signature in database
GPG key ID: 9A2B0C8B95A1D26F
4 changed files with 74 additions and 26 deletions

View file

@ -43,20 +43,19 @@ angular.module('copayApp.controllers').controller('tabHomeController',
}); });
} }
if ($scope.isNW) { latestReleaseService.checkLatestRelease(function(err, newReleaseData) {
latestReleaseService.checkLatestRelease(function(err, newRelease) {
if (err) { if (err) {
$log.warn(err); $log.warn(err);
return; return;
} }
if (newRelease) { if (newReleaseData) {
$scope.newRelease = true; $scope.newRelease = true;
$scope.updateText = gettextCatalog.getString('There is a new version of {{appName}} available', { $scope.newReleaseText = gettextCatalog.getString('There is a new version of {{appName}} available', {
appName: $scope.name appName: $scope.name
}); });
$scope.newReleaseNotes = newReleaseData.releaseNotes;
} }
}); });
}
}; };
function onEnter(event, data) { function onEnter(event, data) {

View file

@ -1,16 +1,16 @@
'use strict'; 'use strict';
angular.module('copayApp.services') angular.module('copayApp.services')
.factory('latestReleaseService', function latestReleaseServiceFactory($log, $http, configService) { .factory('latestReleaseService', function latestReleaseServiceFactory($log, $http, configService, platformInfo) {
var root = {}; var root = {};
root.checkLatestRelease = function(cb) { root.checkLatestRelease = function(cb) {
var releaseURL = configService.getDefaults().release.url; var releaseURL = configService.getDefaults().release.url;
requestLatestRelease(releaseURL, function(err, release) { requestLatestRelease(releaseURL, function(err, releaseData) {
if (err) return cb(err); if (err) return cb(err);
var currentVersion = window.version; var currentVersion = window.version;
var latestVersion = release.data.tag_name; var latestVersion = releaseData.tag_name;
if (!verifyTagFormat(currentVersion)) if (!verifyTagFormat(currentVersion))
return cb('Cannot verify the format of version tag: ' + currentVersion); return cb('Cannot verify the format of version tag: ' + currentVersion);
@ -20,30 +20,72 @@ angular.module('copayApp.services')
var current = formatTagNumber(currentVersion); var current = formatTagNumber(currentVersion);
var latest = formatTagNumber(latestVersion); var latest = formatTagNumber(latestVersion);
if (latest.major < current.major || (latest.major == current.major && latest.minor <= current.minor)) if (latest.major < current.major || (latest.major === current.major && latest.minor <= current.minor)) {
return cb(null, false); return cb(null, false);
}
var releaseSearchTerm = "";
if (platformInfo.isNW) { // XX SP: DESKTOP: Check if the latest release is already available for current OS
var platform = process.platform;
if (platform === "darwin") {
releaseSearchTerm = "osx";
} else if (platform === "win32") {
releaseSearchTerm = "win";
} else if (platform === "linux") {
releaseSearchTerm = "linux";
}
var foundNewVersion = false;
for (var i in releaseData.assets) {
if (releaseData.assets[i].name.indexOf(releaseSearchTerm) !== -1) {
foundNewVersion = true;
break;
}
}
}
$log.debug('A new version is available: ' + latestVersion); $log.debug('A new version is available: ' + latestVersion);
return cb(null, true);
//
var releaseNotes = false;
if (releaseData.body) {
var releaseLines = releaseData.body.split('\n');
for (var lineNum in releaseLines) {
if (releaseLines[lineNum].substring(0, 2) === "# ") {
releaseLines[lineNum] = "<strong>"+releaseLines[lineNum].substring(2)+"</strong>";
} else if (releaseLines[lineNum].substring(0, 2) === "- ") {
releaseLines[lineNum] = "&bull; "+releaseLines[lineNum].substring(2);
}
}
releaseNotes = releaseLines.join('\n');
}
return cb(null, {latestVersion: latestVersion, releaseNotes: releaseNotes});
}); });
function verifyTagFormat(tag) { function verifyTagFormat(tag) {
var regex = /^v?\d+\.\d+\.\d+$/i; var regex = /^v?\d+\.\d+(\.\d+)?(-rc\d)?$/i;
return regex.exec(tag); return regex.exec(tag);
}; };
function formatTagNumber(tag) { function formatTagNumber(tag) {
var label = false;
if (tag.split("-")[1]) { // Move postfixes like "-rc2" to a variable
label = tag.split("-")[1];
tag = tag.split("-")[0];
}
var formattedNumber = tag.replace(/^v/i, '').split('.'); var formattedNumber = tag.replace(/^v/i, '').split('.');
return { return {
major: +formattedNumber[0], major: +(formattedNumber[0]?+formattedNumber[0]:0),
minor: +formattedNumber[1], minor: +(formattedNumber[1]?+formattedNumber[1]:0),
patch: +formattedNumber[2] patch: +(formattedNumber[2]?+formattedNumber[2]:0),
label: label /* XX SP: we can use this in a later stage (with for example 1.0.0-rc2 the value will be "rc2" and false if there is no label) */
}; };
}; };
}; };
function requestLatestRelease(releaseURL, cb) { function requestLatestRelease(releaseURL, cb) {
$log.debug('Retrieving latest relsease information...'); $log.debug('Retrieving latest release information...');
var request = { var request = {
url: releaseURL, url: releaseURL,
@ -53,7 +95,7 @@ angular.module('copayApp.services')
$http(request).then(function(release) { $http(request).then(function(release) {
$log.debug('Latest release: ' + release.data.name); $log.debug('Latest release: ' + release.data.name);
return cb(null, release); return cb(null, release.data);
}, function(err) { }, function(err) {
return cb('Cannot get the release information: ' + err); return cb('Cannot get the release information: ' + err);
}); });

View file

@ -173,6 +173,11 @@
font-weight: 700; font-weight: 700;
color: #444; color: #444;
} }
.release-notes {
white-space: pre;
white-space: pre-line;
text-align: left;
}
.button { .button {
width: 100%; width: 100%;
border: none; border: none;

View file

@ -15,7 +15,9 @@
<img src="img/icon-update.svg" class="bg"/> <img src="img/icon-update.svg" class="bg"/>
</i> </i>
<div class="item title">{{updateText}}</div> <div class="item title">{{newReleaseText}}</div>
<div class="item release-notes" ng-if="newReleaseNotes"><span ng-bind-html="newReleaseNotes"></span></div>
<div class="button" ng-click="openExternalLink()"> <div class="button" ng-click="openExternalLink()">
<span translate>Download</span> <span translate>Download</span>