From 472ecda1970a7038ae1118a17d267f94a7ff827a Mon Sep 17 00:00:00 2001 From: Frank Brehm Date: Fri, 11 Mar 2016 13:24:35 +0100 Subject: [PATCH] saving uncommitted changes in /etc prior to emerge run --- etckeeper/commit.d/99push | 8 +++-- etckeeper/list-installed.d/50list-installed | 35 ++++++++++++------- etckeeper/post-install.d/50vcs-commit | 15 +++++--- etckeeper/pre-commit.d/20warn-problem-files | 12 +++---- etckeeper/pre-commit.d/30store-metadata | 2 +- etckeeper/pre-install.d/10packagelist | 1 + etckeeper/pre-install.d/50uncommitted-changes | 16 +-------- etckeeper/uninit.d/50vcs-uninit | 6 ++-- etckeeper/update-ignore.d/01update-ignore | 11 +++--- 9 files changed, 57 insertions(+), 49 deletions(-) diff --git a/etckeeper/commit.d/99push b/etckeeper/commit.d/99push index 5aa8d216..b5418f74 100755 --- a/etckeeper/commit.d/99push +++ b/etckeeper/commit.d/99push @@ -1,9 +1,13 @@ #!/bin/sh if [ -n "$PUSH_REMOTE" ]; then if [ "$VCS" = git ] && [ -d .git ]; then - git push "$PUSH_REMOTE" master || true + for REMOTE in $PUSH_REMOTE; do + git push "$REMOTE" master || true + done elif [ "$VCS" = hg ] && [ -d .hg ]; then - hg push "$PUSH_REMOTE" || true + for REMOTE in $PUSH_REMOTE; do + hg push "$REMOTE" || true + done else echo "PUSH_REMOTE not yet supported for $VCS" >&2 fi diff --git a/etckeeper/list-installed.d/50list-installed b/etckeeper/list-installed.d/50list-installed index 1dcfda11..91718d4b 100755 --- a/etckeeper/list-installed.d/50list-installed +++ b/etckeeper/list-installed.d/50list-installed @@ -1,14 +1,25 @@ #!/bin/sh -# Output to stdout a *sorted* list of all currently installed -# (or removed but still with config-files) packages, in the -# format "package version\n" (or something similar). -if [ "$LOWLEVEL_PACKAGE_MANAGER" = dpkg ]; then - dpkg-query -W -f '${Status}\t${Package} ${Version}\n' | \ - egrep '(ok installed|ok config-files)' | cut -f2,3 -elif [ "$LOWLEVEL_PACKAGE_MANAGER" = rpm ]; then - rpm -qa --qf "%|epoch?{%{epoch}}:{0}|:%{name}-%{version}-%{release}.%{arch}\n" | sort -elif [ "$LOWLEVEL_PACKAGE_MANAGER" = pacman ]; then - pacman -Q -elif [ "$LOWLEVEL_PACKAGE_MANAGER" = qlist ]; then - qlist -ICv +if [ "$1" = fmt ]; then + # If the list format changes, change the fmt + if [ "$LOWLEVEL_PACKAGE_MANAGER" = dpkg ]; then + echo 2 + else + echo "" + fi +else + # Output to stdout a *sorted* list of all currently installed + # (or removed but still with config-files) packages, in the + # format "package version\n" (or something similar). + if [ "$LOWLEVEL_PACKAGE_MANAGER" = dpkg ]; then + dpkg-query -W -f '${Status}\t${Package} ${Version} ${Architecture}\n' | \ + egrep '(ok installed|ok config-files)' | cut -f2,3 + elif [ "$LOWLEVEL_PACKAGE_MANAGER" = rpm ]; then + rpm -qa --qf "%|epoch?{%{epoch}}:{0}|:%{name}-%{version}-%{release}.%{arch}\n" | sort + elif [ "$LOWLEVEL_PACKAGE_MANAGER" = pacman ]; then + pacman -Q + elif [ "$LOWLEVEL_PACKAGE_MANAGER" = qlist ]; then + qlist -ICv + elif [ "$LOWLEVEL_PACKAGE_MANAGER" = cave ]; then + cave print-packages -r installed + fi fi diff --git a/etckeeper/post-install.d/50vcs-commit b/etckeeper/post-install.d/50vcs-commit index 7710c4a4..53138c82 100755 --- a/etckeeper/post-install.d/50vcs-commit +++ b/etckeeper/post-install.d/50vcs-commit @@ -1,12 +1,13 @@ #!/bin/sh set -e - + pl="/var/cache/etckeeper/packagelist" if etckeeper unclean; then message="committing changes in /etc after $HIGHLEVEL_PACKAGE_MANAGER run" - if [ -e $pl.pre-install ]; then + set +e + if [ -e $pl.pre-install ] && [ "$(cat $pl.fmt 2>/dev/null || true)" = "$(etckeeper list-installed fmt)" ]; then ( echo "$message" echo @@ -16,8 +17,12 @@ if etckeeper unclean; then 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 -if [ -e $pl.pre-install ]; then - rm -f $pl.pre-install -fi +rm -f $pl.pre-install $pl.fmt diff --git a/etckeeper/pre-commit.d/20warn-problem-files b/etckeeper/pre-commit.d/20warn-problem-files index f7c7580a..f28d5ac6 100755 --- a/etckeeper/pre-commit.d/20warn-problem-files +++ b/etckeeper/pre-commit.d/20warn-problem-files @@ -6,14 +6,14 @@ exclude_internal () { } if [ "$VCS" = bzr ] || [ "$VCS" = darcs ]; then - special=$(find . -not -type d -not -type f -not -type l | exclude_internal) || true - hardlinks=$(find . -type f -not -links 1 | exclude_internal ) || true + special=$(find . ! -type d ! -type f ! -type l | exclude_internal) || true + hardlinks=$(find . -type f ! -links 1 | exclude_internal ) || true elif [ "$VCS" = hg ]; then - special=$(find . -not -type d -not -type f -not -type l | exclude_internal) || true - hardlinks=$(find . -type f -not -links 1 -exec hg status {} \; | exclude_internal ) || true + special=$(find . ! -type d ! -type f ! -type l | exclude_internal) || true + hardlinks=$(find . -type f ! -links 1 -exec hg status {} \; | exclude_internal ) || true elif [ "$VCS" = git ]; then - special=$(find . -not -type d -not -type f -not -type l -exec git ls-files --exclude-standard --cached --others {} \; | exclude_internal) || true - hardlinks=$(find . -type f -not -links 1 -exec git ls-files --exclude-standard --cached --others {} \; | exclude_internal) || true + special=$(find . ! -type d ! -type f ! -type l -exec git ls-files --exclude-standard --cached --others {} \; | exclude_internal) || true + hardlinks=$(find . -type f ! -links 1 -exec git ls-files --exclude-standard --cached --others {} \; | exclude_internal) || true else special="" fi diff --git a/etckeeper/pre-commit.d/30store-metadata b/etckeeper/pre-commit.d/30store-metadata index 9e2792fb..edec06b6 100755 --- a/etckeeper/pre-commit.d/30store-metadata +++ b/etckeeper/pre-commit.d/30store-metadata @@ -28,7 +28,7 @@ filter_ignore() { grep -Evf "$listfile" ;; git) - git ls-files --others --ignore --exclude-standard --directory > "$listfile" || true + (git ls-files -oi --exclude-standard; git ls-files -oi --exclude-standard --directory) | sort | uniq > "$listfile" || true sed 's/^\.\///' | grep -xFvf "$listfile" ;; esac diff --git a/etckeeper/pre-install.d/10packagelist b/etckeeper/pre-install.d/10packagelist index e5fefa8f..fbd4ac38 100755 --- a/etckeeper/pre-install.d/10packagelist +++ b/etckeeper/pre-install.d/10packagelist @@ -2,3 +2,4 @@ # This list will be later used when committing. mkdir -p /var/cache/etckeeper/ etckeeper list-installed > /var/cache/etckeeper/packagelist.pre-install +etckeeper list-installed fmt > /var/cache/etckeeper/packagelist.fmt diff --git a/etckeeper/pre-install.d/50uncommitted-changes b/etckeeper/pre-install.d/50uncommitted-changes index d03d0e81..969d3413 100755 --- a/etckeeper/pre-install.d/50uncommitted-changes +++ b/etckeeper/pre-install.d/50uncommitted-changes @@ -1,15 +1,6 @@ #!/bin/sh set -e -if [ "$1" = "fail-debconf" ]; then - . /usr/share/debconf/confmodule - db_subst etckeeper/commit_failed VCS "$VCS" - db_input critical etckeeper/commit_failed || true - db_go || true - db_reset etckeeper/commit_failed || true - exit 0 -fi - if etckeeper unclean; then if [ "$AVOID_COMMIT_BEFORE_INSTALL" = 1 ]; then echo "" >&2 @@ -19,11 +10,6 @@ if etckeeper unclean; then exit 1 fi if ! etckeeper commit "saving uncommitted changes in /etc prior to $HIGHLEVEL_PACKAGE_MANAGER run"; then - if [ -e /usr/share/debconf/confmodule ]; then - $0 fail-debconf - else - echo "error: etckeeper failed to commit changes in /etc using $VCS" - exit 1 - fi + echo "warning: etckeeper failed to commit changes in /etc using $VCS" >&2 fi fi diff --git a/etckeeper/uninit.d/50vcs-uninit b/etckeeper/uninit.d/50vcs-uninit index b61abfde..06317c56 100755 --- a/etckeeper/uninit.d/50vcs-uninit +++ b/etckeeper/uninit.d/50vcs-uninit @@ -21,9 +21,9 @@ if ! grep -q "$managed_by_etckeeper" "$file"; then exit 0 else realfile="$file" - if which tempfile >/dev/null 2>&1 || type -p tempfile >/dev/null 2>&1; then + if which tempfile >/dev/null 2>&1 || type tempfile >/dev/null 2>&1; then tempfile="tempfile" - elif which mktemp >/dev/null 2>&1 || type -p mktemp >/dev/null 2>&1; then + elif which mktemp >/dev/null 2>&1 || type mktemp >/dev/null 2>&1; then tempfile="mktemp" else echo "etckeeper warning: can't find tempfile or mktemp" >&2 @@ -32,7 +32,7 @@ else file=$($tempfile) otherentries= skipping= - while read line; do + while read -r line; do if echo "$line" | grep -q "$managed_by_etckeeper"; then if [ ! "$skipping" ]; then skipping=1 diff --git a/etckeeper/update-ignore.d/01update-ignore b/etckeeper/update-ignore.d/01update-ignore index 3b368e8a..88243ead 100755 --- a/etckeeper/update-ignore.d/01update-ignore +++ b/etckeeper/update-ignore.d/01update-ignore @@ -99,9 +99,9 @@ writefile () { ignore "*.pacorig" ignore "*.pacsave" nl - elif [ "$LOWLEVEL_PACKAGE_MANAGER" = "qlist" ]; then + elif [ "$LOWLEVEL_PACKAGE_MANAGER" = "qlist" -o "$LOWLEVEL_PACKAGE_MANAGER" = "cave" ]; then comment "new and old versions of conffiles, stored by emerge" - ignore "*._cfg*" + ignore "._cfg*" nl fi @@ -149,6 +149,7 @@ writefile () { ignore "cups/subscriptions.conf" ignore "cups/subscriptions.conf.O" ignore "fake-hwclock.data" + ignore "check_mk/logwatch.state" nl comment "editor temp files" @@ -174,9 +175,9 @@ if [ -e "$file" ]; then fi fi realfile="$file" - if which tempfile >/dev/null 2>&1 || type -p tempfile >/dev/null 2>&1; then + if which tempfile >/dev/null 2>&1 || type tempfile >/dev/null 2>&1; then tempfile="tempfile" - elif which mktemp >/dev/null 2>&1 || type -p mktemp >/dev/null 2>&1; then + elif which mktemp >/dev/null 2>&1 || type mktemp >/dev/null 2>&1; then tempfile="mktemp" else echo "etckeeper warning: can't find tempfile or mktemp" >&2 @@ -184,7 +185,7 @@ if [ -e "$file" ]; then file=$($tempfile) ( skipping= - while read line; do + while read -r line; do if echo "$line" | grep -q "$managed_by_etckeeper"; then if [ ! "$skipping" ]; then skipping=1 -- 2.39.5