Commit 06968f37d6 for frr
commit 06968f37d6809d4810eca66831dc7686bd9592c6
Author: mhrn83 <mehranstock1383@gmail.com>
Date: Sun May 31 18:35:07 2026 +0330
lib: Centralize command graph modification
Introduce `cmd_graph_modify()` to eliminate redundant logic.
Signed-off-by: mhrn83 <mehranstock1383@gmail.com>
diff --git a/lib/command.c b/lib/command.c
index 32ee196ddf..6b02d1517b 100644
--- a/lib/command.c
+++ b/lib/command.c
@@ -297,6 +297,23 @@ void cmd_defer_tree(bool val)
defer_cli_tree = val;
}
+enum graph_modify_operation { GRAPH_MODIFY_ADD, GRAPH_MODIFY_REMOVE };
+
+static void cmd_graph_modify(struct graph *cmd_graph, const struct cmd_element *cmd,
+ enum graph_modify_operation operation)
+{
+ struct graph *graph = graph_new();
+ struct cmd_token *token = cmd_token_new(START_TKN, 0, NULL, NULL);
+
+ graph_new_node(graph, token, (void (*)(void *)) & cmd_token_del);
+
+ cmd_graph_parse(graph, cmd);
+ cmd_graph_names(graph);
+ cmd_graph_merge(cmd_graph, graph, operation == GRAPH_MODIFY_ADD ? +1 : -1);
+
+ graph_delete_graph(graph);
+}
+
/* Install a command into a node. */
void _install_element(enum node_type ntype, const struct cmd_element *cmd)
{
@@ -332,17 +349,7 @@ void _install_element(enum node_type ntype, const struct cmd_element *cmd)
(void)hash_get(cnode->cmd_hash, (void *)cmd, hash_alloc_intern);
if (cnode->graph_built || !defer_cli_tree) {
- struct graph *graph = graph_new();
- struct cmd_token *token =
- cmd_token_new(START_TKN, 0, NULL, NULL);
- graph_new_node(graph, token,
- (void (*)(void *)) & cmd_token_del);
-
- cmd_graph_parse(graph, cmd);
- cmd_graph_names(graph);
- cmd_graph_merge(cnode->cmdgraph, graph, +1);
- graph_delete_graph(graph);
-
+ cmd_graph_modify(cnode->cmdgraph, cmd, GRAPH_MODIFY_ADD);
cnode->graph_built = true;
}
@@ -356,15 +363,8 @@ static void cmd_finalize_iter(struct hash_bucket *hb, void *arg)
{
struct cmd_node *cnode = arg;
const struct cmd_element *cmd = hb->data;
- struct graph *graph = graph_new();
- struct cmd_token *token = cmd_token_new(START_TKN, 0, NULL, NULL);
-
- graph_new_node(graph, token, (void (*)(void *)) & cmd_token_del);
- cmd_graph_parse(graph, cmd);
- cmd_graph_names(graph);
- cmd_graph_merge(cnode->cmdgraph, graph, +1);
- graph_delete_graph(graph);
+ cmd_graph_modify(cnode->cmdgraph, cmd, GRAPH_MODIFY_ADD);
}
void cmd_finalize_node(struct cmd_node *cnode)
@@ -409,18 +409,8 @@ void uninstall_element(enum node_type ntype, const struct cmd_element *cmd)
vector_unset_value(cnode->cmd_vector, (void *)cmd);
- if (cnode->graph_built) {
- struct graph *graph = graph_new();
- struct cmd_token *token =
- cmd_token_new(START_TKN, 0, NULL, NULL);
- graph_new_node(graph, token,
- (void (*)(void *)) & cmd_token_del);
-
- cmd_graph_parse(graph, cmd);
- cmd_graph_names(graph);
- cmd_graph_merge(cnode->cmdgraph, graph, -1);
- graph_delete_graph(graph);
- }
+ if (cnode->graph_built)
+ cmd_graph_modify(cnode->cmdgraph, cmd, GRAPH_MODIFY_REMOVE);
if (ntype == VIEW_NODE)
uninstall_element(ENABLE_NODE, cmd);