3 module List = ListLabels
6 val lines : in_channel -> f:(string -> unit) -> unit
10 let lines_of_channel ic =
12 match input_line ic with
13 | exception End_of_file ->
23 iter (lines_of_channel ic) ~f
27 let paths_by_digest = Hashtbl.create 1_000_000 in
28 Stream.lines ic ~f:(fun path ->
30 let digest = Digest.file path in
32 match Hashtbl.find_opt paths_by_digest digest with
38 Hashtbl.replace paths_by_digest digest (path :: paths)
40 eprintf "WARNING: Failed to process %S: %S\n%!" path e
44 let n_paths = List.length paths in
45 if n_paths > 1 then begin
46 printf "%s %d\n%!" (Digest.to_hex digest) n_paths;
47 List.iter paths ~f:(fun path -> printf " %s\n%!" path)
54 Arg.parse [] (fun filename -> ic := open_in filename) "";