#!/bin/bash set -eu PULL_BASE="https://git.adamgoldsmith.name" DOTFILES_PULL_BASE="${PULL_BASE}/dotfiles" BOOTSTRAP_URL="${PULL_BASE}/adam/bootstrap.git" function sync_urls() { cd "$(dirname ${BASH_SOURCE[0]})" git remote set-url origin "$BOOTSTRAP_URL" git remote set-url --push --delete origin '.*' || true for dir in */ do git -C "$dir" remote set-url origin "$DOTFILES_PULL_BASE/${dir%/}.git" git -C "$dir" remote set-url --push --delete origin '.*' || true done } function do_get() { target="$1" if [ -d "$target" ] then echo "$target already exists, not getting" else echo "Getting $target" git clone "$DOTFILES_PULL_BASE/$target.git" --recurse-submodules fi } function do_pull() { dir="$1" if [ "$stashAndSync" = true ] then local do_stash do_stash=$(git diff) [ -n "$do_stash" ] && git -C "$dir" stash git pull -C "$dir" --rebase git push -C "$dir" [ -n "$do_stash" ] && git -C "$dir" stash pop || true else git -C "$dir" pull fi } function do_pull_maybe_quiet() { name="$1" dir="${2:-$name}" git_out="$(do_pull $dir)" first_line="${git_out%%$'\n'*}" if [[ "$quiet" != true || "$first_line" != "Already up to date." ]] then echo "$(tput setaf 4)}$(tput sgr0) $(tput bold)$name$(tput sgr0): $first_line" fi if [[ $first_line == Updating* ]] then git -C "${dir}" log --graph --color --format='%C(yellow)%h%C(reset) %s %C(cyan)(%cr)%C(reset)' ${first_line##Updating } \ | sed 's/^/ /' fi } function run_script() { script="$1"; shift targets="$@" for target in $targets do if [ -e "$target/$script" ] then [[ "$quiet" == true ]] || echo "Running $target/$script" "$target/$script" ${quiet:+-q} fi done } function maybe_stow() { targets="$@" if [ "$stow" = true ] then run_script PRESTOW "$targets" stow -t"$HOME" --ignore="^PRESTOW$" --ignore="^POSTSTOW$" $targets run_script POSTSTOW "$targets" fi } quiet=false stow=true bootstrap=false stashAndSync=false while [ "$#" -gt 0 ] do case $1 in -ns | --no-stow) stow=false shift ;; -bs | --bootstrap) bootstrap=true shift ;; -s | --stash-and-sync) stashAndSync=true shift ;; -q | --quiet) quiet=true shift ;; --sync-urls) sync_urls exit ;; --) shift break ;; -?*) echo "Usage: $0 [-ns|--no-stow] [-bs|bootstrap] []" exit 1 ;; *) break esac done if [ "$bootstrap" = true ] then git clone "$BOOTSTRAP_URL" .dotfiles cd .dotfiles git remote set-url origin "$BOOTSTRAP_URL" else cd "$(dirname ${BASH_SOURCE[0]})" fi if [ "$#" -gt 0 ] then targets="$@" for target in $targets do do_get "$target" done maybe_stow "$targets" elif [ "$bootstrap" != true ] then do_pull_maybe_quiet .dotfiles . targets="$(find * -maxdepth 0 -type d -execdir test -e "{}/.git" \; -print)" for dir in $targets do do_pull_maybe_quiet "$dir" done maybe_stow $targets fi