X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fuci.git;a=blobdiff_plain;f=history.c;h=2b6dbef64718ea319b318c577c266cdf1425952e;hp=73c1bf06ffaf845018009523dfc26303b11a5df3;hb=28d2cc2adde3f9ec077a77cf363045a17f116032;hpb=f1ae2ddc4ff16e541c46f595073bf277cd8f778a diff --git a/history.c b/history.c index 73c1bf0..2b6dbef 100644 --- a/history.c +++ b/history.c @@ -28,7 +28,7 @@ /* record a change that was done to a package */ void -uci_add_history(struct uci_context *ctx, struct uci_list *list, int cmd, char *section, char *option, char *value) +uci_add_history(struct uci_context *ctx, struct uci_list *list, int cmd, const char *section, const char *option, const char *value) { struct uci_history *h; int size = strlen(section) + 1; @@ -92,17 +92,25 @@ static inline void uci_parse_history_tuple(struct uci_context *ctx, char **buf, { int c = UCI_CMD_CHANGE; - if (**buf == '-') { + switch(**buf) { + case '-': c = UCI_CMD_REMOVE; - *buf += 1; - } else if (**buf == '@') { + break; + case '@': c = UCI_CMD_RENAME; - *buf += 1; - } else if (**buf == '+') { - /* UCI_CMD_ADD is used for anonymous sections */ + break; + case '+': + /* UCI_CMD_ADD is used for anonymous sections or list values */ c = UCI_CMD_ADD; - *buf += 1; + break; + case '|': + c = UCI_CMD_LIST_ADD; + break; } + + if (c != UCI_CMD_CHANGE) + *buf += 1; + if (cmd) *cmd = c; @@ -143,6 +151,9 @@ static void uci_parse_history_line(struct uci_context *ctx, struct uci_package * case UCI_CMD_REMOVE: UCI_INTERNAL(uci_delete, ctx, p, section, option); break; + case UCI_CMD_LIST_ADD: + UCI_INTERNAL(uci_add_list, ctx, p, section, option, value, NULL); + break; case UCI_CMD_ADD: case UCI_CMD_CHANGE: UCI_INTERNAL(uci_set, ctx, p, section, option, value, &e); @@ -387,22 +398,26 @@ int uci_save(struct uci_context *ctx, struct uci_package *p) uci_foreach_element_safe(&p->history, tmp, e) { struct uci_history *h = uci_to_history(e); + char *prefix = ""; switch(h->cmd) { case UCI_CMD_REMOVE: - fprintf(f, "-"); + prefix = "-"; break; case UCI_CMD_RENAME: - fprintf(f, "@"); + prefix = "@"; break; case UCI_CMD_ADD: - fprintf(f, "+"); + prefix = "+"; + break; + case UCI_CMD_LIST_ADD: + prefix = "|"; break; default: break; } - fprintf(f, "%s.%s", p->e.name, h->section); + fprintf(f, "%s%s.%s", prefix, p->e.name, h->section); if (e->name) fprintf(f, ".%s", e->name);