[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[augeas-devel] [PATCH] Add aug_rename to rename node labels without moving them in the tree.



---
 src/augeas.c           |   26 ++++++++++++++++++++++++++
 src/augeas.h           |   10 ++++++++++
 src/augeas_sym.version |    1 +
 src/augrun.c           |   36 ++++++++++++++++++++++++++++++++++--
 src/augtool.c          |    2 +-
 tests/run.tests        |   35 +++++++++++++++++++++++++++++++++++
 tests/test-api.c       |   17 +++++++++++++++++
 7 files changed, 124 insertions(+), 3 deletions(-)

diff --git a/src/augeas.c b/src/augeas.c
index 22ebd14..7ca081a 100644
--- a/src/augeas.c
+++ b/src/augeas.c
@@ -1245,6 +1245,32 @@ int aug_mv(struct augeas *aug, const char *src, const char *dst) {
     return ret;
 }
 
+int aug_rename(struct augeas *aug, const char *src, const char *lbl) {
+    struct pathx *s = NULL;
+    struct tree *ts;
+    int r, ret;
+
+    api_entry(aug);
+
+    ret = -1;
+    s = pathx_aug_parse(aug, aug->origin, tree_root_ctx(aug), src, true);
+    ERR_BAIL(aug);
+
+    r = find_one_node(s, &ts);
+    if (r < 0)
+        goto error;
+
+    ts->label = strdup(lbl);
+
+    tree_mark_dirty(ts);
+
+    ret = 0;
+ error:
+    free_pathx(s);
+    api_exit(aug);
+    return ret;
+}
+
 int aug_match(const struct augeas *aug, const char *pathin, char ***matches) {
     struct pathx *p = NULL;
     struct tree *tree;
diff --git a/src/augeas.h b/src/augeas.h
index c49308b..e2e3656 100644
--- a/src/augeas.h
+++ b/src/augeas.h
@@ -225,6 +225,16 @@ int aug_rm(augeas *aug, const char *path);
  */
 int aug_mv(augeas *aug, const char *src, const char *dst);
 
+/* Function: aug_rename
+ *
+ * Rename the node SRC to label LBL. SRC must match exactly one node in the
+ * tree.
+ *
+ * Returns:
+ * 0 on success and -1 on failure.
+ */
+int aug_rename(augeas *aug, const char *src, const char *lbl);
+
 /* Function: aug_match
  *
  * Returns:
diff --git a/src/augeas_sym.version b/src/augeas_sym.version
index 5a6ddfc..eb53941 100644
--- a/src/augeas_sym.version
+++ b/src/augeas_sym.version
@@ -56,4 +56,5 @@ AUGEAS_0.16.0 {
     global:
       aug_text_store;
       aug_text_retrieve;
+      aug_rename;
 } AUGEAS_0.15.0;
diff --git a/src/augrun.c b/src/augrun.c
index 7895252..c7a2679 100644
--- a/src/augrun.c
+++ b/src/augrun.c
@@ -547,12 +547,12 @@ static void cmd_mv(struct command *cmd) {
     if (r < 0)
         ERR_REPORT(cmd, AUG_ECMDRUN,
                    "Moving %s to %s failed", src, dst);
-}
+};
 
 static const struct command_opt_def cmd_mv_opts[] = {
     { .type = CMD_PATH, .name = "src", .optional = false,
       .help = "the tree to move" },
-    { .type = CMD_PATH, .name = "dst", .optional = false,
+    { .type = CMD_STR, .name = "dst", .optional = false,
       .help = "where to put the source tree" },
     CMD_OPT_DEF_LAST
 };
@@ -580,6 +580,37 @@ static const struct command_def cmd_move_def = {
     .help = cmd_mv_help
 };
 
+static void cmd_rename(struct command *cmd) {
+    const char *src = arg_value(cmd, "src");
+    const char *lbl = arg_value(cmd, "lbl");
+    int r;
+
+    r = aug_rename(cmd->aug, src, lbl);
+    if (r < 0)
+        ERR_REPORT(cmd, AUG_ECMDRUN,
+                   "Renaming %s to %s failed", src, lbl);
+};
+
+static const struct command_opt_def cmd_rename_opts[] = {
+    { .type = CMD_PATH, .name = "src", .optional = false,
+      .help = "the tree to rename" },
+    { .type = CMD_PATH, .name = "lbl", .optional = false,
+      .help = "the new label" },
+    CMD_OPT_DEF_LAST
+};
+
+static const char const cmd_rename_help[] =
+    "Rename node SRC to label LBL.  SRC must match  exactly one node\n"
+    "in the tree.";
+
+static const struct command_def cmd_rename_def = {
+    .name = "rename",
+    .opts = cmd_rename_opts,
+    .handler = cmd_rename,
+    .synopsis = "rename a subtree label",
+    .help = cmd_rename_help
+};
+
 static void cmd_set(struct command *cmd) {
     const char *path = arg_value(cmd, "path");
     const char *val = arg_value(cmd, "value");
@@ -1088,6 +1119,7 @@ static const struct command_def const *commands[] = {
     &cmd_match_def,
     &cmd_mv_def,
     &cmd_move_def,
+    &cmd_rename_def,
     &cmd_print_def,
     &cmd_dump_xml_def,
     &cmd_rm_def,
diff --git a/src/augtool.c b/src/augtool.c
index ce4a8a3..bb0becc 100644
--- a/src/augtool.c
+++ b/src/augtool.c
@@ -167,7 +167,7 @@ static char *readline_command_generator(const char *text, int state) {
     static const char *const commands[] = {
         "quit", "clear", "defnode", "defvar",
         "get", "ins", "load", "ls", "match",
-        "mv", "print", "dump-xml", "rm", "save", "set", "setm",
+        "mv", "rename", "print", "dump-xml", "rm", "save", "set", "setm",
         "clearm", "span", "store", "retrieve", "help", NULL };
 
     static int current = 0;
diff --git a/tests/run.tests b/tests/run.tests
index 4f451a2..53bf5ab 100644
--- a/tests/run.tests
+++ b/tests/run.tests
@@ -213,6 +213,41 @@ prints
   /x/y/b/c = "value"
 
 #
+# test rename
+#
+test rename 1
+  rename /augeas/version version2
+
+test rename-not-there -1 ENOMATCH
+  rename /not-there neither-here
+
+test rename-into-self 1
+  rename /augeas augeas
+
+test rename-multiple -1 EMMATCH
+  rename /augeas/version/save/* saved
+
+test rename-tree1 3
+  set /a/b/c value
+  rename /a/b/c x
+  print /*[ label() != 'augeas' and label() != 'files']
+prints
+  /a
+  /a/b
+  /a/b/x = "value"
+
+test rename-tree2 4
+  set /a/b/c value
+  set /a/b/d value2
+  rename /a/b/c x
+  print /*[ label() != 'augeas' and label() != 'files']
+prints
+  /a
+  /a/b
+  /a/b/x = "value"
+  /a/b/d = "value2"
+
+#
 # test set
 #
 test set-not-there 2
diff --git a/tests/test-api.c b/tests/test-api.c
index 5726540..4b1f75c 100644
--- a/tests/test-api.c
+++ b/tests/test-api.c
@@ -416,6 +416,22 @@ static void testMv(CuTest *tc) {
 }
 
 
+static void testRename(CuTest *tc) {
+    struct augeas *aug;
+    int r;
+
+    aug = aug_init(root, loadpath, AUG_NO_STDINC|AUG_NO_LOAD);
+    CuAssertPtrNotNull(tc, aug);
+
+    r = aug_set(aug, "/a/b/c", "value");
+    CuAssertRetSuccess(tc, r);
+
+    r = aug_rename(aug, "/a/b/c", "d");
+    CuAssertRetSuccess(tc, r);
+
+    aug_close(aug);
+}
+
 static void testToXml(CuTest *tc) {
     struct augeas *aug;
     int r;
@@ -550,6 +566,7 @@ int main(void) {
     SUITE_ADD_TEST(suite, testDefNodeCreateMeta);
     SUITE_ADD_TEST(suite, testNodeInfo);
     SUITE_ADD_TEST(suite, testMv);
+    SUITE_ADD_TEST(suite, testRename);
     SUITE_ADD_TEST(suite, testToXml);
     SUITE_ADD_TEST(suite, testTextStore);
     SUITE_ADD_TEST(suite, testTextRetrieve);
-- 
1.7.9.5


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]