Skip to content

Commit

Permalink
slither-doctor: add new PATH checks
Browse files Browse the repository at this point in the history
This ensures PATH is correctly configured, and hints the user about
what they might need to do to configure it correctly.
  • Loading branch information
elopez committed Jan 4, 2023
1 parent 020d863 commit 4c759ca
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 0 deletions.
2 changes: 2 additions & 0 deletions slither/tools/doctor/checks/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from typing import Callable, List
from dataclasses import dataclass

from slither.tools.doctor.checks.paths import check_slither_path
from slither.tools.doctor.checks.platform import compile_project, detect_platform
from slither.tools.doctor.checks.versions import show_versions

Expand All @@ -12,6 +13,7 @@ class Check:


ALL_CHECKS: List[Check] = [
Check("PATH configuration", check_slither_path),
Check("Software versions", show_versions),
Check("Project platform", detect_platform),
Check("Project compilation", compile_project),
Expand Down
56 changes: 56 additions & 0 deletions slither/tools/doctor/checks/paths.py
Original file line number Diff line number Diff line change
@@ -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}")

0 comments on commit 4c759ca

Please sign in to comment.