My agentic slop goes here. Not intended for anyone else!
1(** Simple CLI tool for generating registry files - minimal version *)
2
3open Cmdliner
4
5(* CLI arguments *)
6let directory_arg =
7 let doc = "Directory to scan for files" in
8 Arg.(required & pos 0 (some dir) None & info [] ~docv:"DIRECTORY" ~doc)
9
10let output_arg =
11 let doc = "Output file for registry (default: stdout)" in
12 Arg.(value & pos 1 (some string) None & info [] ~docv:"OUTPUT" ~doc)
13
14let recursive_arg =
15 let doc = "Scan directories recursively" in
16 Arg.(value & flag & info ["r"; "recursive"] ~doc)
17
18let algorithm_arg =
19 let algorithms = [("sha256", Toru.Hash.SHA256); ("sha1", Toru.Hash.SHA1); ("md5", Toru.Hash.MD5)] in
20 let doc = "Hash algorithm to use: sha256, sha1, or md5" in
21 Arg.(value & opt (enum algorithms) Toru.Hash.SHA256 & info ["a"; "algorithm"] ~docv:"ALGO" ~doc)
22
23let progress_arg =
24 let doc = "Show progress during scanning" in
25 Arg.(value & flag & info ["p"; "progress"] ~doc)
26
27(* Main function *)
28let make_registry_main env sw directory output recursive algorithm show_progress () =
29 try
30 let dir_path = env#fs |> Eio.Path.(fun fs -> fs / directory) in
31
32 let options = {
33 Toru.Make_registry.recursive;
34 follow_symlinks = false;
35 hash_algorithm = algorithm;
36 exclude_patterns = [];
37 include_hidden = false;
38 } in
39
40 if show_progress then Printf.eprintf "Scanning directory %s...\n" directory;
41
42 let registry = Toru.Make_registry.scan_directory ~sw ~env ~options dir_path in
43 let entries = Toru.Registry.entries registry in
44
45 if show_progress then Printf.eprintf "Found %d files\n" (List.length entries);
46
47 (* Generate output *)
48 let header = Printf.sprintf "# Generated by toru-make-registry on %s\n# Algorithm: %s\n"
49 (Ptime.to_rfc3339 (Ptime_clock.now ()))
50 (Toru.Hash.algorithm_to_string algorithm)
51 in
52 let entries_str = String.concat "\n" (List.map (fun entry ->
53 let filename = Toru.Registry.filename entry in
54 let hash = Toru.Registry.hash entry in
55 Printf.sprintf "%s %s" filename (Toru.Hash.value hash)
56 ) entries) in
57 let content = header ^ entries_str ^ "\n" in
58
59 (* Output *)
60 (match output with
61 | Some filename ->
62 let oc = open_out filename in
63 output_string oc content;
64 close_out oc;
65 Printf.printf "Registry written to %s\n" filename
66 | None ->
67 print_string content);
68
69 ()
70 with
71 | exn ->
72 Printf.eprintf "Error: %s\n" (Printexc.to_string exn);
73 exit 1
74
75(* Command definition *)
76let cmd eio_env sw =
77 let doc = "Generate Pooch-compatible registry files from directories (simple version)" in
78 let info = Cmd.info "toru-make-registry-simple" ~version:"1.0" ~doc in
79
80 Cmd.v info Term.(const (make_registry_main eio_env sw)
81 $ directory_arg $ output_arg $ recursive_arg
82 $ algorithm_arg $ progress_arg $ const ())
83
84let () =
85 Eio_main.run @@ fun env ->
86 Eio.Switch.run @@ fun sw ->
87 exit (Cmd.eval (cmd env sw))