#!/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

DOTFILES_REPO_DIR="$HOME/git/dotfiles"
DOTFILES_REPO_URL="https://git.blakenorth.net/dotfiles"
DOTFILES_BACKUP_DIR="$HOME/.dotfiles-backup"

set -e

# 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"

dot() {
   git --git-dir="$DOTFILES_REPO_DIR" --work-tree="$HOME" "$@"
}

# remove the '> /dev/null' part if things don't seem to work right
if ! dot checkout > /dev/null 2>&1; then
   echo "Backing up pre-existing dotfiles."
   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
fi

dot checkout
dot config status.showUntrackedFiles no

echo "Done"