From 4ebb7a6a4d21b02f2c5dedbd01be5dc5c596a45f Mon Sep 17 00:00:00 2001 From: dijunkun Date: Thu, 13 Nov 2025 14:32:35 +0800 Subject: [PATCH] [chore] update version format --- src/version_checker/version_checker.cpp | 87 ++++++++++++++++++++++++- 1 file changed, 86 insertions(+), 1 deletion(-) diff --git a/src/version_checker/version_checker.cpp b/src/version_checker/version_checker.cpp index 56f0622..6933b4e 100644 --- a/src/version_checker/version_checker.cpp +++ b/src/version_checker/version_checker.cpp @@ -12,11 +12,15 @@ #include #include #include +#include +#include using json = nlohmann::json; namespace crossdesk { +static std::string latest_release_date_ = ""; + std::string ExtractNumericPart(const std::string& ver) { size_t start = 0; while (start < ver.size() && !std::isdigit(ver[start])) start++; @@ -39,6 +43,39 @@ std::vector SplitVersion(const std::string& ver) { return nums; } +// extract date from version string (format: v1.2.3-20251113-abc +// or 1.2.3-20251113-abc) +std::string ExtractDateFromVersion(const std::string& version) { + size_t dash1 = version.find('-'); + if (dash1 != std::string::npos) { + size_t dash2 = version.find('-', dash1 + 1); + if (dash2 != std::string::npos) { + std::string date_part = version.substr(dash1 + 1, dash2 - dash1 - 1); + + bool is_date = true; + for (char c : date_part) { + if (!std::isdigit(c)) { + is_date = false; + break; + } + } + if (is_date) { + // convert YYYYMMDD to YYYY-MM-DD + return date_part.substr(0, 4) + "-" + date_part.substr(4, 2) + "-" + + date_part.substr(6, 2); + } + } + } + return ""; +} + +// compare two dates in YYYY-MM-DD format +bool IsNewerDate(const std::string& date1, const std::string& date2) { + if (date1.empty() || date2.empty()) return false; + // simple string comparison works for ISO date format (YYYY-MM-DD) + return date2 > date1; +} + bool IsNewerVersion(const std::string& current, const std::string& latest) { auto v1 = SplitVersion(ExtractNumericPart(current)); auto v2 = SplitVersion(ExtractNumericPart(latest)); @@ -51,6 +88,44 @@ bool IsNewerVersion(const std::string& current, const std::string& latest) { if (v2[i] > v1[i]) return true; if (v2[i] < v1[i]) return false; } + + // if versions are equal, compare by release date + if (!latest_release_date_.empty()) { + // try to extract date from current version string + std::string current_date = ExtractDateFromVersion(current); + if (!current_date.empty()) { + return IsNewerDate(current_date, latest_release_date_); + } else { + return true; + } + } + + return false; +} + +bool IsNewerVersionWithDate(const std::string& current_version, + const std::string& current_date, + const std::string& latest_version, + const std::string& latest_date) { + // compare versions + auto v1 = SplitVersion(ExtractNumericPart(current_version)); + auto v2 = SplitVersion(ExtractNumericPart(latest_version)); + + size_t len = std::max(v1.size(), v2.size()); + v1.resize(len, 0); + v2.resize(len, 0); + + for (size_t i = 0; i < len; ++i) { + if (v2[i] > v1[i]) return true; + if (v2[i] < v1[i]) return false; + } + + // if versions are equal, compare by release date + if (!current_date.empty() && !latest_date.empty()) { + return IsNewerDate(current_date, latest_date); + } + + // if dates are not available, versions are equal return false; } @@ -64,17 +139,27 @@ std::string CheckUpdate() { if (res->status == 200) { try { auto j = json::parse(res->body); - std::string latest = j["latest_version"]; + std::string latest = j["version"]; + if (j.contains("releaseDate") && j["releaseDate"].is_string()) { + latest_release_date_ = j["releaseDate"]; + } else { + latest_release_date_ = ""; + } return latest; } catch (std::exception&) { + latest_release_date_ = ""; return ""; } } else { + latest_release_date_ = ""; return ""; } } else { + latest_release_date_ = ""; return ""; } } + +std::string GetLatestReleaseDate() { return latest_release_date_; } } // namespace crossdesk #endif \ No newline at end of file