#!/usr/bin/env bash set -euo pipefail [ ${BASH_VERSINFO[0]:-0} -lt 4 ] && { echo "Bash too old, update to >=4.0" exit 1 } SYSTEM=$(uname -s | tr 'A-Z' 'a-z') FORCE=0 typeset -A REPOS REPOS=( [public]='https://git.luzifer.io/luzifer/cfg.git#master' [secret]='https://git.luzifer.io/luzifer/cfg-secret.git#master' ) # --- OPT parsing --- while getopts "f" opt; do case "$opt" in f) FORCE=1 ;; esac done shift $((OPTIND - 1)) [ "${1:-}" = "--" ] && shift # --- OPT parsing --- if [ -e ${HOME}/bin/script_framework.sh ]; then source ${HOME}/bin/script_framework.sh else function step() { echo "$@"; } function fatal() { echo "$@" exit 1 } fi function config() { git --git-dir="${HOME}/.cfg/${repo_name}" --work-tree="${HOME}" $@ } for repo_name in "${!REPOS[@]}"; do clone_url=$(echo ${REPOS[$repo_name]} | cut -d '#' -f 1) branch=$(echo ${REPOS[$repo_name]} | cut -d '#' -f 2) step "Working on '${repo_name}' (remote: '${clone_url}', branch: '${branch}')..." # Clone repo if it's not already available if ! [ -d "${HOME}/.cfg/${repo_name}" ]; then git clone --bare "${clone_url}" --branch "${branch}" "${HOME}/.cfg/${repo_name}" else config remote set-url origin "${clone_url}" fi # Set basic git options for the repo config config status.showUntrackedFiles no # Do not overwrite local changes if (! config diff --exit-code 2>&1 >/dev/null) && [ ${FORCE} -eq 0 ]; then error "Repo '${repo_name}' has unsaved changes and force-flag is not set" continue fi # Refresh latest master config fetch -q origin ${branch} || { fatal "Failed to fetch '${repo_name}'"; } # Apply latest master COMMITS_AHEAD=$(config rev-list --left-right --count FETCH_HEAD...HEAD | awk '{ print $2 }') if [ ${COMMITS_AHEAD} -gt 0 ]; then echo "Local commits found, trying to rebase..." config rebase FETCH_HEAD else echo "No local commits, resetting to remote master..." config reset --hard FETCH_HEAD fi # Update submodules config submodule update --init --recursive done