summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Estabrook <jestabro@vyos.io>2025-11-22 22:42:03 -0600
committerJohn Estabrook <jestabro@vyos.io>2025-11-26 20:40:06 -0600
commite9e0d6baf373ab7fdb48df59d92e67d528164195 (patch)
treeb69644d775293c624fcfcf63856b897d3aa7ca62 /src
parentc4cc67511ef1757dc5d9a9d0a77254d999283043 (diff)
downloadvyos1x-config-e9e0d6baf373ab7fdb48df59d92e67d528164195.tar.gz
vyos1x-config-e9e0d6baf373ab7fdb48df59d92e67d528164195.zip
T8032: add file_compare utility for comparing files up to whitespace
It is useful to have an internal implementation of file_compare (T8031) for use in the vyconf replacement for cli-shell-api sessionUnsaved in shell functions.
Diffstat (limited to 'src')
-rw-r--r--src/util.ml52
-rw-r--r--src/util.mli5
2 files changed, 57 insertions, 0 deletions
diff --git a/src/util.ml b/src/util.ml
index f3701f2..40988c9 100644
--- a/src/util.ml
+++ b/src/util.ml
@@ -172,3 +172,55 @@ let flag path =
drop_last_n p (len - i - 1)
in
List.mapi (fun k _ -> aux path k) path
+
+
+exception End_of_read of in_channel
+
+let file_compare ?(ignore_line_prefix="") file1 file2 =
+ let open_files f1 f2 =
+ let ic1_opt =
+ try Some (open_in f1)
+ with Sys_error _ -> None
+ in
+ let ic2_opt =
+ try Some (open_in f2)
+ with Sys_error _ -> None
+ in
+ ic1_opt, ic2_opt
+ in
+ let rec line_loop ic =
+ let line =
+ try
+ input_line ic
+ with End_of_file -> raise (End_of_read ic)
+ in
+ let line' = String.trim line in
+ if line' <> "" &&
+ (ignore_line_prefix = "" ||
+ not (String.starts_with ~prefix:ignore_line_prefix line'))
+ then line'
+ else line_loop ic
+ in
+ let rec loop ic1 ic2 =
+ try
+ let line1 = line_loop ic1 in
+ let line2 = line_loop ic2 in
+ if line1 <> line2 then false
+ else loop ic1 ic2
+ with End_of_read ic ->
+ try
+ if ic = ic1 then
+ let () = ignore (line_loop ic2) in false
+ else false
+ with End_of_read _ ->
+ true
+ in
+ match open_files file1 file2 with
+ | Some ic1, Some ic2 ->
+ let result = loop ic1 ic2 in
+ close_in ic1;
+ close_in ic2;
+ result
+ | Some ic1, None -> close_in ic1; false
+ | None, Some ic2 -> close_in ic2; false
+ | None, None -> false
diff --git a/src/util.mli b/src/util.mli
index 9dd7cd8..f82a703 100644
--- a/src/util.mli
+++ b/src/util.mli
@@ -35,3 +35,8 @@ val is_empty : 'a list -> bool
val is_sublist : 'a list -> 'a list -> bool
val flag : 'a list -> 'a list list
+
+
+exception End_of_read of in_channel
+
+val file_compare : ?ignore_line_prefix:string -> string -> string -> bool