|
from __future__ import annotations |
|
|
|
import os |
|
import sys |
|
import sysconfig |
|
|
|
|
|
def find_ruff_bin() -> str: |
|
"""Return the ruff binary path.""" |
|
|
|
ruff_exe = "ruff" + sysconfig.get_config_var("EXE") |
|
|
|
scripts_path = os.path.join(sysconfig.get_path("scripts"), ruff_exe) |
|
if os.path.isfile(scripts_path): |
|
return scripts_path |
|
|
|
if sys.version_info >= (3, 10): |
|
user_scheme = sysconfig.get_preferred_scheme("user") |
|
elif os.name == "nt": |
|
user_scheme = "nt_user" |
|
elif sys.platform == "darwin" and sys._framework: |
|
user_scheme = "osx_framework_user" |
|
else: |
|
user_scheme = "posix_user" |
|
|
|
user_path = os.path.join( |
|
sysconfig.get_path("scripts", scheme=user_scheme), ruff_exe |
|
) |
|
if os.path.isfile(user_path): |
|
return user_path |
|
|
|
|
|
pkg_root = os.path.dirname(os.path.dirname(__file__)) |
|
target_path = os.path.join(pkg_root, "bin", ruff_exe) |
|
if os.path.isfile(target_path): |
|
return target_path |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
paths = os.environ.get("PATH", "").split(os.pathsep) |
|
if len(paths) >= 2: |
|
|
|
def get_last_three_path_parts(path: str) -> list[str]: |
|
"""Return a list of up to the last three parts of a path.""" |
|
parts = [] |
|
|
|
while len(parts) < 3: |
|
head, tail = os.path.split(path) |
|
if tail or head != path: |
|
parts.append(tail) |
|
path = head |
|
else: |
|
parts.append(path) |
|
break |
|
|
|
return parts |
|
|
|
maybe_overlay = get_last_three_path_parts(paths[0]) |
|
maybe_normal = get_last_three_path_parts(paths[1]) |
|
if ( |
|
len(maybe_normal) >= 3 |
|
and maybe_normal[-1].startswith("pip-build-env-") |
|
and maybe_normal[-2] == "normal" |
|
and len(maybe_overlay) >= 3 |
|
and maybe_overlay[-1].startswith("pip-build-env-") |
|
and maybe_overlay[-2] == "overlay" |
|
): |
|
|
|
candidate = os.path.join(paths[0], ruff_exe) |
|
if os.path.isfile(candidate): |
|
return candidate |
|
|
|
raise FileNotFoundError(scripts_path) |
|
|
|
|
|
if __name__ == "__main__": |
|
ruff = find_ruff_bin() |
|
if sys.platform == "win32": |
|
import subprocess |
|
|
|
completed_process = subprocess.run([ruff, *sys.argv[1:]]) |
|
sys.exit(completed_process.returncode) |
|
else: |
|
os.execvp(ruff, [ruff, *sys.argv[1:]]) |
|
|