60 lines
1.4 KiB
Bash
Executable file
60 lines
1.4 KiB
Bash
Executable file
#!/bin/bash
|
|
set -euo pipefail
|
|
|
|
FORCE=0
|
|
PUB_CONFIG="git@github.com:Luzifer/cfg.git"
|
|
SEC_CONFIG="git@github.com:Luzifer/cfg-secret.git"
|
|
|
|
# --- OPT parsing ---
|
|
|
|
while getopts "f" opt; do
|
|
case "$opt" in
|
|
f)
|
|
FORCE=1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
shift $((OPTIND-1))
|
|
[ "${1:-}" = "--" ] && shift
|
|
|
|
# --- OPT parsing ---
|
|
|
|
if ! [ -d ${HOME}/.cfg/public ]; then
|
|
git clone --bare ${PUB_CONFIG} ${HOME}/.cfg/public
|
|
fi
|
|
|
|
if ! [ -d ${HOME}/.cfg/secret ]; then
|
|
git clone --bare ${SEC_CONFIG} ${HOME}/.cfg/secret
|
|
fi
|
|
|
|
function config {
|
|
git --git-dir=${HOME}/.cfg/${REPO}/ --work-tree=${HOME} $@
|
|
}
|
|
|
|
for REPO in public secret; do
|
|
# 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
|
|
echo "Repo '${REPO}' has unsaved changes and force-flag is not set"
|
|
exit 1
|
|
fi
|
|
|
|
# Refresh latest master
|
|
config fetch -q origin master || { echo "Failed to fetch '${REPO}'"; exit 1; }
|
|
|
|
# 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
|