Initial dotfile program
This commit is contained in:
commit
864b049205
1 changed files with 131 additions and 0 deletions
131
.local/bin/dotfiles
Executable file
131
.local/bin/dotfiles
Executable file
|
@ -0,0 +1,131 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
|
||||
|
||||
"""
|
||||
link [path] -> move to dotfiles, git add and symlink back
|
||||
unlink [path] -> move from dotfiles and git rm
|
||||
apply [path] -> add symlink to system
|
||||
sync -> pull -> commit -> push
|
||||
"""
|
||||
|
||||
from argparse import ArgumentParser
|
||||
import shutil
|
||||
import os.path
|
||||
import os
|
||||
import sys
|
||||
|
||||
basedir = os.path.expanduser("~/.dotfiles")
|
||||
|
||||
def getpaths(path):
|
||||
absolutpath = os.path.abspath(os.path.expanduser(path))
|
||||
dotfilepath = basedir + absolutpath[len(os.path.expanduser("~")):]
|
||||
|
||||
return absolutpath, dotfilepath
|
||||
|
||||
|
||||
def link(path, force):
|
||||
absolutpath, dotfilepath = getpaths(path)
|
||||
|
||||
if not absolutpath.startswith(os.path.expanduser("~")):
|
||||
print(f"Could not add {path} to repo, only files in your home directory are supported", file=sys.stderr)
|
||||
sys.exit(2)
|
||||
|
||||
if absolutpath == os.path.expanduser("~"):
|
||||
print(f"Cannot add home directory to dotfiles", file=sys.stderr)
|
||||
sys.exit(3)
|
||||
|
||||
if absolutpath.startswith(basedir):
|
||||
print("Cannot add dotfile directory to to dotfiles", file=sys.stderr)
|
||||
sys.exit(4)
|
||||
|
||||
if os.path.exists(dotfilepath):
|
||||
print(f"{dotfilepath} already exists.", file=sys.stderr)
|
||||
if not force:
|
||||
sys.exit(5)
|
||||
else:
|
||||
print(f"removing {dotfilepath}", file=sys.stderr)
|
||||
os.system(f"git -C {basedir} rm -r {dotfilepath}")
|
||||
|
||||
print(f"{absolutpath} -> {dotfilepath}")
|
||||
os.makedirs(os.path.dirname(dotfilepath), exist_ok=True)
|
||||
shutil.move(absolutpath, dotfilepath)
|
||||
os.system(f"git -C {basedir} add {dotfilepath}")
|
||||
os.symlink(dotfilepath, absolutpath)
|
||||
|
||||
def unlink(path):
|
||||
absolutpath, dotfilepath = getpaths(path)
|
||||
|
||||
if not os.path.islink(absolutpath):
|
||||
print(f"{absolutpath} is not a symbolic link", file=sys.stderr)
|
||||
sys.exit(6)
|
||||
|
||||
if not os.path.exists(dotfilepath):
|
||||
print(f"No dotfile for {absolutpath}", file=sys.stderr)
|
||||
sys.exit(7)
|
||||
|
||||
print(f"Deleting symlink {absolutpath}")
|
||||
os.remove(absolutpath)
|
||||
print(f"{dotfilepath} -> {absolutpath}")
|
||||
shutil.move(dotfilepath, absolutpath)
|
||||
os.system(f"git -C {basedir} rm -r {dotfilepath}")
|
||||
|
||||
|
||||
def apply(path, force):
|
||||
absolutpath, dotfilepath = getpaths(path)
|
||||
|
||||
if not os.path.exists(dotfilepath):
|
||||
print(f"{dotfilepath} does not exist", file=sys.stderr)
|
||||
sys.exit(8)
|
||||
|
||||
if os.path.exists(absolutpath):
|
||||
print(f"{absolutpath} already exists", file=sys.stderr)
|
||||
if not force:
|
||||
sys.exit(9)
|
||||
else:
|
||||
print(f"Removing {absolutpath}", file=sys.stderr)
|
||||
shutil.rmtree(absolutpath)
|
||||
|
||||
os.link(dotfilepath, absolutpath)
|
||||
|
||||
|
||||
def sync():
|
||||
os.system(f"git -C {basedir} pull")
|
||||
os.system(f"git -C {basedir} commit -am \"dotfiles\"")
|
||||
os.system(f"git -C {basedir} push")
|
||||
|
||||
|
||||
def main():
|
||||
if not os.path.exists(basedir):
|
||||
print(f"Creating {basedir}", file=sys.stderr)
|
||||
if not os.path.isdir(basedir):
|
||||
print(f"{basedir} exists, but is not a directory")
|
||||
sys.exit(1)
|
||||
|
||||
parser = ArgumentParser()
|
||||
subparsers = parser.add_subparsers(dest="command")
|
||||
add_parser = subparsers.add_parser("link")
|
||||
unlink_parser = subparsers.add_parser("unlink")
|
||||
symlink_parser = subparsers.add_parser("apply")
|
||||
sync_parser = subparsers.add_parser("sync")
|
||||
|
||||
add_parser.add_argument('--force', '-f', action="store_true")
|
||||
add_parser.add_argument('path')
|
||||
unlink_parser.add_argument('path')
|
||||
symlink_parser.add_argument('--force', '-f', action="store_true")
|
||||
symlink_parser.add_argument('path')
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
match args.command:
|
||||
case "link":
|
||||
link(args.path, args.force)
|
||||
case "unlink":
|
||||
unlink(args.path)
|
||||
case "apply":
|
||||
apply(args.path, args.force)
|
||||
case "sync":
|
||||
sync()
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
Loading…
Add table
Reference in a new issue