mirror of
https://github.com/ItsDrike/dotfiles.git
synced 2024-12-26 13:14:35 +00:00
Run ruff linter on sync.py script
This commit is contained in:
parent
55a70492a2
commit
c900d14516
50
sync.py
50
sync.py
|
@ -10,7 +10,7 @@ import sys
|
||||||
from collections.abc import Iterable, Iterator, Sequence
|
from collections.abc import Iterable, Iterator, Sequence
|
||||||
from enum import Enum, auto
|
from enum import Enum, auto
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import NamedTuple, Optional
|
from typing import NamedTuple
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import rich
|
import rich
|
||||||
|
@ -24,7 +24,7 @@ DOTHOMEDIR = Path("./home")
|
||||||
HOMEDIR = Path(f"~{os.environ.get('SUDO_USER', os.getlogin())}") # Make sure we use correct home even in sudo
|
HOMEDIR = Path(f"~{os.environ.get('SUDO_USER', os.getlogin())}") # Make sure we use correct home even in sudo
|
||||||
|
|
||||||
|
|
||||||
def yes_no(prompt: str, default: Optional[bool] = None) -> bool:
|
def yes_no(prompt: str, default: bool | None = None) -> bool:
|
||||||
"""Get a yes/no answer to given prompt by the user."""
|
"""Get a yes/no answer to given prompt by the user."""
|
||||||
if default is None:
|
if default is None:
|
||||||
prompt += " [y/n]: "
|
prompt += " [y/n]: "
|
||||||
|
@ -39,9 +39,9 @@ def yes_no(prompt: str, default: Optional[bool] = None) -> bool:
|
||||||
inp = input(prompt).lower()
|
inp = input(prompt).lower()
|
||||||
if inp in {"y", "yes"}:
|
if inp in {"y", "yes"}:
|
||||||
return True
|
return True
|
||||||
elif inp in {"n", "no"}:
|
if inp in {"n", "no"}:
|
||||||
return False
|
return False
|
||||||
elif inp == "" and default is not None:
|
if inp == "" and default is not None:
|
||||||
return default
|
return default
|
||||||
|
|
||||||
|
|
||||||
|
@ -125,17 +125,18 @@ def compare_files(dot_file: Path, sys_file: Path) -> DiffStatus:
|
||||||
if sys_file.is_symlink():
|
if sys_file.is_symlink():
|
||||||
if dot_file.readlink() == sys_file.readlink():
|
if dot_file.readlink() == sys_file.readlink():
|
||||||
return DiffStatus.MATCH
|
return DiffStatus.MATCH
|
||||||
else:
|
|
||||||
# In case the sys_file link uses an absolute path, make sure
|
# In case the sys_file link uses an absolute path, make sure
|
||||||
# it points to the same location, even if that location is a
|
# it points to the same location, even if that location is a
|
||||||
# symlink.
|
# symlink.
|
||||||
dot_target = sys_file.parent.joinpath(dot_file.readlink()).absolute()
|
dot_target = sys_file.parent.joinpath(dot_file.readlink()).absolute()
|
||||||
sys_target = sys_file.parent.joinpath(sys_file.readlink()).absolute()
|
sys_target = sys_file.parent.joinpath(sys_file.readlink()).absolute()
|
||||||
if dot_target == sys_target:
|
if dot_target == sys_target:
|
||||||
return DiffStatus.MATCH
|
return DiffStatus.MATCH
|
||||||
return DiffStatus.SYMLINK_DIFFERS
|
return DiffStatus.SYMLINK_DIFFERS
|
||||||
return DiffStatus.EXPECTED_SYMLINK
|
return DiffStatus.EXPECTED_SYMLINK
|
||||||
elif sys_file.is_symlink():
|
|
||||||
|
if sys_file.is_symlink():
|
||||||
return DiffStatus.UNEXPECTED_SYMLINK
|
return DiffStatus.UNEXPECTED_SYMLINK
|
||||||
|
|
||||||
if sys_file.is_dir():
|
if sys_file.is_dir():
|
||||||
|
@ -223,7 +224,7 @@ class FixChoice(Enum):
|
||||||
SKIP = auto()
|
SKIP = auto()
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def pick(cls, file_path: Path, system_type: Optional[str], dotfile_type: str) -> FixChoice:
|
def pick(cls, file_path: Path, system_type: str | None, dotfile_type: str) -> FixChoice:
|
||||||
if system_type is None:
|
if system_type is None:
|
||||||
overwrite_system_prompt = f"Create non-existing {dotfile_type}"
|
overwrite_system_prompt = f"Create non-existing {dotfile_type}"
|
||||||
overwrite_dotfile_prompt = f"Delete dotfile {dotfile_type}"
|
overwrite_dotfile_prompt = f"Delete dotfile {dotfile_type}"
|
||||||
|
@ -247,7 +248,7 @@ class FixChoice(Enum):
|
||||||
return cls.OVERWRITE_DOTFILE
|
return cls.OVERWRITE_DOTFILE
|
||||||
if answer == partial_prompt:
|
if answer == partial_prompt:
|
||||||
return cls.PARTIAL_OVERWRITE
|
return cls.PARTIAL_OVERWRITE
|
||||||
elif answer == "Skip this fix":
|
if answer == "Skip this fix":
|
||||||
return cls.SKIP
|
return cls.SKIP
|
||||||
|
|
||||||
raise Exception("Invalid answer, this can't happen")
|
raise Exception("Invalid answer, this can't happen")
|
||||||
|
@ -273,7 +274,7 @@ def _overwrite_file(source: Path, target: Path, partial: bool = False):
|
||||||
else:
|
else:
|
||||||
raise ValueError("No diff tool installed, please install neovim or vim")
|
raise ValueError("No diff tool installed, please install neovim or vim")
|
||||||
|
|
||||||
subprocess.run([*prog, str(source), str(target)])
|
subprocess.run([*prog, str(source), str(target)], check=True) # noqa: S603
|
||||||
return
|
return
|
||||||
|
|
||||||
# Remove the target, if it already exists
|
# Remove the target, if it already exists
|
||||||
|
@ -348,7 +349,9 @@ def show_diffs(diffs: Iterable[FileDiff], ask_show_diff: bool, apply_fix_prompt:
|
||||||
continue
|
continue
|
||||||
case DiffStatus.CONTENT_DIFFERS:
|
case DiffStatus.CONTENT_DIFFERS:
|
||||||
if ask_show_diff is False or yes_no(f"Show diff for {diff.sys_file}?"):
|
if ask_show_diff is False or yes_no(f"Show diff for {diff.sys_file}?"):
|
||||||
subprocess.run(["git", "diff", str(diff.dot_file), str(diff.sys_file)])
|
subprocess.run(
|
||||||
|
["git", "diff", str(diff.dot_file), str(diff.sys_file)], check=True # noqa: S607,S603
|
||||||
|
)
|
||||||
case _:
|
case _:
|
||||||
_str_status = diff.status.name.replace("_", " ")
|
_str_status = diff.status.name.replace("_", " ")
|
||||||
print(f"Skipping {diff.sys_file} diff for status: {_str_status}")
|
print(f"Skipping {diff.sys_file} diff for status: {_str_status}")
|
||||||
|
@ -370,14 +373,13 @@ def exclude_fun(diff: FileDiff) -> bool:
|
||||||
lambda d: Path("root/usr/share/zsh/site-functions/zsh-syntax-highlighting") in d.rel_dot_file.parents,
|
lambda d: Path("root/usr/share/zsh/site-functions/zsh-syntax-highlighting") in d.rel_dot_file.parents,
|
||||||
lambda d: Path("root/usr/share/zsh/site-functions/zsh-autosuggestions") in d.rel_dot_file.parents,
|
lambda d: Path("root/usr/share/zsh/site-functions/zsh-autosuggestions") in d.rel_dot_file.parents,
|
||||||
lambda d: Path("home/.cache/zsh/history") == d.rel_dot_file and d.status is DiffStatus.CONTENT_DIFFERS,
|
lambda d: Path("home/.cache/zsh/history") == d.rel_dot_file and d.status is DiffStatus.CONTENT_DIFFERS,
|
||||||
lambda d: Path("home/.config/nomacs/Image Lounge.conf") == d.rel_dot_file and d.status is DiffStatus.CONTENT_DIFFERS,
|
lambda d: Path("home/.config/nomacs/Image Lounge.conf") == d.rel_dot_file
|
||||||
lambda d: Path("home/.config/pcmanfm/default/pcmanfm.conf") == d.rel_dot_file and d.status is DiffStatus.CONTENT_DIFFERS,
|
and d.status is DiffStatus.CONTENT_DIFFERS,
|
||||||
|
lambda d: Path("home/.config/pcmanfm/default/pcmanfm.conf") == d.rel_dot_file
|
||||||
|
and d.status is DiffStatus.CONTENT_DIFFERS,
|
||||||
]
|
]
|
||||||
|
|
||||||
for exc_rule in EXCLUDE_RULES:
|
return all(not exc_rule(diff) for exc_rule in EXCLUDE_RULES)
|
||||||
if exc_rule(diff):
|
|
||||||
return False
|
|
||||||
return True
|
|
||||||
|
|
||||||
|
|
||||||
def get_args() -> argparse.Namespace:
|
def get_args() -> argparse.Namespace:
|
||||||
|
|
Loading…
Reference in a new issue