mirror of
https://github.com/laurent22/joplin.git
synced 2024-12-09 08:45:55 +02:00
144 lines
4.6 KiB
JavaScript
144 lines
4.6 KiB
JavaScript
const { dialog } = require('electron')
|
|
const { shim } = require('lib/shim');
|
|
const { Logger } = require('lib/logger.js');
|
|
const { _ } = require('lib/locale.js');
|
|
const fetch = require('node-fetch');
|
|
const { fileExtension } = require('lib/path-utils.js');
|
|
const packageInfo = require('./packageInfo.js');
|
|
const compareVersions = require('compare-versions');
|
|
|
|
let autoUpdateLogger_ = new Logger();
|
|
let checkInBackground_ = false;
|
|
let isCheckingForUpdate_ = false;
|
|
let parentWindow_ = null;
|
|
|
|
function showErrorMessageBox(message) {
|
|
return dialog.showMessageBox(parentWindow_, {
|
|
type: 'error',
|
|
message: message,
|
|
});
|
|
}
|
|
|
|
function onCheckStarted() {
|
|
autoUpdateLogger_.info('checkForUpdates: Starting...');
|
|
isCheckingForUpdate_ = true;
|
|
}
|
|
|
|
function onCheckEnded() {
|
|
autoUpdateLogger_.info('checkForUpdates: Done.');
|
|
isCheckingForUpdate_ = false;
|
|
}
|
|
|
|
async function fetchLatestRelease(options) {
|
|
options = Object.assign({}, { includePreReleases: false }, options);
|
|
|
|
let json = null;
|
|
|
|
if (options.includePreReleases) {
|
|
// This end-point will include all releases, including pre-releases (but not draft), so we take
|
|
// whatever is the latest release. It might be the same as releases/latest, or it might be
|
|
// a pre-release.
|
|
const response = await fetch('https://api.github.com/repos/laurent22/joplin/releases');
|
|
|
|
if (!response.ok) {
|
|
const responseText = await response.text();
|
|
throw new Error('Cannot get latest release info: ' + responseText.substr(0,500));
|
|
}
|
|
|
|
json = await response.json();
|
|
if (!json.length) throw new Error('Cannot get latest release info: ' + responseText.substr(0,500));
|
|
json = json[0];
|
|
} else {
|
|
const response = await fetch('https://api.github.com/repos/laurent22/joplin/releases/latest');
|
|
|
|
if (!response.ok) {
|
|
const responseText = await response.text();
|
|
throw new Error('Cannot get latest release info: ' + responseText.substr(0,500));
|
|
}
|
|
|
|
json = await response.json();
|
|
}
|
|
|
|
const version = json.tag_name.substr(1);
|
|
let downloadUrl = null;
|
|
const platform = process.platform;
|
|
for (let i = 0; i < json.assets.length; i++) {
|
|
const asset = json.assets[i];
|
|
let found = false;
|
|
const ext = fileExtension(asset.name);
|
|
if (platform === 'win32' && ext === 'exe') {
|
|
if (shim.isPortable()) {
|
|
found = asset.name == 'JoplinPortable.exe';
|
|
} else {
|
|
found = !!asset.name.match(/^Joplin-Setup-[\d.]+\.exe$/);
|
|
}
|
|
} else if (platform === 'darwin' && ext === 'dmg') {
|
|
found = true;
|
|
} else if (platform === 'linux' && ext === '.AppImage') {
|
|
found = true;
|
|
}
|
|
|
|
if (found) {
|
|
downloadUrl = asset.browser_download_url;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return {
|
|
version: version,
|
|
downloadUrl: downloadUrl,
|
|
notes: json.body,
|
|
pageUrl: json.html_url,
|
|
prerelease: json.prerelease,
|
|
};
|
|
}
|
|
|
|
function checkForUpdates(inBackground, window, logFilePath, options) {
|
|
if (isCheckingForUpdate_) {
|
|
autoUpdateLogger_.info('checkForUpdates: Skipping check because it is already running');
|
|
return;
|
|
}
|
|
|
|
parentWindow_ = window;
|
|
|
|
onCheckStarted();
|
|
|
|
if (logFilePath && !autoUpdateLogger_.targets().length) {
|
|
autoUpdateLogger_ = new Logger();
|
|
autoUpdateLogger_.addTarget('file', { path: logFilePath });
|
|
autoUpdateLogger_.setLevel(Logger.LEVEL_DEBUG);
|
|
autoUpdateLogger_.info('checkForUpdates: Initializing...');
|
|
}
|
|
|
|
checkInBackground_ = inBackground;
|
|
|
|
autoUpdateLogger_.info('checkForUpdates: Checking with options ' + JSON.stringify(options));
|
|
|
|
fetchLatestRelease(options).then(release => {
|
|
autoUpdateLogger_.info('Current version: ' + packageInfo.version);
|
|
autoUpdateLogger_.info('Latest version: ' + release.version);
|
|
autoUpdateLogger_.info('Is Pre-release:', release.prerelease);
|
|
|
|
if (compareVersions(release.version, packageInfo.version) <= 0) {
|
|
if (!checkInBackground_) dialog.showMessageBox({ message: _('Current version is up-to-date.') })
|
|
} else {
|
|
const releaseNotes = release.notes.trim() ? "\n\n" + release.notes.trim() : '';
|
|
const newVersionString = release.prerelease ? _('%s (pre-release)', release.version) : release.version;
|
|
|
|
const buttonIndex = dialog.showMessageBox(parentWindow_, {
|
|
type: 'info',
|
|
message: _('An update is available, do you want to download it now?') + '\n\n' + _('Your version: v%s', packageInfo.version) + '\n' + _('New version: v%s', newVersionString) + releaseNotes,
|
|
buttons: [_('Yes'), _('No')]
|
|
});
|
|
|
|
if (buttonIndex === 0) require('electron').shell.openExternal(release.downloadUrl ? release.downloadUrl : release.pageUrl);
|
|
}
|
|
}).catch(error => {
|
|
autoUpdateLogger_.error(error);
|
|
if (!checkInBackground_) showErrorMessageBox(error.message);
|
|
}).then(() => {
|
|
onCheckEnded();
|
|
});
|
|
}
|
|
|
|
module.exports.checkForUpdates = checkForUpdates |