#!/bin/bash # Simple dotfile linking script. # Partly inspired by dotsync (https://github.com/dotphiles/dotsync). # # This script takes files in a version-controllable "dotdir" directory # and creates corresponding symlinks in the user's home directory. # Any existing files in the home directory are backed up before being # replaced with a symlink. # Root directory of dotfiles project BASEDIR=$(dirname "$(readlink -f "$0")") # Directory containing all dotfiles that will be linked to $HOMEDIR DOTDIR=${BASEDIR}/home # Directory into which files will be linked HOMEDIR=${HOME} # Directory into which any pre-existing dotfiles will be copied BACKUPDIR=${HOMEDIR}/.updatedots-backup # Dotfiles relative to $DOTDIR RDOTFILES=$(find ${DOTDIR} -type f -print | sed "s|^${DOTDIR}/||g") # Command used to create symbolic links LINK="ln --symbolic --relative" # Publish dotfiles to home directory, backing up any collisions create_links() { if [ ! -e "$BACKUPDIR" ]; then mkdir "$BACKUPDIR" fi if [ -n "$(ls -A $BACKUPDIR)" ]; then echo "Backup directory $BACKUPDIR is not empty, local files could be lost." >&2 echo "Aborting." >&2 exit 1 fi local moved=0 echo "*** Linking dotfiles from $(realpath $DOTDIR) to $HOMEDIR ***" for relative in $RDOTFILES; do local src=$DOTDIR/$relative local dest=$HOMEDIR/$relative # backup destination (if the file already exists and is backed up) local bdest=$BACKUPDIR/$relative mkdir -p $(dirname "$dest") if [ -e "$dest" ] && [ $(readlink -f "$dest") = $(readlink -f "$src") ]; then echo "Nothing to be done for $relative" else if [ -e "$dest" ]; then mkdir -p $(dirname "$bdest") mv "$dest" "$bdest" moved=1 echo "Backed up original $relative to $bdest" fi $LINK "$src" "$dest" echo "Linked $relative" fi done echo "*** Finished linking dotfiles ***" echo if [ "$moved" -gt 0 ]; then echo "WARNING: some files were moved to $BACKUPDIR" >&2 fi } create_links