diff --git a/cli/dune b/cli/dune index f903e2b..04b1ced 100644 --- a/cli/dune +++ b/cli/dune @@ -1,5 +1,5 @@ (executable (name txt) (public_name txt) - (modules txt authors convert conversion file index last listing new topics html atom gemini publish pull read) + (modules txt authors convert conversion file index last listing new topics html atom gemini publish pull read recent) (libraries text_parse.converter text_parse.parsers logarion msgpck curl str cmdliner)) diff --git a/cli/last.ml b/cli/last.ml index 4695354..e766589 100644 --- a/cli/last.ml +++ b/cli/last.ml @@ -1,24 +1,28 @@ open Logarion + +let last a ((t,_) as pair) = match a with + | None -> Some pair + | Some (t', _) as pair' -> + if Text.newest t t' > 0 then Some pair else pair' + +let last_mine a ((t, _) as pair) = + let name = Person.Set.of_string (Sys.getenv "USER") in + let open Text in + match a with + | None -> if Person.Set.subset name t.authors then Some pair else None + | Some (t', _) as pair' -> + if Text.newest t t' > 0 && Person.Set.subset name t'.authors + then Some pair else pair' + let last search_mine = - let last a ((t,_) as pair) = match a with None -> Some pair - | Some (t', _) as pair' -> if Text.newest t t' > 0 - then Some pair else pair' in - let last_mine a ((t,_) as pair) = - let name = Person.Set.of_string (Sys.getenv "USER") in - let open Text in - match a with - | None -> if Person.Set.subset name t.authors then Some pair else None - | Some (t', _) as pair' -> - if Text.newest t t' > 0 && Person.Set.subset name t'.authors - then Some pair else pair' - in - match File_store.fold (if search_mine then last_mine else last) None with - | Some (_,f) -> List.iter print_endline f | None -> () + let filter = if search_mine then last_mine else last in + match File_store.fold filter None with + | None -> () + | Some (_, f) -> List.iter print_endline f open Cmdliner let term = - let mine = Arg.(value & flag & info ["mine"] - ~doc:"last text authored by me") in + let mine = Arg.(value & flag & info ["mine"] ~doc:"last text authored by me") in Term.(const last $ mine), Term.info "last" ~doc:"most recent text" ~man:[ `S "DESCRIPTION"; `P "Print the filename of most recent text" ] diff --git a/cli/recent.ml b/cli/recent.ml new file mode 100644 index 0000000..4522c6a --- /dev/null +++ b/cli/recent.ml @@ -0,0 +1,19 @@ +open Logarion +module FS = File_store +module A = Archive + +open Cmdliner +let term = + let recurse = Arg.(value & flag & info ["R"] ~doc:"recurse, include subdirs") in + let reverse = Arg.(value & flag & info ["r"] ~doc:"reverse order") in + let paths = Arg.(value & flag & info ["p"] ~doc:"show file paths") in + let number = Arg.(value & opt (some int) (Some 10) & info ["n"] + ~docv:"number" ~doc:"number of entries to list") in + let authed = Arg.(value & opt (some string) None & info ["authored"] + ~docv:"comma-separated names" ~doc:"texts by authors") in + let topics = Arg.(value & opt (some string) None & info ["topics"] + ~docv:"comma-separated topics" ~doc:"texts with topics") in + Term.(const Listing.listing $ recurse $ (const true) $ reverse $ number $ paths $ authed $ topics), + Term.info "recent" ~doc:"list recent texts" ~man:[ `S "DESCRIPTION"; + `P "List header information of most recent texts. If -R is used, list header + information for texts found in subdirectories too, along with their filepaths" ] diff --git a/cli/txt.ml b/cli/txt.ml index ce03ca0..4268cf5 100644 --- a/cli/txt.ml +++ b/cli/txt.ml @@ -17,5 +17,6 @@ let () = match Term.eval_choice default_cmd [ Publish.term; Pull.term; Read.term; + Recent.term; Topics.term; ] with `Error _ -> exit 1 | _ -> exit 0