From b757ead4b8281d6b73a5eceaf2e18d2a028c67c5 Mon Sep 17 00:00:00 2001 From: argshook Date: Tue, 27 Jun 2023 21:25:10 +0300 Subject: [PATCH] refactor `BuildVersion` button to prevent crash on unexpected value previous change in #165 made `BuildVersion` button show different view depending on the value of `select build`. If `select build` returns unexpected value, a fallback version `x.x.x` was used, which is not valid semver according to `compare-versions` util. Moreover, if `select build` returns an unexpected value, say, while developing QuestDB locally, it was possible for the entire web console to crash. This commit fixes this problem by using `0.0.0` instead of `x.x.x` as a fallback, and in addition has more preventative measures to reduce the chance of needing to use fallback value. --- .../src/scenes/Footer/BuildVersion/index.tsx | 18 +++++++-------- .../scenes/Footer/BuildVersion/services.ts | 22 ++++++++++++++++++- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/packages/web-console/src/scenes/Footer/BuildVersion/index.tsx b/packages/web-console/src/scenes/Footer/BuildVersion/index.tsx index 327660e9c..692e54056 100644 --- a/packages/web-console/src/scenes/Footer/BuildVersion/index.tsx +++ b/packages/web-console/src/scenes/Footer/BuildVersion/index.tsx @@ -27,10 +27,14 @@ import React, { useContext, useEffect, useState } from "react" import styled from "styled-components" import * as QuestDB from "../../../utils/questdb" import { SecondaryButton } from "../../../components" -import { formatCommitHash, formatVersion, Versions } from "./services" +import { + getCanUpgrade, + formatCommitHash, + formatVersion, + Versions, +} from "./services" import { ExternalLink, ArrowUpCircle } from "styled-icons/remix-line" import { Release } from "../../../utils/questdb" -import { compare } from "compare-versions" import { Team } from "styled-icons/remix-line" import { BuildingMultiple } from "styled-icons/fluentui-system-filled" import { ShieldLockFill } from "styled-icons/bootstrap" @@ -116,14 +120,10 @@ const BuildVersion = () => { } const enterpriseVersion = buildVersion.kind.includes("enterprise") - - const upgradeAvailable = - !enterpriseVersion && - newestRelease && - compare(buildVersion.version, newestRelease.name, "<") + const upgradeAvailable = getCanUpgrade(buildVersion, newestRelease?.name) const releaseUrl = upgradeAvailable - ? newestRelease.html_url + ? newestRelease?.html_url : `https://github.com/questdb/questdb${ buildVersion ? `/releases/tag/${buildVersion.version}` @@ -157,7 +157,7 @@ const BuildVersion = () => { {upgradeAvailable && ( <> - {newestRelease.name} + {newestRelease?.name} )} diff --git a/packages/web-console/src/scenes/Footer/BuildVersion/services.ts b/packages/web-console/src/scenes/Footer/BuildVersion/services.ts index 21b9d5e49..7c87a433a 100644 --- a/packages/web-console/src/scenes/Footer/BuildVersion/services.ts +++ b/packages/web-console/src/scenes/Footer/BuildVersion/services.ts @@ -22,6 +22,8 @@ * ******************************************************************************/ +import { compare } from "compare-versions" + const buildVersionRegex = /Build Information: QuestDB ([\w- ]+ )?([0-9A-Za-z.-]*),/ @@ -51,7 +53,7 @@ export const formatVersion = (value: string): Versions => { return { kind: "dev", - version: "x.x.x", + version: "0.0.0", } } @@ -62,3 +64,21 @@ export const formatCommitHash = (value: string | number | boolean) => { return matches ? matches[1] : "" } + +export const getCanUpgrade = ( + buildVersion: Versions, + newestReleaseTag?: string, +): boolean => { + if (typeof newestReleaseTag === "undefined") { + return false + } + + const enterpriseVersion = buildVersion.kind.includes("enterprise") + + try { + const isOlder = compare(buildVersion.version, newestReleaseTag, "<") + return !enterpriseVersion && isOlder + } catch (e) { + return false + } +}