Skip to content

Commit 3caddcb

Browse files
[Feature]: Only show update notices for stable releases #2697 (#2698)
1 parent f0a149b commit 3caddcb

File tree

2 files changed

+37
-1
lines changed

2 files changed

+37
-1
lines changed

src/dstack/_internal/cli/utils/updates.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,22 @@ def _is_last_check_time_outdated() -> bool:
5757
)
5858

5959

60+
def is_update_available(current_version: str, latest_version: str) -> bool:
61+
"""
62+
Return True if latest_version is newer than current_version.
63+
Pre-releases are only considered if the current version is also a pre-release.
64+
"""
65+
_current_version = pkg_version.parse(str(current_version))
66+
_latest_version = pkg_version.parse(str(latest_version))
67+
return _current_version < _latest_version and (
68+
not _latest_version.is_prerelease or _current_version.is_prerelease
69+
)
70+
71+
6072
def _check_version():
6173
latest_version = get_latest_version()
6274
if latest_version is not None:
63-
if pkg_version.parse(str(version.__version__)) < pkg_version.parse(latest_version):
75+
if is_update_available(version.__version__, latest_version):
6476
console.print(f"A new version of dstack is available: [code]{latest_version}[/]\n")
6577

6678

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import pytest
2+
3+
from dstack._internal.cli.utils import updates
4+
5+
6+
@pytest.mark.parametrize(
7+
"current_version,latest_version,expected",
8+
[
9+
("1.0.0", "1.0.1", True), # patch update, both releases
10+
("1.0.0", "2.0.0", True), # major update, both releases
11+
("1.0.0", "1.0.0", False), # same version
12+
("1.1.0", "1.0.9", False), # downgrade
13+
("1.0.0a1", "1.0.0", True), # pre-release to release (should show update)
14+
("1.0.0", "1.0.0a1", False), # release to pre-release (should NOT show update)
15+
("1.0.0b1", "1.0.0b2", True), # beta to beta (should show update)
16+
("1.0.0rc1", "1.0.0", True), # rc to release (should show update)
17+
("1.0.0", "1.0.0rc1", False), # release to rc (should NOT show update)
18+
("1.0.0a1", "1.0.0b1", True), # alpha to beta (should show update)
19+
("1.0.0b1", "1.0.0rc1", True), # beta to rc (should show update)
20+
("1.0.0rc1", "1.0.1a1", True), # rc to next alpha (should show update)
21+
],
22+
)
23+
def test_is_update_available(current_version, latest_version, expected):
24+
assert updates.is_update_available(current_version, latest_version) == expected

0 commit comments

Comments
 (0)