parent
de9e9842f8
commit
1a31fcc29d
@ -1 +1,2 @@
|
||||
backup
|
||||
__pycache__
|
||||
|
@ -0,0 +1,15 @@
|
||||
{
|
||||
"home_files": [
|
||||
".bash_profile",
|
||||
".bashrc",
|
||||
".screenrc",
|
||||
".tmux.conf",
|
||||
".vimrc",
|
||||
".config/htop/htoprc",
|
||||
".config/lazydocker/config.yml"
|
||||
],
|
||||
"home_dirs": [
|
||||
".vim/pack",
|
||||
".vim/ftplugin"
|
||||
]
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
installs preferences
|
||||
"""
|
||||
from installer import Installer
|
||||
installer = Installer.from_cli_args()
|
||||
installer.run()
|
@ -0,0 +1,156 @@
|
||||
"""
|
||||
just exists to define our installer
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import json
|
||||
import logging
|
||||
import os
|
||||
import pathlib
|
||||
import platform
|
||||
import subprocess
|
||||
import shutil
|
||||
|
||||
from functools import cached_property
|
||||
|
||||
class Installer:
|
||||
"""
|
||||
manages the installation of preferences files
|
||||
"""
|
||||
def __init__(self, quiet=False, verbose=False):
|
||||
log_level = logging.INFO
|
||||
if verbose:
|
||||
log_level = logging.DEBUG
|
||||
if quiet:
|
||||
log_level = logging.ERROR
|
||||
logging.basicConfig(level=log_level, format='')
|
||||
self.log = logging.getLogger('install')
|
||||
self.config_path = "include.json"
|
||||
|
||||
@classmethod
|
||||
def from_cli_args(cls):
|
||||
"""
|
||||
builds an installer from CLI arguments
|
||||
"""
|
||||
args = cls.parse_cli()
|
||||
installer = cls(quiet=args.quiet, verbose=args.verbose)
|
||||
return installer
|
||||
|
||||
@classmethod
|
||||
def parse_cli(cls):
|
||||
"""
|
||||
parses our cli arguments
|
||||
"""
|
||||
parser = argparse.ArgumentParser(
|
||||
prog = 'install',
|
||||
description = 'installs my preferences',
|
||||
epilog = 'this should work on a bunch of different environments')
|
||||
parser.add_argument('-v', '--verbose', action='store_true')
|
||||
parser.add_argument('-q', '--quiet', action='store_true')
|
||||
return parser.parse_args()
|
||||
|
||||
def run(self):
|
||||
"""
|
||||
runs the install process
|
||||
"""
|
||||
if home_files := self.config.get('home_files'):
|
||||
for name in home_files:
|
||||
self.install_home_file(name)
|
||||
|
||||
def install_home_file(self, name):
|
||||
"""
|
||||
installs a given file
|
||||
"""
|
||||
self.log.debug("install: %s", name)
|
||||
|
||||
source_path = self.prefs_dir / name
|
||||
self.log.debug(" source: %s", source_path)
|
||||
if not source_path.exists():
|
||||
self.log.warning("home file source path %s does not exist", source_path)
|
||||
return
|
||||
|
||||
if not source_path.is_file():
|
||||
self.log.warning("home file source path %s is not a file", source_path)
|
||||
return
|
||||
|
||||
if self.is_linux:
|
||||
target_path = pathlib.Path.home() / name
|
||||
self.log.debug(" target: %s", target_path)
|
||||
if target_path.exists():
|
||||
self.log.debug(" target path exists")
|
||||
if target_path.is_symlink():
|
||||
self.log.debug(" is symlink")
|
||||
if target_path.resolve() == source_path:
|
||||
self.log.debug(" up to date")
|
||||
else:
|
||||
self.log.info("%s -> %s", target_path, source_path)
|
||||
target_path.symlink_to(source_path)
|
||||
else:
|
||||
self.log.info("%s -> %s", target_path, source_path)
|
||||
target_path.symlink_to(source_path)
|
||||
else:
|
||||
self.log.info("%s -> %s", target_path, source_path)
|
||||
target_path.symlink_to(source_path)
|
||||
|
||||
if self.is_wsl:
|
||||
target_path = self.windows_home_dir / pathlib.PureWindowsPath(name)
|
||||
self.log.debug(" target: %s", target_path)
|
||||
if target_path.exists():
|
||||
self.log.debug(" target path exists, will remove")
|
||||
target_path.unlink()
|
||||
shutil.copy(source_path, target_path)
|
||||
|
||||
@cached_property
|
||||
def config(self):
|
||||
"""
|
||||
loads the json configuration
|
||||
"""
|
||||
with open(self.config_path, 'r', encoding='utf-8') as config_fp:
|
||||
self.log.debug("loading config from path %s", self.config_path)
|
||||
return json.load(config_fp)
|
||||
|
||||
@property
|
||||
def prefs_dir(self):
|
||||
"""
|
||||
directory containing our preferences repo
|
||||
"""
|
||||
return pathlib.Path(os.path.dirname(os.path.realpath(__file__)))
|
||||
|
||||
@classmethod
|
||||
@cached_property
|
||||
def is_linux(cls):
|
||||
"""
|
||||
true if we're on linux (including WSL), false otherwise
|
||||
"""
|
||||
return platform.system() == 'Linux'
|
||||
|
||||
@classmethod
|
||||
@cached_property
|
||||
def is_wsl(cls):
|
||||
"""
|
||||
true if we're running Linux on WSL
|
||||
"""
|
||||
return 'WSL2' in platform.platform()
|
||||
|
||||
@cached_property
|
||||
def windows_home_dir(self):
|
||||
"""
|
||||
Finds the home directory of the user's Windows home directory and
|
||||
returns it as a Posix path representing its mount point from the
|
||||
perspective of WSL.
|
||||
"""
|
||||
if not self.is_wsl:
|
||||
raise Exception("cannot get windows home dir from anything other than wsl")
|
||||
res = subprocess.run(['wslvar', 'USERPROFILE'], check=False,
|
||||
capture_output=True)
|
||||
winpath = res.stdout.decode('utf-8').strip()
|
||||
res = subprocess.run(['wslpath', winpath], check=False,
|
||||
capture_output=True)
|
||||
return pathlib.Path(res.stdout.decode('utf-8').strip())
|
||||
|
||||
def setup_file(self, fname):
|
||||
"""
|
||||
sets up an individual file
|
||||
"""
|
||||
source = self.prefs_dir / fname
|
||||
print(source)
|
Loading…
Reference in New Issue