dashboard/shell/utils/version.js

129 lines
3.1 KiB
JavaScript

import { sortableNumericSuffix } from '@shell/utils/sort';
import semver from 'semver';
import { MANAGEMENT } from '@shell/config/types';
import { READ_WHATS_NEW, SEEN_WHATS_NEW } from '@shell/store/prefs';
import { SETTING } from '@shell/config/settings';
export function parse(str) {
str = `${ str }`;
// Trim off leading 'v'
if ( str.substr(0, 1).toLowerCase() === 'v' ) {
str = str.substr(1);
}
const parts = str.split(/[.+-]/);
return parts;
}
export function sortable(str) {
return parse(str).map((x) => sortableNumericSuffix(x)).join('.');
}
export function compare(in1, in2) {
if ( !in1 ) {
return 1;
}
if ( !in2 ) {
return -1;
}
const p1 = parse(in1);
const p2 = parse(in2);
const minLen = Math.min(p1.length, p2.length);
for ( let i = 0 ; i < minLen ; i++ ) {
const res = comparePart(p1[i], p2[i]);
if ( res !== 0 ) {
return res;
}
}
return p1.length - p2.length;
}
function isNumeric(str) {
return (`${ str }`).match(/^([0-9]+\.)?[0-9]*$/);
}
function comparePart(in1, in2) {
in1 = (`${ in1 }`).toLowerCase();
in2 = (`${ in2 }`).toLowerCase();
if ( isNumeric(in1) && isNumeric(in2) ) {
const num1 = parseInt(in1, 10);
const num2 = parseInt(in2, 10);
if ( !isNaN(num1) && !isNaN(num2) ) {
return num1 - num2;
}
}
return in1.localeCompare(in2);
}
export function isPrerelease(version = '') {
if (!semver.valid(version)) {
version = semver.clean(version, { loose: true });
}
return !!semver.prerelease(version);
}
export function isDevBuild(version) {
if ( ['dev', 'master', 'head'].includes(version) || version.endsWith('-head') || version.match(/-rc\d+$/) || version.match(/-alpha\d+$/) ) {
return true;
}
return false;
}
export function getVersionInfo(store) {
const setting = store.getters['management/byId'](MANAGEMENT.SETTING, SETTING.VERSION_RANCHER);
const fullVersion = setting?.value || 'unknown';
let displayVersion = fullVersion;
const match = fullVersion.match(/^(.*)-([0-9a-f]{40})-(.*)$/);
if ( match ) {
displayVersion = match[2].substr(0, 7);
}
return {
displayVersion,
fullVersion
};
}
export function seenReleaseNotes(store) {
const lastSeenNew = store.getters['prefs/get'](SEEN_WHATS_NEW) ;
const fullVersion = getVersionInfo(store).fullVersion;
return compare(lastSeenNew, fullVersion) >= 0 && !!lastSeenNew;
}
// Mark that the user has seen the release notes for this version if not already done
export async function markSeenReleaseNotes(store) {
if (!seenReleaseNotes(store)) {
await store.dispatch('prefs/set', { key: SEEN_WHATS_NEW, value: getVersionInfo(store).fullVersion });
}
}
export function readReleaseNotes(store) {
const lastSeenNew = store.getters['prefs/get'](READ_WHATS_NEW) ;
const fullVersion = getVersionInfo(store).fullVersion;
return compare(lastSeenNew, fullVersion) >= 0 && !!lastSeenNew;
}
// Mark that the user has read the release notes for this version if not already done
export async function markReadReleaseNotes(store) {
if (!readReleaseNotes(store)) {
await store.dispatch('prefs/set', { key: READ_WHATS_NEW, value: getVersionInfo(store).fullVersion });
}
}