mirror of https://github.com/crytic/slither
This ensures PATH is correctly configured, and hints the user about what they might need to do to configure it correctly.pull/1550/head
parent
020d8638da
commit
4c759ca6a4
@ -0,0 +1,56 @@ |
||||
from pathlib import Path |
||||
from typing import List, Optional, Tuple |
||||
import shutil |
||||
import sysconfig |
||||
|
||||
from slither.utils.colors import yellow, green, red |
||||
|
||||
|
||||
def check_path_config(name: str) -> Tuple[bool, Optional[Path], List[Path]]: |
||||
binary_path = shutil.which(name) |
||||
possible_paths = [] |
||||
|
||||
for scheme in sysconfig.get_scheme_names(): |
||||
script_path = Path(sysconfig.get_path("scripts", scheme)) |
||||
purelib_path = Path(sysconfig.get_path("purelib", scheme)) |
||||
script_binary_path = shutil.which(name, path=script_path) |
||||
if script_binary_path is not None: |
||||
possible_paths.append((script_path, purelib_path)) |
||||
|
||||
binary_here = False |
||||
if binary_path is not None: |
||||
binary_path = Path(binary_path) |
||||
this_code = Path(__file__) |
||||
this_binary = list(filter(lambda x: this_code.is_relative_to(x[1]), possible_paths)) |
||||
binary_here = len(this_binary) > 0 and all( |
||||
binary_path.is_relative_to(script) for script, _ in this_binary |
||||
) |
||||
|
||||
return binary_here, binary_path, list(set(script for script, _ in possible_paths)) |
||||
|
||||
|
||||
def check_slither_path(**_kwargs) -> None: |
||||
binary_here, binary_path, possible_paths = check_path_config("slither") |
||||
show_paths = False |
||||
|
||||
if binary_path: |
||||
print(green(f"`slither` found in PATH at `{binary_path}`.")) |
||||
if binary_here: |
||||
print(green("Its location matches this slither-doctor installation.")) |
||||
else: |
||||
print( |
||||
yellow( |
||||
f"This path does not correspond to this slither-doctor installation.\n" |
||||
+ "Double-check the order of directories in PATH if you have several slither installations." |
||||
) |
||||
) |
||||
show_paths = True |
||||
else: |
||||
print(red("`slither` was not found in PATH.")) |
||||
show_paths = True |
||||
|
||||
if show_paths: |
||||
print() |
||||
print("Consider adding one of the following directories to PATH:") |
||||
for path in possible_paths: |
||||
print(f" * {path}") |
Loading…
Reference in new issue