- | Root_paths of string list
- | Paths_on_stdin
-
-let main input =
- let paths =
- match input with
- | Paths_on_stdin ->
- In_channel.lines stdin
- | Root_paths paths ->
- let paths = StrSet.elements (StrSet.of_list paths) in
- Stream.concat (List.map paths ~f:Directory_tree.find_files)
- in
+ | Stdin
+ | Directories of string list
+
+type output =
+ | Stdout
+ | Directory of string
+
+let make_input_stream = function
+ | Stdin ->
+ In_channel.lines stdin
+ | Directories paths ->
+ let paths = StrSet.elements (StrSet.of_list paths) in
+ Stream.concat (List.map paths ~f:Directory_tree.find_files)
+
+let make_output_fun = function
+ | Stdout ->
+ fun digest n_paths paths ->
+ printf "%s %d\n%!" (Digest.to_hex digest) n_paths;
+ List.iter (StrSet.elements paths) ~f:(printf " %S\n%!")
+ | Directory dir ->
+ fun digest _ paths ->
+ let digest = Digest.to_hex digest in
+ let dir = Filename.concat dir (String.sub digest 0 2) in
+ Unix.mkdir dir ~perm:0o700;
+ let oc = open_out (Filename.concat dir digest) in
+ List.iter (StrSet.elements paths) ~f:(fun path ->
+ output_string oc (sprintf "%S\n%!" path)
+ );
+ close_out oc
+
+let main input output ignore =
+ let output = make_output_fun output in
+ let input = make_input_stream input in