Переглянути джерело

Fix show and diff operations for oneliners. Diff forces non-oneliners output

Serj Kalichev 10 місяців тому
батько
коміт
7ec75c1987
4 змінених файлів з 28 додано та 21 видалено
  1. 1 1
      src/kly.c
  2. 1 1
      src/private.h
  3. 20 18
      src/show.c
  4. 6 1
      src/syms.c

+ 1 - 1
src/kly.c

@@ -390,7 +390,7 @@ char *klysc_leafref_xpath(const struct lysc_node *node,
 }
 
 
-size_t klyd_child_num(const struct lyd_node *node)
+size_t klyd_visible_child_num(const struct lyd_node *node)
 {
 	const struct lyd_node *nodes_list = NULL;
 	const struct lyd_node *iter = NULL;

+ 1 - 1
src/private.h

@@ -99,7 +99,7 @@ char *klysc_leafref_xpath(const struct lysc_node *node,
 	const struct lysc_type *type, const char *node_path);
 const char *klysc_identityref_prefix(struct lysc_type_identityref *type,
 	const char *name);
-size_t klyd_child_num(const struct lyd_node *node);
+size_t klyd_visible_child_num(const struct lyd_node *node);
 
 C_DECL_END
 

+ 20 - 18
src/show.c

@@ -61,27 +61,28 @@ static void show_container(const struct lyd_node *node, size_t level,
 {
 	char begin_bracket[3] = {' ', opts->begin_bracket, '\0'};
 	size_t child_num = 0;
+	bool_t show_brackets = BOOL_FALSE;
+	bool_t node_is_oneliner = BOOL_FALSE;
 
 	if (!node)
 		return;
 
-	if (opts->oneliners)
-		child_num = klyd_child_num(node);
-	else
-		child_num = 2; // Bogus value to be non-oneliner
+	child_num = klyd_visible_child_num(node);
+	node_is_oneliner = opts->oneliners && (child_num == 1);
+	show_brackets = opts->show_brackets && !node_is_oneliner && (child_num != 0);
 
 	printf("%s%*s%s%s%s%s",
 		diff_prefix(op, opts),
 		parent_is_oneliner ? 1 : (int)(level * opts->indent), "",
 		node->schema->name,
-		(opts->show_brackets && (child_num > 1)) ? begin_bracket : "",
+		show_brackets ? begin_bracket : "",
 		diff_suffix(op, opts),
-		(child_num != 1) ? "\n" : "");
+		node_is_oneliner ? "" : "\n");
 	if (child_num != 0)
 		show_subtree(lyd_child(node),
-			(child_num <= 1) ? level : (level + 1),
-			op, opts, (child_num <= 1));
-	if (opts->show_brackets && (child_num > 1)) {
+			node_is_oneliner ? level : (level + 1),
+			op, opts, node_is_oneliner);
+	if (show_brackets) {
 		printf("%s%*s%c%s\n",
 			diff_prefix(op, opts),
 			(int)(level * opts->indent), "",
@@ -99,14 +100,15 @@ static void show_list(const struct lyd_node *node, size_t level,
 	bool_t first_key = BOOL_TRUE;
 	const char *default_value = NULL;
 	size_t child_num = 0;
+	bool_t show_brackets = BOOL_FALSE;
+	bool_t node_is_oneliner = BOOL_FALSE;
 
 	if (!node)
 		return;
 
-	if (opts->oneliners)
-		child_num = klyd_child_num(node);
-	else
-		child_num = 2; // Bogus value to be non-oneliner
+	child_num = klyd_visible_child_num(node);
+	node_is_oneliner = opts->oneliners && (child_num == 1);
+	show_brackets = opts->show_brackets && !node_is_oneliner && (child_num != 0);
 
 	printf("%s%*s%s",
 		diff_prefix(op, opts),
@@ -139,14 +141,14 @@ static void show_list(const struct lyd_node *node, size_t level,
 		first_key = BOOL_FALSE;
 	}
 	printf("%s%s%s",
-		(opts->show_brackets && (child_num > 1)) ? begin_bracket : "",
+		show_brackets ? begin_bracket : "",
 		diff_suffix(op, opts),
-		(child_num != 1) ? "\n" : "");
+		node_is_oneliner ? "" : "\n");
 	if (child_num != 0)
 		show_subtree(lyd_child(node),
-			(child_num <= 1) ? level : (level + 1),
-			op, opts, (child_num <= 1));
-	if (opts->show_brackets && (child_num > 1)) {
+			node_is_oneliner ? level : (level + 1),
+			op, opts, node_is_oneliner);
+	if (show_brackets) {
 		printf("%s%*s%c%s\n",
 			diff_prefix(op, opts),
 			(int)(level * opts->indent), "",

+ 6 - 1
src/syms.c

@@ -966,6 +966,7 @@ int srp_diff(kcontext_t *context)
 	faux_argv_t *cur_path = NULL;
 	const char *xpath = NULL;
 	struct lyd_node *diff = NULL;
+	pline_opts_t masked_opts = {};
 
 	assert(context);
 	sess = srp_udata_sr_sess(context);
@@ -1027,7 +1028,11 @@ int srp_diff(kcontext_t *context)
 		goto err;
 	}
 
-	show_subtree(diff, 0, DIFF_OP_NONE, srp_udata_opts(context), BOOL_FALSE);
+	// Hack to don't show oneliners within diff. Mask oneliners flag
+	masked_opts = *srp_udata_opts(context);
+	masked_opts.oneliners = BOOL_FALSE;
+
+	show_subtree(diff, 0, DIFF_OP_NONE, &masked_opts, BOOL_FALSE);
 	lyd_free_siblings(diff);
 
 	ret = 0;