Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion src/dstack/_internal/cli/utils/updates.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,22 @@ def _is_last_check_time_outdated() -> bool:
)


def is_update_available(current_version: str, latest_version: str) -> bool:
"""
Return True if latest_version is newer than current_version.
Pre-releases are only considered if the current version is also a pre-release.
"""
_current_version = pkg_version.parse(str(current_version))
_latest_version = pkg_version.parse(str(latest_version))
return _current_version < _latest_version and (
not _latest_version.is_prerelease or _current_version.is_prerelease
)


def _check_version():
latest_version = get_latest_version()
if latest_version is not None:
if pkg_version.parse(str(version.__version__)) < pkg_version.parse(latest_version):
if is_update_available(version.__version__, latest_version):
console.print(f"A new version of dstack is available: [code]{latest_version}[/]\n")


Expand Down
24 changes: 24 additions & 0 deletions src/tests/_internal/cli/utils/test_updates.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import pytest

from dstack._internal.cli.utils import updates


@pytest.mark.parametrize(
"current_version,latest_version,expected",
[
("1.0.0", "1.0.1", True), # patch update, both releases
("1.0.0", "2.0.0", True), # major update, both releases
("1.0.0", "1.0.0", False), # same version
("1.1.0", "1.0.9", False), # downgrade
("1.0.0a1", "1.0.0", True), # pre-release to release (should show update)
("1.0.0", "1.0.0a1", False), # release to pre-release (should NOT show update)
("1.0.0b1", "1.0.0b2", True), # beta to beta (should show update)
("1.0.0rc1", "1.0.0", True), # rc to release (should show update)
("1.0.0", "1.0.0rc1", False), # release to rc (should NOT show update)
("1.0.0a1", "1.0.0b1", True), # alpha to beta (should show update)
("1.0.0b1", "1.0.0rc1", True), # beta to rc (should show update)
("1.0.0rc1", "1.0.1a1", True), # rc to next alpha (should show update)
],
)
def test_is_update_available(current_version, latest_version, expected):
assert updates.is_update_available(current_version, latest_version) == expected
Loading