70 lines
1.8 KiB
Python
70 lines
1.8 KiB
Python
#!/usr/bin/env python3
|
|
"""Install checkmake if it is not already present.
|
|
|
|
Tries to install via Go if available, otherwise downloads the latest
|
|
pre-built Linux binary from the official GitHub releases.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import platform
|
|
import shutil
|
|
import subprocess # nosec B404
|
|
import urllib.request
|
|
from pathlib import Path
|
|
|
|
import click
|
|
|
|
CHECKMAKE_VERSION = "0.3.2"
|
|
RELEASE_URL_TEMPLATE = (
|
|
"https://github.com/checkmake/checkmake/releases/download/"
|
|
f"v{CHECKMAKE_VERSION}/checkmake-v{CHECKMAKE_VERSION}.linux.{{arch}}"
|
|
)
|
|
TARGET_PATH = Path("/usr/local/bin/checkmake")
|
|
|
|
|
|
def _arch() -> str:
|
|
"""Return the architecture string used by checkmake releases."""
|
|
machine = platform.machine().lower()
|
|
if machine in {"x86_64", "amd64"}:
|
|
return "amd64"
|
|
if machine in {"aarch64", "arm64"}:
|
|
return "arm64"
|
|
raise click.ClickException(f"Unsupported architecture: {machine}")
|
|
|
|
|
|
def _install_with_go() -> bool:
|
|
"""Install checkmake using go install if Go is available."""
|
|
go_bin = shutil.which("go")
|
|
if go_bin is None:
|
|
return False
|
|
subprocess.run( # nosec B603
|
|
[
|
|
go_bin,
|
|
"install",
|
|
"github.com/checkmake/checkmake/cmd/checkmake@latest",
|
|
],
|
|
check=True,
|
|
)
|
|
return True
|
|
|
|
|
|
def _download_binary() -> None:
|
|
"""Download the prebuilt checkmake binary for the current architecture."""
|
|
url = RELEASE_URL_TEMPLATE.format(arch=_arch())
|
|
urllib.request.urlretrieve(url, TARGET_PATH) # nosec B310
|
|
TARGET_PATH.chmod(0o755)
|
|
|
|
|
|
def main() -> None:
|
|
"""Install checkmake if not already present."""
|
|
if shutil.which("checkmake") is not None:
|
|
return
|
|
|
|
if not _install_with_go():
|
|
_download_binary()
|
|
|
|
|
|
if __name__ == "__main__": # pragma: no cover
|
|
main() # pragma: no cover
|