mirror of
https://github.com/kunkundi/crossdesk.git
synced 2025-12-17 04:26:47 +08:00
[chore] update version format
This commit is contained in:
@@ -12,11 +12,15 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <nlohmann/json.hpp>
|
#include <nlohmann/json.hpp>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
using json = nlohmann::json;
|
using json = nlohmann::json;
|
||||||
|
|
||||||
namespace crossdesk {
|
namespace crossdesk {
|
||||||
|
|
||||||
|
static std::string latest_release_date_ = "";
|
||||||
|
|
||||||
std::string ExtractNumericPart(const std::string& ver) {
|
std::string ExtractNumericPart(const std::string& ver) {
|
||||||
size_t start = 0;
|
size_t start = 0;
|
||||||
while (start < ver.size() && !std::isdigit(ver[start])) start++;
|
while (start < ver.size() && !std::isdigit(ver[start])) start++;
|
||||||
@@ -39,6 +43,39 @@ std::vector<int> SplitVersion(const std::string& ver) {
|
|||||||
return nums;
|
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) {
|
bool IsNewerVersion(const std::string& current, const std::string& latest) {
|
||||||
auto v1 = SplitVersion(ExtractNumericPart(current));
|
auto v1 = SplitVersion(ExtractNumericPart(current));
|
||||||
auto v2 = SplitVersion(ExtractNumericPart(latest));
|
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 true;
|
||||||
if (v2[i] < v1[i]) return false;
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -64,17 +139,27 @@ std::string CheckUpdate() {
|
|||||||
if (res->status == 200) {
|
if (res->status == 200) {
|
||||||
try {
|
try {
|
||||||
auto j = json::parse(res->body);
|
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;
|
return latest;
|
||||||
} catch (std::exception&) {
|
} catch (std::exception&) {
|
||||||
|
latest_release_date_ = "";
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
latest_release_date_ = "";
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
latest_release_date_ = "";
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string GetLatestReleaseDate() { return latest_release_date_; }
|
||||||
} // namespace crossdesk
|
} // namespace crossdesk
|
||||||
#endif
|
#endif
|
||||||
Reference in New Issue
Block a user