2023-12-30 16:32:52 +01:00
|
|
|
|
#!/usr/bin/env bash
|
2018-09-03 20:06:05 +02:00
|
|
|
|
# The home-server project produces a multi-purpose setup using Ansible.
|
2023-07-30 19:31:56 +02:00
|
|
|
|
# Copyright © 2018–2023 Y. Gablin, under the GPL-3.0-or-later license.
|
2018-09-03 20:06:05 +02:00
|
|
|
|
# Full licensing information in the LICENSE file, or gnu.org/licences/gpl-3.0.txt if the file is missing.
|
|
|
|
|
|
|
|
|
|
. "$(dirname "$0")/.etc_checkroot.inc"
|
|
|
|
|
cd /etc
|
|
|
|
|
|
|
|
|
|
# where are we in the history tree?
|
|
|
|
|
ancestor=$(git merge-base run master)
|
|
|
|
|
curhead=$(git rev-parse HEAD)
|
|
|
|
|
|
|
|
|
|
# restore the “master”-state of “run”-files that were needed in order to update “master”
|
|
|
|
|
for f in pacman.conf pacman.d/mirrorlist ssh/sshd_config; do
|
|
|
|
|
if git ls-tree --name-only -r $ancestor | grep -qxF "$f"; then
|
|
|
|
|
git checkout $ancestor -- "$f"
|
|
|
|
|
else
|
|
|
|
|
rm -f "$f"
|
|
|
|
|
fi
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
# automatically accept new versions of files that were seen as changed because of the above hack
|
|
|
|
|
find . -name '*.pacnew' -exec bash -c 'mv -f "$0" "${0%.pacnew}"' {} \;
|
|
|
|
|
|
|
|
|
|
# enforce local policy in case etckeeper was updated
|
|
|
|
|
local_policy='etckeeper/post-install.d/00-local-policy'
|
|
|
|
|
for d in list-installed.d post-install.d pre-install.d; do
|
|
|
|
|
chmod a-x etckeeper/$d/[0-9][0-9]*
|
|
|
|
|
done
|
|
|
|
|
[ -x "$local_policy" ] || { \
|
|
|
|
|
cat >"$local_policy" <<-"END"
|
|
|
|
|
#!/bin/sh
|
|
|
|
|
pacman -Q >/etc/etckeeper/packages.list
|
|
|
|
|
END
|
|
|
|
|
chmod 755 "$local_policy"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# commit the changes
|
|
|
|
|
amend=
|
|
|
|
|
if etckeeper unclean; then
|
|
|
|
|
git add -A
|
|
|
|
|
if [ "$ancestor" != "$curhead" ]; then
|
|
|
|
|
amend=--amend
|
|
|
|
|
fi
|
|
|
|
|
git commit -m "upstream $(date -Iseconds)${1:+: $1}" $amend
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# switch to branch “run” and merge “master”
|
|
|
|
|
git checkout run
|
|
|
|
|
git merge master -Xtheirs -m "merge $(date -Iseconds)${1:+: $1}"
|
|
|
|
|
|
|
|
|
|
# if no errors occurred, restore the uncommited changed that were stashed
|
|
|
|
|
status=$?
|
|
|
|
|
if [ $status -eq 0 ]; then
|
|
|
|
|
stash=$(git stash list | grep -F etc_local_unclean | cut -d: -f1)
|
|
|
|
|
if [ -n "$stash" ]; then
|
|
|
|
|
git stash pop --index "$stash"
|
|
|
|
|
status=$?
|
|
|
|
|
fi
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# restore empty directories and file modes
|
|
|
|
|
etckeeper init
|
|
|
|
|
systemctl daemon-reload
|
|
|
|
|
exit $status
|