1
0
Fork 0
setup-script-py/src/util.py
developomp 3f2d77b862 replace all usage of os.system with src.util.run
- combine `system` and `silent_system` function int o `run`
- remove `zsh_system`
- replace alacritty terminal with kitty terminal
2022-07-07 10:20:36 +09:00

173 lines
4.4 KiB
Python

from importlib.machinery import SourceFileLoader
from os import system, makedirs, popen
from os.path import dirname
import requests
import zipfile
from src.log import error
import src.constants
def run(command: str, hide_stdout: bool = True, hide_stderr: bool = True) -> None:
"""os.system but has an option to hide stdout and/or stderr.
A copy of this function also exists in `setup.py`."""
if hide_stderr:
system(f"{command} &> /dev/null")
return
if hide_stdout:
system(f"{command} > /dev/null")
return
system(command)
def run_and_return(command: str) -> list[str]:
"""Runs command in system shell and return the result.
This is a blocking function.
Use this if you want to get the output of the command."""
return popen(command).readlines()
def paru_install(
packages: str | list[str], hide_stdout: bool = True, hide_stderr: bool = True
) -> None:
"""
Download arch linux packages (including AUR).
arguments:
packages: Either a string list of packages or a space-separated list of packages.
"""
if type(packages) == str:
pass
elif type(packages) == list:
packages = " ".join(packages)
else:
error("Invalid paru packages format.")
return
run(f"paru -S --noconfirm {packages}", hide_stdout, hide_stderr)
def flatpak_install(
packages: str, hide_stdout: bool = True, hide_stderr: bool = True
) -> None:
"""
Download packages from flathub.
arguments:
packages: space-separated list of packages.
"""
run(f"flatpak install -y {packages}", hide_stdout, hide_stderr)
def smart_mkdir(path: str) -> None:
"""
Recursively create directories if it doesn't exist already.
"""
try:
makedirs(path)
except OSError:
pass
def trash(path, hide_stdout: bool = True, hide_stderr: bool = True) -> None:
"""Moves a file or directory to freedesktop trash."""
try:
run(f"trash-put {path}", hide_stdout, hide_stderr)
except Exception as err:
print(f"Failed to remove: {path}")
raise err
def copy_file(
src_file: str,
mode="644",
sudo=False,
hide_stdout: bool = True,
hide_stderr: bool = True,
) -> None:
"""
Copies a file in the repo to the system.
If the `src_file` starts with `home/`, it maps to $HOME.
Otherwise, it maps to `/`.
This function automatically creates parent directories if they do not exist already.
parameters:
- src_file: A path-like object or string pointing to a file.
- mode: Permission mode (as in chmod). Defaults to 644 (rw-r--r--).
- sudo: Whether to run command as sudo or not.
"""
dst_file = str(src_file)
if dst_file.startswith("home/"):
dst_file = src.constants.home_dir + dst_file[4:]
else:
dst_file = "/" + dst_file
command = f"install -Dm{mode} {src.constants.content_dir}/{src_file} {dst_file}"
if sudo:
command = f"sudo {command}"
run(command, hide_stdout, hide_stderr)
def copy_directory(
src: str, dst: str, hide_stdout: bool = True, hide_stderr: bool = True
) -> None:
"""Copy a directory.
Automatically creates parent directory/directories of dst if it does not exist already
parameters:
src: A path-like object or string pointing to a directory.
dst: A path-like object or string pointing to a directory.
"""
run(f"cp -R {src} {dst}", hide_stdout, hide_stderr)
def load_dconf(
file_name: str, hide_stdout: bool = True, hide_stderr: bool = True
) -> None:
"""Loads dconf configuration"""
run(
f'dconf load / < "{src.constants.content_dir}/files/dconf/{file_name}"',
hide_stdout,
hide_stderr,
)
def download(file_name: str, url: str) -> None:
"""Downloads a file from a url."""
r = requests.get(url)
with open(file_name, "wb") as f:
f.write(r.content)
def unzip(zip_path: str, dst_dir: str) -> None:
"""Unzips a .zip file to a directory."""
smart_mkdir(dst_dir)
with zipfile.ZipFile(zip_path, "r") as zip_ref:
zip_ref.extractall(dst_dir)
def import_file(name, path) -> None:
return SourceFileLoader(name, path).load_module()
def command_exists(command: str) -> bool:
"""Check if a command can be found in the current default shell.
A copy of this function also exists in `setup.py`."""
return len(run_and_return(f"command -v {command}")) == 1