Source code for pyutil.mv_to_repo

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Move files from the home directory to the dotfiles repo.

.. module:: mv_to_repo
    :synopsis: Move files from the home directory to the dotfiles repo.

This is a script I've been using for the better part of a year, so while
the docstring formatting isn't consistent and there are a couple odd
sections, this script has served a very utilitiarian purpose.

May refactor one day. But it continues to work.

.. note:: This module assumes a python interpreter above version 3.4.

"""
from pathlib import Path
import shutil
import sys


[docs]def repo_dir_check(dest): """Check that the directory is in the repository and make one otherwise. `Useful info about mkdir <https://docs.python.org/3/library/pathlib.html#pathlib.Path.mkdir>`_: To mimic behavior of ``mkdir -p``, use flags ``parents=True`` and ``exists_ok=True`` Parameters ---------- dest : str Checks that the file to move has a corresponding directory in the repo """ if dest.is_dir() is not True: dest.mkdir(parents=True, exist_ok=True)
[docs]def backup_file(src): """Backs up file src. Utilizes :func:`shutil.copy2`. Parameters ---------- src : str File to backup """ shutil.copy2(str(src), str(src) + ".bak")
[docs]def main(): """Dispatch the remaining implementation of the module. Determine if a file name is in the current directory or absolute path. Then set up a relative path from :envvar:`$HOME`. Use the root of the repo as the new root and move the file there, all while creating directories and backups. Runs checks, calls func to backup file `src`, moves it to the dotfiles repo and symlinks it. Moves file to a hardcoded path but will be generalized to take as an argument. .. rubric:: Assumes User runs the script from inside the folder of the file they want to move. """ inputted = sys.argv[1] if len( sys.argv) >= 2 else sys.exit("Takes at least one filename.") src = Path(inputted) if src.is_file() is not True: sys.exit("This is not a file. Aborting.") cwd = Path.cwd() rel_path = Path.relative_to(cwd, home) # Setup the file we're moving to dest = sys.argv[2] if len(sys.argv) == 3 else Path.joinpath(repo, rel_path) dest_file = Path.joinpath(dest, inputted) repo_dir_check(dest) backup_file(src) shutil.move(str(src), str(dest)) src.symlink_to(dest_file)
if __name__ == '__main__': home = Path.home() repo = Path.joinpath(home, 'projects', 'dotfiles', 'unix', '') main()