Skip to content

Commit 8f96aba

Browse files
committed
diff BUGFIX order even diff nodes
1 parent b0f1bc5 commit 8f96aba

File tree

2 files changed

+15
-8
lines changed

2 files changed

+15
-8
lines changed

src/diff.c

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,10 @@ lyd_diff_add(const struct lyd_node *node, enum lyd_diff_op op, const char *orig_
406406

407407
dup = diff_parent;
408408
} else {
409-
diff_opts = LYD_DUP_NO_META | LYD_DUP_WITH_PARENTS | LYD_DUP_WITH_FLAGS | LYD_DUP_NO_LYDS;
409+
diff_opts = LYD_DUP_NO_META | LYD_DUP_WITH_PARENTS | LYD_DUP_WITH_FLAGS;
410+
if (lysc_is_userordered(node->schema)) {
411+
diff_opts |= LYD_DUP_NO_LYDS;
412+
}
410413
if ((op != LYD_DIFF_OP_REPLACE) || !lysc_is_userordered(node->schema) || (node->schema->flags & LYS_CONFIG_R)) {
411414
/* move applies only to the user-ordered list, no descendants */
412415
diff_opts |= LYD_DUP_RECURSIVE;
@@ -2865,6 +2868,7 @@ lyd_diff_merge_r(const struct lyd_node *src_diff, struct lyd_node *diff_parent,
28652868
struct lyd_node *child, *diff_node = NULL;
28662869
enum lyd_diff_op src_op, cur_op;
28672870
struct ly_ht *child_dup_inst = NULL;
2871+
uint32_t diff_opts;
28682872

28692873
/* get source node operation */
28702874
LY_CHECK_RET(lyd_diff_get_op(src_diff, &src_op, NULL));
@@ -2932,8 +2936,11 @@ lyd_diff_merge_r(const struct lyd_node *src_diff, struct lyd_node *diff_parent,
29322936
} else {
29332937
add_diff:
29342938
/* add new diff node with all descendants */
2935-
LY_CHECK_RET(lyd_dup_single(src_diff, diff_parent, LYD_DUP_RECURSIVE | LYD_DUP_WITH_FLAGS | LYD_DUP_NO_LYDS,
2936-
&diff_node));
2939+
diff_opts = LYD_DUP_RECURSIVE | LYD_DUP_WITH_FLAGS;
2940+
if (lysc_is_userordered(src_diff->schema)) {
2941+
diff_opts |= LYD_DUP_NO_LYDS;
2942+
}
2943+
LY_CHECK_RET(lyd_dup_single(src_diff, diff_parent, diff_opts, &diff_node));
29372944

29382945
/* insert node into diff if not already */
29392946
if (!diff_parent) {
@@ -3455,7 +3462,7 @@ lyd_diff_reverse_all(const struct lyd_node *src_diff, struct lyd_node **diff)
34553462
}
34563463

34573464
/* duplicate diff */
3458-
LY_CHECK_GOTO(rc = lyd_dup_siblings(src_diff, NULL, LYD_DUP_RECURSIVE | LYD_DUP_NO_LYDS, diff), cleanup);
3465+
LY_CHECK_GOTO(rc = lyd_dup_siblings(src_diff, NULL, LYD_DUP_RECURSIVE, diff), cleanup);
34593466

34603467
/* find 'yang' module */
34613468
mod = ly_ctx_get_module_implemented(LYD_CTX(src_diff), "yang");

tests/utests/data/test_diff.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -480,14 +480,14 @@ test_list(void **state)
480480
"</df>\n";
481481
const char *out_diff_2 =
482482
"<df xmlns=\"urn:libyang:tests:defaults\" xmlns:yang=\"urn:ietf:params:xml:ns:yang:1\" yang:operation=\"none\">\n"
483-
" <list yang:operation=\"delete\">\n"
484-
" <name>c</name>\n"
485-
" <value>3</value>\n"
486-
" </list>\n"
487483
" <list yang:operation=\"create\">\n"
488484
" <name>a</name>\n"
489485
" <value>2</value>\n"
490486
" </list>\n"
487+
" <list yang:operation=\"delete\">\n"
488+
" <name>c</name>\n"
489+
" <value>3</value>\n"
490+
" </list>\n"
491491
"</df>\n";
492492
const char *out_merge =
493493
"<df xmlns=\"urn:libyang:tests:defaults\" xmlns:yang=\"urn:ietf:params:xml:ns:yang:1\" yang:operation=\"none\">\n"

0 commit comments

Comments
 (0)