You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
92 lines
3.2 KiB
Plaintext
92 lines
3.2 KiB
Plaintext
2 years ago
|
#!/bin/sh
|
||
|
set -e
|
||
|
|
||
|
pl="/var/cache/etckeeper/packagelist"
|
||
|
|
||
|
# Parent process is etckeeper
|
||
|
# (Only procps ps is currently supported, others will fail,
|
||
|
# so this may end up empty.)
|
||
|
ETCKEEPER_PID=$( ps --no-headers -o ppid "${PPID}" 2>/dev/null | sed 's/^ *//' )
|
||
|
|
||
|
# Find the parent of etckeeper and get the command line of the process
|
||
|
if ! [ -z "${ETCKEEPER_PID}" ]; then
|
||
|
ETCKEEPER_PPID=$( ps --no-headers -o ppid "${ETCKEEPER_PID}" | sed 's/^ *//' )
|
||
|
ETCKEEPER_PARENT_COMMAND_LINE=$( ps --no-headers -o args "${ETCKEEPER_PPID}" )
|
||
|
fi
|
||
|
|
||
|
get_changes () {
|
||
|
if [ "$VCS" = git ]; then
|
||
|
git diff --stat | grep '|' | cut -d'|' -f1 | cut -b2-
|
||
|
git ls-files --exclude-standard --others
|
||
|
fi
|
||
|
if [ "$VCS" = hg ]; then
|
||
|
hg status --no-status
|
||
|
fi
|
||
|
if [ "$VCS" = bzr ]; then
|
||
|
bzr status -S | cut -b5-
|
||
|
fi
|
||
|
if [ "$VCS" = darcs ]; then
|
||
|
# ignore ' file -> file' lines for moved files
|
||
|
# trim ' -M +N rP' from change summary
|
||
|
darcs whatsnew --summary | grep -v '^ .* -> ' | cut -d' ' -f2- | sed 's/ [-+r][0-9]\+//g;s/^\.\///'
|
||
|
# lines beginning with 'a' show unversioned files
|
||
|
darcs whatsnew --look-for-adds --boring --summary | grep '^a' | cut -d' ' -f2- | sed 's/^\.\///'
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
get_changed_packages () {
|
||
|
if [ "$LOWLEVEL_PACKAGE_MANAGER" = dpkg ]; then
|
||
|
get_changes | sed 's/^/\/etc\//;s/\s*$//' | xargs -d '\n' dpkg 2>/dev/null -S | cut -d':' -f1 | sed 's/, /\n/g'
|
||
|
fi
|
||
|
if [ "$LOWLEVEL_PACKAGE_MANAGER" = rpm ]; then
|
||
|
# if output contains file path, file was not found
|
||
|
get_changes | sed 's/^/\/etc\//;s/\s*$//' | xargs -d '\n' rpm --qf '%{NAME}\n' -qf | grep -v "/etc/"
|
||
|
fi
|
||
|
# is it even possible to use pacmatic without pacman?
|
||
|
if [ "$LOWLEVEL_PACKAGE_MANAGER" = pacman -o "$LOWLEVEL_PACKAGE_MANAGER" = pacmatic ]; then
|
||
|
get_changes | sed 's/^/\/etc\//;s/\s*$//' | xargs -d '\n' pacman 2>/dev/null -Qo | rev | cut -d' ' -f1-2 | rev | cut -d' ' -f1
|
||
|
fi
|
||
|
if [ "$LOWLEVEL_PACKAGE_MANAGER" = pkgng ]; then
|
||
|
get_changes | sed 's/^/\/etc\//;s/\s*$//' | xargs -d '\n' pkg which --quiet | rev | cut -d'-' -f2- | rev
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
if etckeeper unclean; then
|
||
|
if [ -z "${ETCKEEPER_PARENT_COMMAND_LINE}" ]; then
|
||
|
message="committing changes in /etc after $HIGHLEVEL_PACKAGE_MANAGER run"
|
||
|
else
|
||
|
message="committing changes in /etc made by \"$ETCKEEPER_PARENT_COMMAND_LINE\""
|
||
|
fi
|
||
|
|
||
|
set +e
|
||
|
if [ -e $pl.pre-install ] && [ "$(cat $pl.fmt 2>/dev/null || true)" = "$(etckeeper list-installed fmt)" ]; then
|
||
|
(
|
||
|
echo "$message"
|
||
|
echo
|
||
|
get_changed_packages | sort | uniq > $pl.found-pkgs
|
||
|
if [ -s $pl.found-pkgs ]; then
|
||
|
sed -i 's/^/^[-+]/;s/$/ /' $pl.found-pkgs
|
||
|
etckeeper list-installed | diff -U0 $pl.pre-install - | tail -n+4 | egrep '^[-+]' | grep -f $pl.found-pkgs > $pl.found-packages
|
||
|
if [ -s $pl.found-packages ]; then
|
||
|
echo "Packages with configuration changes:"
|
||
|
cat $pl.found-packages || true
|
||
|
echo
|
||
|
fi
|
||
|
fi
|
||
|
echo "Package changes:"
|
||
|
etckeeper list-installed | diff -U0 $pl.pre-install - | tail -n+4 | egrep '^[-+]' || true
|
||
|
) | etckeeper commit --stdin
|
||
|
else
|
||
|
etckeeper commit "$(printf "$message")"
|
||
|
fi
|
||
|
status=$?
|
||
|
set -e
|
||
|
|
||
|
if [ "$status" != 0 ]; then
|
||
|
echo "warning: etckeeper failed to commit changes in /etc using $VCS" >&2
|
||
|
fi
|
||
|
fi
|
||
|
|
||
|
rm -f $pl.pre-install $pl.fmt
|
||
|
rm -f $pl.found-pkgs $pl.found-packages
|