schema tree BUGFIX using of module's latest_revision flag
update it when the module is being inserted into context and use
it when searching for the latest revision of a module in the context.
diff --git a/src/tree_schema.c b/src/tree_schema.c
index 60bd9b9..29e418e 100644
--- a/src/tree_schema.c
+++ b/src/tree_schema.c
@@ -1076,10 +1076,21 @@
return ret;
}
+static void
+lys_latest_unset(struct lys_module *mod)
+{
+ if (mod->parsed) {
+ mod->parsed->latest_revision = 0;
+ }
+ if (mod->compiled) {
+ mod->compiled->latest_revision = 0;
+ }
+}
+
static const struct lys_module *
lys_parse_mem_(struct ly_ctx *ctx, const char *data, LYS_INFORMAT format, const char *revision, int implement)
{
- struct lys_module *mod = NULL;
+ struct lys_module *mod = NULL, *latest;
LY_ERR ret;
LY_CHECK_ARG_RET(ctx, ctx, data, NULL);
@@ -1095,14 +1106,18 @@
break;
case LYS_IN_YANG:
ret = yang_parse(ctx, data, &mod->parsed);
- LY_CHECK_RET(ret, NULL);
break;
default:
LOGERR(ctx, LY_EINVAL, "Invalid schema input format.");
break;
}
+ LY_CHECK_RET(ret, NULL);
+
+ /* make sure that the newest revision is at position 0 */
+ lysp_sort_revisions(mod->parsed->revs);
if (implement) {
+ /* mark the loaded module implemented */
if (ly_ctx_get_module_implemented(ctx, mod->parsed->name)) {
LOGERR(ctx, LY_EDENIED, "Module \"%s\" is already implemented in the context.", mod->parsed->name);
lys_module_free(mod, NULL);
@@ -1134,6 +1149,25 @@
return NULL;
}
+ /* decide the latest revision */
+ latest = (struct lys_module*)ly_ctx_get_module_latest(ctx, mod->parsed->name);
+ if (latest) {
+ if (mod->parsed->revs) {
+ if ((latest->parsed && !latest->parsed->revs) || (!latest->parsed && !latest->compiled->revs)) {
+ /* latest has no revision, so mod is anyway newer */
+ mod->parsed->latest_revision = 1;
+ lys_latest_unset(latest);
+ } else {
+ if (strcmp(mod->parsed->revs[0].date, latest->parsed ? latest->parsed->revs[0].date : latest->compiled->revs[0].date) > 0) {
+ mod->parsed->latest_revision = 1;
+ lys_latest_unset(latest);
+ }
+ }
+ }
+ } else {
+ mod->parsed->latest_revision = 1;
+ }
+
/* add into context */
ly_set_add(&ctx->list, mod, LY_SET_OPT_USEASLIST);