diff --git a/src/poetry/utils/env.py b/src/poetry/utils/env.py index 6d998a79dde..c691e18f462 100644 --- a/src/poetry/utils/env.py +++ b/src/poetry/utils/env.py @@ -1072,7 +1072,8 @@ def get_base_prefix(cls) -> Path: def generate_env_name(cls, name: str, cwd: str) -> str: name = name.lower() sanitized_name = re.sub(r'[ $`!*@"\\\r\n\t]', "_", name)[:42] - h = hashlib.sha256(encode(cwd)).digest() + normalized_cwd = os.path.normcase(cwd) + h = hashlib.sha256(encode(normalized_cwd)).digest() h = base64.urlsafe_b64encode(h).decode()[:8] return f"{sanitized_name}-{h}" diff --git a/tests/utils/test_env.py b/tests/utils/test_env.py index 97a56c4e830..0969c4d4f25 100644 --- a/tests/utils/test_env.py +++ b/tests/utils/test_env.py @@ -1120,3 +1120,12 @@ def test_create_venv_accepts_fallback_version_w_nonzero_patchlevel( with_setuptools=True, with_wheel=True, ) + + +def test_generate_env_name_ignores_case_for_case_insensitive_fs(tmp_dir): + venv_name1 = EnvManager.generate_env_name("simple-project", "MyDiR") + venv_name2 = EnvManager.generate_env_name("simple-project", "mYdIr") + if sys.platform == "win32": + assert venv_name1 == venv_name2 + else: + assert venv_name1 != venv_name2