From 4aefe523938f7176be0bcaa03b6f126c8ae783fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bern=C3=A1t=20G=C3=A1bor?= Date: Thu, 3 Oct 2024 10:38:07 -0700 Subject: [PATCH] Support ruff discovery in pip build environments (#13591) Resolves https://github.com/astral-sh/ruff/issues/13321. Contents of overlay: ```bash /private/var/folders/v0/l8q3ghks2gs5ns2_p63tyqh40000gq/T/pip-build-env-e0ukpbvo/overlay/bin: total 26M -rwxr-xr-x 1 bgabor8 staff 26M Oct 1 08:22 ruff drwxr-xr-x 3 bgabor8 staff 96 Oct 1 08:22 . drwxr-xr-x 4 bgabor8 staff 128 Oct 1 08:22 .. ``` Python executable: ```bash '/Users/bgabor8/git/github/ruff-find-bin-during-build/.venv/bin/python' ``` PATH is: ```bash ['/private/var/folders/v0/l8q3ghks2gs5ns2_p63tyqh40000gq/T/pip-build-env-e0ukpbvo/overlay/bin', '/private/var/folders/v0/l8q3ghks2gs5ns2_p63tyqh40000gq/T/pip-build-env-e0ukpbvo/normal/bin', '/Library/Frameworks/Python.framework/Versions/3.11/bin', '/Library/Frameworks/Python.framework/Versions/3.12/bin', ``` Not sure where to add tests, there does not seem to be any existing one. Can someone help me with that? --- python/ruff/__main__.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/python/ruff/__main__.py b/python/ruff/__main__.py index 9db95031bc..d536867ad2 100644 --- a/python/ruff/__main__.py +++ b/python/ruff/__main__.py @@ -33,6 +33,27 @@ def find_ruff_bin() -> str: if os.path.isfile(target_path): return target_path + # Search for pip-specific build environments. + # + # See: https://github.com/pypa/pip/blob/102d8187a1f5a4cd5de7a549fd8a9af34e89a54f/src/pip/_internal/build_env.py#L87 + paths = os.environ.get("PATH", "").split(os.pathsep) + if len(paths) >= 2: + first, second = os.path.split(paths[0]), os.path.split(paths[1]) + # Search for both an `overlay` and `normal` folder within a `pip-build-env-{random}` folder. (The final segment + # of the path is the `bin` directory.) + if ( + len(first) >= 3 + and len(second) >= 3 + and first[-3].startswith("pip-build-env-") + and first[-2] == "overlay" + and second[-3].startswith("pip-build-env-") + and second[-2] == "normal" + ): + # The overlay must contain the ruff binary. + candidate = os.path.join(first, ruff_exe) + if os.path.isfile(candidate): + return candidate + raise FileNotFoundError(scripts_path)