[augeas-devel] augeas: master - Do not delete files that had an error upon parsing
David Lutterkort
lutter at fedoraproject.org
Fri Mar 6 23:07:13 UTC 2009
Gitweb: http://git.fedorahosted.org/git/augeas.git?p=augeas.git;a=commitdiff;h=24fd141bffaea4dd5cc1a8e9d62d9452431731d7
Commit: 24fd141bffaea4dd5cc1a8e9d62d9452431731d7
Parent: 835e50a424eb1ca40c289e864e121538abb29329
Author: David Lutterkort <lutter at redhat.com>
AuthorDate: Fri Mar 6 14:53:54 2009 -0800
Committer: David Lutterkort <lutter at redhat.com>
CommitterDate: Fri Mar 6 15:04:58 2009 -0800
Do not delete files that had an error upon parsing
When we can't read a file, we create an entry for it under /augeas, but
there won't be anything for it under /files. That looks a lot like a file
whose entire subtree was deleted; but since we failed reading the file, we
should not delete it either.
---
src/augeas.c | 9 ++++++++-
tests/Makefile.am | 2 +-
tests/test-unlink-error.sh | 24 ++++++++++++++++++++++++
3 files changed, 33 insertions(+), 2 deletions(-)
diff --git a/src/augeas.c b/src/augeas.c
index 718fb00..ba05d66 100644
--- a/src/augeas.c
+++ b/src/augeas.c
@@ -634,6 +634,13 @@ static struct tree *tree_child(struct tree *tree, const char *label) {
static int unlink_removed_files(struct augeas *aug,
struct tree *files, struct tree *meta) {
+ /* Find all nodes that correspond to a file and might have to be
+ * unlinked. A node corresponds to a file if it has a child labelled
+ * 'path', and we only consider it if there are no errors associated
+ * with it */
+ static const char *const file_nodes =
+ "descendant-or-self::*[path][count(error) = 0]";
+
int result = 0;
if (! files->dirty)
@@ -645,7 +652,7 @@ static int unlink_removed_files(struct augeas *aug,
if (tf == NULL) {
/* Unlink all files in tm */
struct pathx *px = NULL;
- if (pathx_parse(tm, "descendant-or-self::*[path]", &px)
+ if (pathx_parse(tm, file_nodes, &px)
!= PATHX_NOERROR) {
result = -1;
continue;
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 20229c8..023e840 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -12,7 +12,7 @@ valgrind: fatest
check_SCRIPTS=test-lenses.sh test-interpreter.sh test-get.sh \
test-put-symlink.sh test-save-empty.sh test-mv.sh \
test-bug-1.sh test-idempotent.sh test-preserve.sh \
- test-events-saved.sh test-save-mode.sh
+ test-events-saved.sh test-save-mode.sh test-unlink-error.sh
EXTRA_DIST=augtest $(AUGTESTS) root \
$(check_SCRIPTS) $(wildcard modules/*.aug) xpath.tests
diff --git a/tests/test-unlink-error.sh b/tests/test-unlink-error.sh
new file mode 100755
index 0000000..350e7ca
--- /dev/null
+++ b/tests/test-unlink-error.sh
@@ -0,0 +1,24 @@
+#! /bin/bash
+
+# Make sure we don't delete files simply because there was an error reading
+# them in
+
+root=$abs_top_builddir/build/test-unlink-error
+xinetd=$root/etc/xinetd.conf
+
+rm -rf $root
+mkdir -p $(dirname $xinetd)
+
+cat > $xinetd <<EOF
+intentional garbage
+EOF
+
+augtool --nostdinc -r $root -I $abs_top_srcdir/lenses > /dev/null <<EOF
+clear /files
+save
+EOF
+
+if [ ! -f $xinetd ] ; then
+ echo "Deleted xinetd.conf"
+ exit 1
+fi
More information about the augeas-devel
mailing list