From 24463705ee2dded4073f52474da0dd00a0c227dc Mon Sep 17 00:00:00 2001 From: PowerUser64 Date: Fri, 17 Jun 2022 00:47:58 -0700 Subject: [PATCH] dotfiles-install: handle directories with spaces properly, auto resume installation, friendly information messages --- .local/bin/dotfiles-install.sh | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/.local/bin/dotfiles-install.sh b/.local/bin/dotfiles-install.sh index 65cb028..bd2550c 100755 --- a/.local/bin/dotfiles-install.sh +++ b/.local/bin/dotfiles-install.sh @@ -1,26 +1,22 @@ #!/bin/sh # 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 - -## 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 +# credit for the basic outline of this script goes to https://www.atlassian.com/git/tutorials/dotfiles DOTFILES_REPO_DIR="$HOME/git/dotfiles" DOTFILES_REPO_URL="https://git.blakenorth.net/dotfiles" -DOTFILES_BACKUP_DIR="$HOME/.dotfiles-backup" +DOTFILES_BACKUP_DIR="$HOME/.dotfiles-backup_$(date +'%Y-%m-%d_%H:%m:%S')" set -e +printf "\n Installing dotfiles from $DOTFILES_REPO_URL\n\n" + # check for the git command and exit if it doesn't exist if ! command -v git > /dev/null;then echo 'git is not installed or could not be found in PATH, please install git to proceed' exit 1 fi -git clone --bare "$DOTFILES_REPO_URL" "$DOTFILES_REPO_DIR" +git clone --bare "$DOTFILES_REPO_URL" "$DOTFILES_REPO_DIR" || echo "Resuming installation" dot() { git --git-dir="$DOTFILES_REPO_DIR" --work-tree="$HOME" "$@" @@ -32,15 +28,14 @@ if ! dot checkout > /dev/null 2>&1; then mkdir -p "$DOTFILES_BACKUP_DIR" # get the list of files that need to be backed up - dot checkout 2>&1 | grep -Po "(?<=\t)(.*)$" | - while read -rd '' LINE; do - LINE_DIR="${LINE%%/*}" - mkdir -p "$DOTFILES_BACKUP_DIR/${LINE_DIR#"$HOME"}/${LINE##*/}" - mv "$FILE" "$DOTFILES_BACKUP_DIR" - done + while read -r LINE; do + LINE_DIR="$(dirname "$LINE")" # No file + mkdir -p "$DOTFILES_BACKUP_DIR/$LINE_DIR" + mv "$HOME/$LINE" "$DOTFILES_BACKUP_DIR/$LINE_DIR" + done <<< "$(dot checkout 2>&1 | grep -Po '\t\K.*$')" fi dot checkout dot config status.showUntrackedFiles no -echo "Done" +printf "\nInstallation complete!\n"