diff options
| author | Daniil Baturin <daniil@vyos.io> | 2022-03-01 11:57:30 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-03-01 11:57:30 -0500 |
| commit | f989704c7904540e671e45750d67d77b720410dd (patch) | |
| tree | 89ab7ce326551e0103d076e57f3ae6eef6152cdb | |
| parent | 6419424513c21d1dd0b07c4797b4390fa01908ed (diff) | |
| parent | 23173c6b5d12e5b7990fafe2b43d40f5cbf1a2a5 (diff) | |
| download | vyos1x-config-f989704c7904540e671e45750d67d77b720410dd.tar.gz vyos1x-config-f989704c7904540e671e45750d67d77b720410dd.zip | |
Merge pull request #3 from jestabro/subtree
T4235: simplify return value of diff_tree
| -rw-r--r-- | src/config_diff.ml | 25 | ||||
| -rw-r--r-- | src/config_diff.mli | 4 | ||||
| -rw-r--r-- | src/config_tree.ml | 9 | ||||
| -rw-r--r-- | src/config_tree.mli | 2 |
4 files changed, 34 insertions, 6 deletions
diff --git a/src/config_diff.ml b/src/config_diff.ml index 75d12dd..565d64f 100644 --- a/src/config_diff.ml +++ b/src/config_diff.ml @@ -15,7 +15,7 @@ exception Empty_comparison module ValueS = Set.Make(struct type t = string let compare = compare end) -let make_diff_tree l r = { left = l; right = r; +let make_diff_trees l r = { left = l; right = r; add = ref (Config_tree.make "root"); del = ref (Config_tree.make "root"); inter = ref (Config_tree.make "root"); @@ -109,6 +109,16 @@ let clone ?(with_children=true) ?(set_values=[]) old_root new_root path = let path_remaining = Vylist.complement path path_existing in clone_path ~with_children:with_children ~set_values:set_values old_root new_root path_existing path_remaining +let rec graft_children children stock path = + match children with + | [] -> stock + | x::xs -> + let stock = Vytree.insert ~children:(children_of x) stock (path @ [name_of x]) (data_of x) + in graft_children xs stock path + +let graft_tree stem stock path = + graft_children (children_of stem) stock path + (* define the diff_func; in this instance, we imperatively build the difference trees *) let decorate_trees (trees : diff_trees) ?(with_children=true) (path : string list) (m : change) = match m with @@ -147,11 +157,18 @@ let compare path left right = else let (left, right) = if not (path = []) then (tree_at_path path left, tree_at_path path right) else (left, right) in - let trees = make_diff_tree left right in + let trees = make_diff_trees left right in diff [] (decorate_trees trees) [(Option.some left, Option.some right)]; trees (* wrapper to return diff trees *) -let diffs path left right = +let diff_tree path left right = let trees = compare path left right in - (!(trees.add), !(trees.del), !(trees.inter)) + let add_node = Config_tree.make "add" in + let del_node = Config_tree.make "delete" in + let int_node = Config_tree.make "inter" in + let ret = make Config_tree.default_data "root" [add_node; del_node; int_node] in + let ret = graft_tree !(trees.add) ret ["add"] in + let ret = graft_tree !(trees.del) ret ["delete"] in + let ret = graft_tree !(trees.inter) ret ["inter"] in + ret diff --git a/src/config_diff.mli b/src/config_diff.mli index 623c6ef..5f96209 100644 --- a/src/config_diff.mli +++ b/src/config_diff.mli @@ -13,9 +13,9 @@ type diff_trees = { exception Incommensurable exception Empty_comparison -val make_diff_tree : Config_tree.t -> Config_tree.t -> diff_trees +val make_diff_trees : Config_tree.t -> Config_tree.t -> diff_trees val clone : ?with_children:bool -> ?set_values:string list -> Config_tree.t -> Config_tree.t -> string list -> Config_tree.t val decorate_trees : diff_trees -> ?with_children:bool -> string list -> change -> unit val compare : string list -> Config_tree.t -> Config_tree.t -> diff_trees -val diffs : string list -> Config_tree.t -> Config_tree.t -> Config_tree.t * Config_tree.t * Config_tree.t +val diff_tree : string list -> Config_tree.t -> Config_tree.t -> Config_tree.t diff --git a/src/config_tree.ml b/src/config_tree.ml index 6ae7ad2..3e97e80 100644 --- a/src/config_tree.ml +++ b/src/config_tree.ml @@ -101,6 +101,15 @@ let is_tag node path = let data = Vytree.get_data node path in data.tag +let get_subtree ?(with_node=false) node path = + try + let n = Vytree.get node path in + if with_node then + Vytree.make_full default_data "root" [n] + else + Vytree.make_full default_data "root" (Vytree.children_of_node n) + with Vytree.Nonexistent_path -> make "root" + module Renderer = struct (* Rendering configs as set commands *) diff --git a/src/config_tree.mli b/src/config_tree.mli index cf94af7..5375c23 100644 --- a/src/config_tree.mli +++ b/src/config_tree.mli @@ -34,6 +34,8 @@ val set_tag : t -> string list -> bool -> t val is_tag : t -> string list -> bool +val get_subtree : ?with_node:bool -> t -> string list -> t + val render_commands : ?op:command -> t -> string list -> string val render_config : t -> string |
