[augeas-devel] augeas: master - Change the metadata for individual files

David Lutterkort lutter at fedoraproject.org
Thu Jan 7 20:40:36 UTC 2010


Gitweb:        http://git.fedorahosted.org/git/augeas.git?p=augeas.git;a=commitdiff;h=bc899802b65b9b429d726ed01ee5bbacd130cc80
Commit:        bc899802b65b9b429d726ed01ee5bbacd130cc80
Parent:        bce5a8bfcd7e857c93b8b43e7ba4d057999396ca
Author:        David Lutterkort <lutter at redhat.com>
AuthorDate:    Wed Jan 6 15:41:38 2010 -0800
Committer:     David Lutterkort <lutter at redhat.com>
CommitterDate: Thu Jan 7 11:45:04 2010 -0800

Change the metadata for individual files

Record the name of the lens used to load the file in the lens node
underneath /augeas/files/$PATH; the location info of the lens is kept in
lens/info

  * src/transform.c (add_file_info): change what we keep underneath the
    lens node
  * tests/xpath.tests (lircd-ancestor): adapt to metadata change
---
 src/transform.c   |   34 +++++++++++++++++++++++-----------
 tests/xpath.tests |    3 ++-
 2 files changed, 25 insertions(+), 12 deletions(-)

diff --git a/src/transform.c b/src/transform.c
index 9fe7712..e9adfc2 100644
--- a/src/transform.c
+++ b/src/transform.c
@@ -59,6 +59,7 @@ static const int glob_flags = GLOB_NOSORT;
  */
 static const char *const s_path = "path";
 static const char *const s_lens = "lens";
+static const char *const s_info = "info";
 
 static const char *const s_error = "error";
 /* These are all put underneath "error" */
@@ -324,8 +325,8 @@ static int store_error(struct augeas *aug,
  *
  * Returns 0 on success, -1 on error
  */
-static int add_file_info(struct augeas *aug,
-                         const char *node, struct lens *lens) {
+static int add_file_info(struct augeas *aug, const char *node,
+                         struct lens *lens, const char *lens_name) {
     struct tree *file, *tree;
     char *tmp = NULL;
     int r;
@@ -347,15 +348,20 @@ static int add_file_info(struct augeas *aug,
     r = tree_set_value(tree, node);
     ERR_NOMEM(r < 0, aug);
 
-    /* Set 'lens' */
+    /* Set 'lens/info' */
     tmp = format_info(lens->info);
     ERR_NOMEM(tmp == NULL, aug);
-    tree = tree_child_cr(file, s_lens);
+    tree = tree_path_cr(file, 2, s_lens, s_info);
     ERR_NOMEM(tree == NULL, aug);
     r = tree_set_value(tree, tmp);
     ERR_NOMEM(r < 0, aug);
     FREE(tmp);
 
+    /* Set 'lens' */
+    tree = tree->parent;
+    r = tree_set_value(tree, lens_name);
+    ERR_NOMEM(r < 0, aug);
+
     result = 0;
  error:
     free(path);
@@ -376,7 +382,8 @@ static char *append_newline(char *text, size_t len) {
     return text;
 }
 
-static int load_file(struct augeas *aug, struct lens *lens, char *filename) {
+static int load_file(struct augeas *aug, struct lens *lens,
+                     const char *lens_name, char *filename) {
     char *text = NULL;
     const char *err_status = NULL;
     struct aug_file *file = NULL;
@@ -387,7 +394,7 @@ static int load_file(struct augeas *aug, struct lens *lens, char *filename) {
 
     pathjoin(&path, 2, AUGEAS_FILES_TREE, filename + strlen(aug->root) - 1);
 
-    r = add_file_info(aug, path, lens);
+    r = add_file_info(aug, path, lens, lens_name);
     if (r < 0)
         goto done;
 
@@ -468,7 +475,8 @@ const char *xfm_lens_name(struct tree *xfm) {
     return l->value;
 }
 
-static struct lens *xfm_lens(struct augeas *aug, struct tree *xfm) {
+static struct lens *xfm_lens(struct augeas *aug,
+                             struct tree *xfm, const char **lens_name) {
     struct tree *l = NULL;
 
     for (l = xfm->children;
@@ -477,6 +485,8 @@ static struct lens *xfm_lens(struct augeas *aug, struct tree *xfm) {
 
     if (l == NULL || l->value == NULL)
         return NULL;
+    *lens_name = l->value;
+
     return lens_from_name(aug, l->value);
 }
 
@@ -552,7 +562,8 @@ void transform_file_error(struct augeas *aug, const char *status,
 int transform_load(struct augeas *aug, struct tree *xfm) {
     int nmatches;
     char **matches;
-    struct lens *lens = xfm_lens(aug, xfm);
+    const char *lens_name;
+    struct lens *lens = xfm_lens(aug, xfm, &lens_name);
     int r;
 
     if (lens == NULL) {
@@ -563,7 +574,7 @@ int transform_load(struct augeas *aug, struct tree *xfm) {
     if (r == -1)
         return -1;
     for (int i=0; i < nmatches; i++) {
-        load_file(aug, lens, matches[i]);
+        load_file(aug, lens, lens_name, matches[i]);
         free(matches[i]);
     }
     lens_release(lens);
@@ -747,7 +758,8 @@ int transform_save(struct augeas *aug, struct tree *xfm,
     const char *err_status = NULL;
     char *dyn_err_status = NULL;
     struct lns_error *err = NULL;
-    struct lens *lens = xfm_lens(aug, xfm);
+    const char *lens_name;
+    struct lens *lens = xfm_lens(aug, xfm, &lens_name);
     int result = -1, r;
 
     errno = 0;
@@ -895,7 +907,7 @@ int transform_save(struct augeas *aug, struct tree *xfm,
     result = 1;
 
  done:
-    r = add_file_info(aug, path, lens);
+    r = add_file_info(aug, path, lens, lens_name);
     if (r < 0) {
         err_status = "file_info";
         result = -1;
diff --git a/tests/xpath.tests b/tests/xpath.tests
index a6eef82..f2575a3 100644
--- a/tests/xpath.tests
+++ b/tests/xpath.tests
@@ -148,7 +148,8 @@ test ipaddr-sibling //*[../ipaddr]
 
 test lircd-ancestor //*[ancestor::kudzu][label() != '#comment']
      /augeas/files/etc/sysconfig/kudzu/path = /files/etc/sysconfig/kudzu
-     /augeas/files/etc/sysconfig/kudzu/lens = ...
+     /augeas/files/etc/sysconfig/kudzu/lens = @Shellvars
+     /augeas/files/etc/sysconfig/kudzu/lens/info = ...
      /files/etc/sysconfig/kudzu/SAFE = no
 
 test wildcard-last /files/etc/hosts/*[position() = last()]




More information about the augeas-devel mailing list