From 134a627130a732f6315d323895365dd59fab95c5 Mon Sep 17 00:00:00 2001 From: Přemysl Janouch Date: Sun, 3 May 2015 19:11:57 +0200 Subject: degesch: finish /set One bug remaining to make it work. --- common.c | 14 ++++++++++++++ degesch.c | 14 +++++--------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/common.c b/common.c index 629b31b..1ec8cee 100644 --- a/common.c +++ b/common.c @@ -1385,6 +1385,20 @@ end: return object; } +/// Clone an item. Schema assignments aren't retained. +struct config_item_ * +config_item_clone (struct config_item_ *self) +{ + // Oh well, it saves code + struct str tmp; + str_init (&tmp); + config_item_write (self, false, &tmp); + struct config_item_ *result = + config_item_parse (tmp.str, tmp.len, true, NULL); + str_free (&tmp); + return result; +} + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // XXX: this thing is ugly in concept diff --git a/degesch.c b/degesch.c index de40462..a60c4e9 100644 --- a/degesch.c +++ b/degesch.c @@ -3835,6 +3835,8 @@ handle_command_set_add struct str_vector items; str_vector_init (&items); split_str (item->value.string.str, ',', &items); + if (items.len == 1 && !*items.vector[0]) + str_vector_reset (&items); if (str_vector_find (&items, value) != -1) error_set (e, "already present in the array: %s", value); @@ -3856,6 +3858,8 @@ handle_command_set_remove struct str_vector items; str_vector_init (&items); split_str (item->value.string.str, ',', &items); + if (items.len == 1 && !*items.vector[0]) + str_vector_reset (&items); ssize_t i = str_vector_find (&items, value); if (i == -1) @@ -3870,14 +3874,6 @@ handle_command_set_remove return result; } -static bool -handle_command_set_replace (struct app_context *ctx, - struct config_item_ *item, struct config_item_ *new_, struct error **e) -{ - // TODO: replace the item (or log error) - return false; -} - static void handle_command_set_assign_item (struct app_context *ctx, char *key, struct config_item_ *new_, bool add, bool remove) @@ -3895,7 +3891,7 @@ handle_command_set_assign_item (struct app_context *ctx, else if (remove) handle_command_set_remove (item, new_->value.string.str, &e); else - handle_command_set_replace (ctx, item, new_, &e); + config_item_set_from (item, config_item_clone (new_), &e); if (e) { -- cgit v1.2.3-70-g09d2