diff options
| author | John Estabrook <jestabro@vyos.io> | 2025-11-22 22:42:03 -0600 |
|---|---|---|
| committer | John Estabrook <jestabro@vyos.io> | 2025-11-26 20:40:06 -0600 |
| commit | e9e0d6baf373ab7fdb48df59d92e67d528164195 (patch) | |
| tree | b69644d775293c624fcfcf63856b897d3aa7ca62 /src | |
| parent | c4cc67511ef1757dc5d9a9d0a77254d999283043 (diff) | |
| download | vyos1x-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.ml | 52 | ||||
| -rw-r--r-- | src/util.mli | 5 |
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 |
