#!/bin/zsh -e # Install via curl -o- -L https://git.klowner.com/mark/dotfiles/raw/branch/main/bin/dotfiles | zsh DOTFILES_HOME="${DOTFILES_HOME:-$HOME}" DOTFILES_ROOT="${DOTFILES_ROOT:-$DOTFILES_HOME/.dotfiles}" DOTFILES_REMOTE="${DOTFILES_REMOTE:-git@git.klowner.com:mark/dotfiles}" DOTFILES_BRANCH="${DOTFILES_BRANCH:-main}" DOTFILES_WORK_TREE="${DOTFILES_WORK_TREE:-$HOME}" DOTFILES_ALIAS="/usr/bin/git --git-dir=${DOTFILES_ROOT} --work-tree=${DOTFILES_WORK_TREE}" DEPENDENCIES=(git zsh ssh) function has() { return $(which $1 &> /dev/null) } function die() { echo $* exit 1 } function info() { echo "DOTFILES_ROOT: ${DOTFILES_ROOT}" echo "DOTFILES_REMOTE: ${DOTFILES_REMOTE}" echo "DOTFILES_WORK_TREE: ${DOTFILES_WORK_TREE}" echo "DOTFILES_ALIAS: ${DOTFILES_ALIAS}" } function smart_clone() { if [ -d $DOTFILES_ROOT ]; then EXISTING_REMOTE=$(git --git-dir=${DOTFILES_ROOT} remote get-url origin) if [ "$EXISTING_REMOTE" = "$DOTFILES_REMOTE" ]; then dotfiles fetch else die "$DOTFILES_ROOT already exists, aborting." fi else # If we have ssh keys that our host accepts if ssh -o BatchMode=yes -o StrictHostKeyChecking=accept-new "${DOTFILES_REMOTE%%:*}" exit; then git clone --bare $DOTFILES_REMOTE $DOTFILES_ROOT --branch $DOTFILES_BRANCH else git clone --bare $(remote_ssh_to_https $DOTFILES_REMOTE) $DOTFILES_ROOT --branch $DOTFILES_BRANCH fi fi } function remote_ssh_to_https { remote="$1" remote="${remote/://}" remote="${remote/git@/https://}" remote="${remote%.git}" echo "$remote" } function check_requirements() { for DEP in ${DEPENDENCIES[@]}; do has $DEP || die "${DEP} not found, please install and try again." done } function dotfiles() { eval $DOTFILES_ALIAS $* } function backup_existing() { dotfiles checkout DST="${DOTFILES_ROOT}-backup" SRC="${DOTFILES_WORK_TREE}" mkdir -p $DST && \ dotfiles checkout 2>&1 | grep -E "\s+\." | awk {'print $1'} | \ xargs -d $'\n' sh -c "for arg do mkdir -p ${DST}/\${arg%/*} && mv -v ${SRC}/\$arg ${DST}/\$arg; done" _ } function install() { check_requirements smart_clone dotfiles checkout || backup_existing && dotfiles checkout dotfiles config --local status.showUntrackedFiles no } function echo_alias { echo $DOTFILES_ALIAS exit 0 } # If this script is being piped from curl if ! tty >/dev/null; then install exit 0 fi # Command line mode case "${1:-help}" in info) info;; install) install;; alias) echo_alias;; help) echo "dotfiles commands: " echo " - install" echo " - info" echo " - alias" echo "all other commands will be forwarded to git" ;; *) eval $DOTFILES_ALIAS $*;; esac # vim:ts=2:sw=2:et: