My agentic slop goes here. Not intended for anyone else!
at main 3.1 kB view raw
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))