fix(cli): overwrite stale poetry.lock backup on windows (#7463)
Some checks failed
CodeQL Advanced / Analyze (python) (push) Has been cancelled
CodeQL Advanced / Analyze (actions) (push) Has been cancelled
Vulnerability Scan / Detect changes (push) Has been cancelled
Vulnerability Scan / pip-audit (push) Has been cancelled

* fix(cli): overwrite stale poetry.lock backup on windows

os.rename raises FileExistsError on Windows when poetry-old.lock already
exists from a previous run, so a second `crewai update` crashed there
while POSIX silently replaced the file. Use os.replace, which overwrites
on every platform, and add a regression test.

* test(cli): add docstrings to update_crew tests

---------

Co-authored-by: Vidit Ostwal <110953813+Vidit-Ostwal@users.noreply.github.com>
This commit is contained in:
Sharoon Sharif
2026-09-15 09:37:03 -06:00
committed by GitHub
parent b66f3f215a
commit 0e2fa7ec24
2 changed files with 64 additions and 1 deletions

View File

@@ -89,7 +89,7 @@ def migrate_pyproject(input_file: str, output_file: str) -> None:
lock_file = "poetry.lock"
lock_backup = "poetry-old.lock"
if os.path.exists(lock_file):
os.rename(lock_file, lock_backup)
os.replace(lock_file, lock_backup)
else:
pass

View File

@@ -0,0 +1,63 @@
"""Tests for the ``crewai update`` pyproject migration."""
from pathlib import Path
import pytest
from crewai_cli.update_crew import migrate_pyproject
_POETRY_PYPROJECT = """\
[tool.poetry]
name = "demo"
version = "0.1.0"
description = "demo crew"
authors = ["Demo Author <demo@example.com>"]
[tool.poetry.dependencies]
python = ">=3.10,<3.14"
crewai = "^1.0.0"
"""
def _write_project(tmp_path: Path) -> None:
"""Create a minimal Poetry-style project with a lock file in ``tmp_path``."""
(tmp_path / "pyproject.toml").write_text(_POETRY_PYPROJECT, encoding="utf-8")
(tmp_path / "poetry.lock").write_text("current lock\n", encoding="utf-8")
def test_migrate_pyproject_backs_up_lock_file(
tmp_path: Path, monkeypatch: pytest.MonkeyPatch
) -> None:
"""The migration renames ``poetry.lock`` to ``poetry-old.lock`` and backs up pyproject."""
monkeypatch.chdir(tmp_path)
_write_project(tmp_path)
migrate_pyproject("pyproject.toml", "pyproject.toml")
assert not (tmp_path / "poetry.lock").exists()
assert (tmp_path / "poetry-old.lock").read_text(encoding="utf-8") == (
"current lock\n"
)
assert (tmp_path / "pyproject-old.toml").exists()
def test_migrate_pyproject_overwrites_existing_lock_backup(
tmp_path: Path, monkeypatch: pytest.MonkeyPatch
) -> None:
"""A second ``crewai update`` must replace a stale ``poetry-old.lock``.
``os.rename`` refuses to overwrite an existing destination on Windows
(``FileExistsError``) while POSIX replaces it silently, so re-running the
migration used to fail only on Windows.
"""
monkeypatch.chdir(tmp_path)
_write_project(tmp_path)
(tmp_path / "poetry-old.lock").write_text("stale backup\n", encoding="utf-8")
migrate_pyproject("pyproject.toml", "pyproject.toml")
assert not (tmp_path / "poetry.lock").exists()
assert (tmp_path / "poetry-old.lock").read_text(encoding="utf-8") == (
"current lock\n"
)