updater: Compare all parts of the version number

This should fix the case where comparing '0.12.0b164' with '0.12.0a169' results in it claiming the former is newer. Also should fix the case where stable releases would always be treated as older.

Fixes #1015
This commit is contained in:
Michael Fabian 'Xaymar' Dirks 2023-01-17 13:04:40 +01:00
parent b15fd787b6
commit ad422895fa

View file

@ -1,4 +1,4 @@
// Copyright (c) 2020 Michael Fabian Dirks <info@xaymar.com> // Copyright (c) 2020-2023 Michael Fabian Dirks <info@xaymar.com>
// //
// Permission is hereby granted, free of charge, to any person obtaining a copy // Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal // of this software and associated documentation files (the "Software"), to deal
@ -168,49 +168,63 @@ void streamfx::from_json(const nlohmann::json& json, version_info& info)
bool streamfx::version_info::is_older_than(const version_info other) bool streamfx::version_info::is_older_than(const version_info other)
{ {
// 'true' if other is newer, otherwise false. // 'true' if other is newer, otherwise false.
// Except for stable releases, this simply compares the numbers of the version.
// 1. Compare Major version: // Compare Major version:
// A. Ours is greater: Remote is older. // - Theirs is greater: Remote is newer.
// B. Theirs is greater: Remote is newer. // - Ours is greater: Remote is older.
// C. Continue the check. // - Continue the check.
if (major > other.major)
return false;
if (major < other.major) if (major < other.major)
return true; return true;
if (major > other.major)
// 2. Compare Minor version:
// A. Ours is greater: Remote is older.
// B. Theirs is greater: Remote is newer.
// C. Continue the check.
if (minor > other.minor)
return false; return false;
// Compare Minor version:
// - Theirs is greater: Remote is newer.
// - Ours is greater: Remote is older.
// - Continue the check.
if (minor < other.minor) if (minor < other.minor)
return true; return true;
if (minor > other.minor)
// 3. Compare Patch version:
// A. Ours is greater: Remote is older.
// B. Theirs is greater: Remote is newer.
// C. Continue the check.
if (patch > other.patch)
return false; return false;
// Compare Patch version:
// - Theirs is greater: Remote is newer.
// - Ours is greater: Remote is older.
// - Continue the check.
if (patch < other.patch) if (patch < other.patch)
return true; return true;
if (patch > other.patch)
return false;
// 4. Compare Type: // Compare Tweak and Stage version:
// A. Outs is smaller: Remote is older. // - Theirs is greater: Remote is newer.
// B. Theirs is smaller: Remote is newer. // - Ours is greater: Special logic.
// C. Continue the check. // - Continue the check.
if (tweak < other.tweak)
return true;
if ((tweak > other.tweak) && (other.stage != version_stage::STABLE)) {
// If the remote isn't a stable release, it's always considered older.
return false;
// 0.12.0 vs 0.12.0
// Major: equal, continue
// Minor: equal, continue
// Patch: equal, continue
// Tweak: equal, continue
// Ours is older?
}
// As a last effort, compare the stage.
// - Theirs is greater: Remote is older.
// - Ours is greater: Remote is newer.
// - Continue the check.
if (stage < other.stage) if (stage < other.stage)
return false; return false;
if (stage > other.stage) if (stage > other.stage)
return true; return true;
// 5. Compare Tweak: // If there are no further tests, assume this version is older.
// A. Ours is greater or equal: Remote is older or identical.
// B. Remote is newer
if (tweak >= other.tweak)
return false;
return true; return true;
} }