dotfiles-install: now handles file paths with spaces

This commit is contained in:
PowerUser64 2022-06-15 19:51:37 -07:00
parent 3c4561d9e7
commit 4f78647c51

View file

@ -1,18 +1,22 @@
#!/bin/bash #!/bin/sh
# this script will install the dotfiles from the target git repository, and back up any conflicting files # this script will install the dotfiles from the target git repository, and back up any conflicting files
# credit for this idea and basic script outline goes to https://www.atlassian.com/git/tutorials/dotfiles # credit for this idea and basic script outline goes to https://www.atlassian.com/git/tutorials/dotfiles
# TODO: make it so line 31 (DOTFILES_BACKUP_LIST) can handle spaces (do it in a for loop) ## shellcheck
# Allow variables in single quotes
# shellcheck disable=SC2016
# read -d is not posix-complient (but it exists in sh on my machine, so it's probably fine)
# shellcheck disable=SC3045
DOTFILES_REPO_DIR="$HOME/git/dotfiles" DOTFILES_REPO_DIR="$HOME/git/dotfiles"
DOTFILES_REPO_URL="https://git.blakenorth.net/dotfiles" DOTFILES_REPO_URL="https://git.blakenorth.net/dotfiles"
DOTFILES_BACKUP_DIR="$HOME/.dotfiles-backup" # cannot contain the character '#' DOTFILES_BACKUP_DIR="$HOME/.dotfiles-backup"
set -e set -e
# check for the git command and exit if it doesn't exist # check for the git command and exit if it doesn't exist
if ! command -v git > /dev/null;then if ! command -v git > /dev/null;then
echo 'git is not installed or could not be found in $PATH, please install git to proceed' echo 'git is not installed or could not be found in PATH, please install git to proceed'
exit 1 exit 1
fi fi
@ -22,19 +26,21 @@ dot() {
git --git-dir="$DOTFILES_REPO_DIR" --work-tree="$HOME" "$@" git --git-dir="$DOTFILES_REPO_DIR" --work-tree="$HOME" "$@"
} }
# remove the '&> /dev/null' part if things don't seem to work right # remove the '> /dev/null' part if things don't seem to work right
if dot checkout > /dev/null 2>&1; then if ! dot checkout > /dev/null 2>&1; then
echo "Checked out dotfiles."
else
echo "Backing up pre-existing dotfiles." echo "Backing up pre-existing dotfiles."
mkdir -p "$DOTFILES_BACKUP_DIR"
# get the list of files that need to be backed up # get the list of files that need to be backed up
DOTFILES_BACKUP_LIST=($(dot checkout 2>&1 | grep -Po "(?<=\t)(.*)$")) dot checkout 2>&1 | grep -Po "(?<=\t)(.*)$" |
# create directories for everything that needs one while read -rd '' LINE; do
mkdir -p "$DOTFILES_BACKUP_DIR" $(printf '%s\n' "${DOTFILES_BACKUP_LIST[@]}" | grep -Po '.*/' | sed "s#.*#$DOTFILES_BACKUP_DIR/&#g") LINE_DIR="${LINE%%/*}"
# backup existing files to avoid them being overwritten mkdir -p "$DOTFILES_BACKUP_DIR/${LINE_DIR#"$HOME"}/${LINE##*/}"
printf '%s\n' "${DOTFILES_BACKUP_LIST[@]}" | xargs -I{} mv "$HOME"/{} "$DOTFILES_BACKUP_DIR"/{} mv "$FILE" "$DOTFILES_BACKUP_DIR"
done
fi fi
dot checkout dot checkout
dot config status.showUntrackedFiles no dot config status.showUntrackedFiles no
echo "Done"