#!/bin/bash set -eu PULL_BASE="https://adamgoldsmith.name/cgit" PUSH_BASE="ag:/srv/git" function do_get() { target="$1" if [ -d "$target" ] then echo "$target already exists, not getting" else echo "Getting $target" git clone "$PULL_BASE/dotfiles/$target.git" --recurse-submodules cd $target git remote set-url origin "$PULL_BASE/dotfiles/$target.git" git remote set-url --push origin "$PUSH_BASE/dotfiles/$target.git" cd .. fi } function do_pull() { if [ "$stashAndSync" = true ] then local do_stash do_stash=$(git diff) [ -n "$do_stash" ] && git stash git pull --rebase git push [ -n "$do_stash" ] && git stash pop || true else git pull fi } function run_script() { script="$1"; shift targets="$@" for target in $targets do if [ -e "$target/$script" ] then echo "Running $target$script" "$target/$script" 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 } 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 ;; --) shift break ;; -?*) echo "Usage: $0 [-ns|--no-stow] [-bs|bootstrap] []" exit 1 ;; *) break esac done if [ "$bootstrap" = true ] then git clone "$PULL_BASE/bootstrap.git" .dotfiles cd .dotfiles git remote set-url origin "$PULL_BASE/bootstrap.git" git remote set-url --push origin "$PUSH_BASE/bootstrap.git" 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 echo "Updating .dotfiles" do_pull for dir in */ do echo "Updating $dir" cd "$dir" do_pull cd .. done maybe_stow "*/" fi