X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fuci.git;a=blobdiff_plain;f=history.c;h=c698192eda56f760665933f589fb32764927c070;hp=e3e19de4e60dc0ce4a0e238df30b275796038ff9;hb=2ae9f4d72d7907e8edda7d361a0eb84a86f1bab3;hpb=c60702b55cf8efe9dcd359fc9aa8e9c7cd421ada diff --git a/history.c b/history.c index e3e19de..c698192 100644 --- a/history.c +++ b/history.c @@ -93,6 +93,9 @@ static inline int uci_parse_history_tuple(struct uci_context *ctx, char **buf, s int c = UCI_CMD_CHANGE; switch(**buf) { + case '^': + c = UCI_CMD_REORDER; + break; case '-': c = UCI_CMD_REMOVE; break; @@ -119,6 +122,10 @@ static inline int uci_parse_history_tuple(struct uci_context *ctx, char **buf, s goto error; switch(c) { + case UCI_CMD_REORDER: + if (!ptr->value || ptr->option) + goto error; + break; case UCI_CMD_RENAME: if (!ptr->value || !uci_validate_name(ptr->value)) goto error; @@ -149,6 +156,12 @@ static void uci_parse_history_line(struct uci_context *ctx, struct uci_package * uci_add_history(ctx, &p->saved_history, cmd, ptr.section, ptr.option, ptr.value); switch(cmd) { + case UCI_CMD_REORDER: + expand_ptr(ctx, &ptr, true); + if (!ptr.s) + UCI_THROW(ctx, UCI_ERR_NOTFOUND); + UCI_INTERNAL(uci_reorder_section, ctx, ptr.s, strtoul(ptr.value, NULL, 10)); + break; case UCI_CMD_RENAME: UCI_INTERNAL(uci_rename, ctx, &ptr); break; @@ -406,6 +419,17 @@ int uci_save(struct uci_context *ctx, struct uci_package *p) if ((asprintf(&filename, "%s/%s", ctx->savedir, p->e.name) < 0) || !filename) UCI_THROW(ctx, UCI_ERR_MEM); + uci_foreach_element(&ctx->hooks, tmp) { + struct uci_hook *hook = uci_to_hook(tmp); + + if (!hook->ops->set) + continue; + + uci_foreach_element(&p->history, e) { + hook->ops->set(hook->ops, p, uci_to_history(e)); + } + } + ctx->err = 0; UCI_TRAP_SAVE(ctx, done); f = uci_open_stream(ctx, filename, SEEK_END, true, true); @@ -425,6 +449,9 @@ int uci_save(struct uci_context *ctx, struct uci_package *p) case UCI_CMD_ADD: prefix = "+"; break; + case UCI_CMD_REORDER: + prefix = "^"; + break; case UCI_CMD_LIST_ADD: prefix = "|"; break;