summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid De La Harpe Golden (Squared Financial) <dgolden@squaredfinancial.com>2012-05-31 18:27:06 +0100
committerJoey Hess <joey@kitenet.net>2012-06-02 18:05:30 -0400
commit6e7aab39cced00eae03040753c85527aab573319 (patch)
tree30431d5c28204fe2797668bfa9b6691089ae383b
parent40eeedebb6be23035aea9d15aed1be706479ce79 (diff)
Preserve unmanaged ignore file entries on uninit (#673996)
Signed-off-by: David De La Harpe Golden (Squared Financial) <dgolden@squaredfinancial.com>
-rw-r--r--etckeeper.85
-rwxr-xr-xinit.d/50vcs-ignore2
-rwxr-xr-xuninit.d/01prompt2
-rwxr-xr-xuninit.d/50vcs-uninit34
-rwxr-xr-xupdate-ignore.d/01update-ignore10
5 files changed, 46 insertions, 7 deletions
diff --git a/etckeeper.8 b/etckeeper.8
index a49c4b6..6d3ffb2 100644
--- a/etckeeper.8
+++ b/etckeeper.8
@@ -41,10 +41,11 @@ repository. (You can also call this by hand after running dpkg by hand.)
.B unclean
This returns true if the directory contains uncommitted changes.
.TP
-.B update-ignore
+.B update-ignore [-a]
This updates the VCS ignore file. Content outside a "managed by etckeeper"
block is not touched. This is generally run when upgrading to a new version
-of etckeeper.
+of etckeeper. (The -a switch will add a "managed by etckeeper" block if
+one is not present.)
.TP
.B vcs subcommand [options ...]
You can use this to run any subcommand of the VCS that etckeeper is
diff --git a/init.d/50vcs-ignore b/init.d/50vcs-ignore
index bcc88ba..33d79d3 100755
--- a/init.d/50vcs-ignore
+++ b/init.d/50vcs-ignore
@@ -1,4 +1,4 @@
#!/bin/sh
set -e
-etckeeper update-ignore || true
+etckeeper update-ignore -a || true
diff --git a/uninit.d/01prompt b/uninit.d/01prompt
index 07f2e41..8b43937 100755
--- a/uninit.d/01prompt
+++ b/uninit.d/01prompt
@@ -3,7 +3,7 @@ set -e
if [ "$1" != "-f" ]; then
echo "** Warning: This will DESTROY all recorded history for $ETCKEEPER_DIR,"
- echo "** including the $VCS repository and ignore file."
+ echo "** including the $VCS repository."
echo ""
printf "Are you sure you want to do this? [yN] "
read answer
diff --git a/uninit.d/50vcs-uninit b/uninit.d/50vcs-uninit
index eb9f13a..165d415 100755
--- a/uninit.d/50vcs-uninit
+++ b/uninit.d/50vcs-uninit
@@ -19,6 +19,38 @@ managed_by_etckeeper="managed by etckeeper"
if ! grep -q "$managed_by_etckeeper" "$file"; then
echo "etckeeper: "$file" does not contain \"$managed_by_etckeeper\" comment; not removing"
+ exit 0
else
- rm -f $file
+ realfile="$file"
+ if [ -n "`type -p tempfile`" ]; then
+ tempfile="tempfile"
+ elif [ -n "`type -p mktemp`" ]; then
+ tempfile="mktemp"
+ else
+ echo "etckeeper warning: can't find tempfile or mktemp" >&2
+ exit 1
+ fi
+ file=$($tempfile)
+ otherentries=
+ skipping=
+ while read line; do
+ if echo "$line" | grep -q "$managed_by_etckeeper"; then
+ if [ ! "$skipping" ]; then
+ skipping=1
+ else
+ skipping=
+ fi
+ elif [ ! "$skipping" ]; then
+ echo "$line" >> "$file"
+ otherentries=1
+ fi
+ done <"$realfile"
+
+ if [ "$otherentries" ]; then
+ echo "etckeeper: "$realfile" nonempty after \"$managed_by_etckeeper\" section removal; preserving other entries"
+ mv -f "$file" "$realfile"
+ else
+ rm -f "$file"
+ rm -f "$realfile"
+ fi
fi
diff --git a/update-ignore.d/01update-ignore b/update-ignore.d/01update-ignore
index b6acf17..8cf524a 100755
--- a/update-ignore.d/01update-ignore
+++ b/update-ignore.d/01update-ignore
@@ -160,8 +160,14 @@ writefile () {
if [ -e "$file" ]; then
if ! grep -q "$managed_by_etckeeper" "$file"; then
- echo "etckeeper: "$file" does not contain \"$managed_by_etckeeper\" comment; not updating"
- exit 1
+ if [ "$1" != "-a" ]; then
+ echo "etckeeper: "$file" does not contain \"$managed_by_etckeeper\" comment; not updating"
+ exit 1
+ else
+ echo "etckeeper: "$file" exists but does not contain \"$managed_by_etckeeper\" comment; updating"
+ writefile
+ exit 0
+ fi
fi
realfile="$file"
if [ -n "`type -p tempfile`" ]; then