dotfiles-install: now handles file paths with spaces
This commit is contained in:
parent
3c4561d9e7
commit
4f78647c51
1 changed files with 19 additions and 13 deletions
|
@ -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"
|
||||||
|
|
Loading…
Add table
Reference in a new issue